Newsgroup: it.comp.lang.visual-basic
Titolo: strategie risolutive (sono quasi all'esaurimento....)

ammettiamo di avere due tabelle (access) relazionate molti-a-molti con le
relative chiavi primarie. partendo da un record di una delle due tabelle
devo selezionare ( = copiare in un altro db) tutti i record ad esso
collegati (tramite campi che non sono parte della chiave primaria). in
pratica dovrei effettuare una query nella seconda tabella, e per ogni record
trovato ripetere la query di selezione di nuovo nella prima tabella, e poi
ancora nella seconda e così via fino a non ottenere più alcun record
restituito (avendo ovviamente l'accortezza di non includere nella ricerca i
record già considerati). fin qui abbastanza bene, anche se macchinoso.
il mio problema è che.... ho *sei* tabelle a due a due connesse e partendo
da un record di una (non è vincolante da quale partire, poichè non esiste
una vera e propria gerarchia) devo rintracciare *tutti* i record nelle sei
tabelle che hanno relazione con il primo. salta subito all'occhio che la
mole di lavoro se effettuata con il principio sopraespposto è enorme....
pensavo a due soluzioni ma non mi convincono molto. gradirei suggerimenti o
consigli, poichè è da parecchio che ci lavoro sopra e a breve devo
completare il lavoro, in una maniera o nell'altra!
1) usare un metodo ricorsivo impostando come condizione d'uscita i record
già visitati. il problema è che non so come organizzare la ricorsione,
essendo sei le tabelle da scandire e per ogni record ritrovato l'operazione
deve ripartire praticamente da capo, escludendo come già detto i record già
visitati.
2) scandire tabella per tabella (verticalmente per intenderci) e avanzare
con una tabella alla volta. qui il problema è tenere traccia di dove sono
arrivato, poichè completata una tabella, se trovo un nuovo record che si
collega con un altro in quella devo ripetere la ricerca....  arghhhh!!!!
non ne vengo fuori..... :-((((
potete aiutarmi ?
grazie infinite!!!
marco

 relative chiavi primarie.
fammi capire: hai creato una relazione molti-a-molti tra due tabelle?
forse e' piu' chiaro se descrivi la struttura dei dati, perche'
la descrizione che hai dato non e' sufficente.
stand-by
R

 la descrizione che hai dato non e' sufficente.
si, scusa sono stato poco chiaro. riporto solo i campi necessari:
(i campi con l'asterisco sono i campi chiave, ovvero utilizzati assieme
rendono univoco il record)
TABELLA A
*IDCliente
*NumA
*DataA
TABELLA B
*NumB
*DataB
IDCliente
NumA
DataA
ecco, bastano queste due per capire il discorso. Allora: parto da A,
scandisco ogni record e per ognuno effettuo una query in B usando come campi
di ricerca i tre riportati (la chiave insomma, gli altri campi non sono
necessari) e la query mi restituisce tutte le righe di B riferite al record
di A esaminato. Ora però devo selezionare in B tutte le righe che hanno come
NumB e DataB i valori di ogni record trovato dalla prima query, e per ognuno
di essi ancora ritornare in A per cercare eventuali altri clienti collegati
e così via, fino a quando ho percorso tutte le strade possibili. Mi rendo
conto che faccio fatica a spiegarmi.... ma non è così semplice a parole!
ecco, il problema è questo!
se riuscissi a trovare un algoritmo efficiente..... anche perchè le tabelle
come dicevo non sono solo due, ma sei! e devo "navigare" in tutte quante con
lo stesso principio.
in senso figurato è come se dal primo record buttassi dell'acqua nelle
tubature e devo visitare tutti i percorsi possibili.... purtroppo chi ha
progettato il db non sapeva (?) che un giorno o l'altro lui o qualcun altro
(io...) avrebbe dovuto fare sta procedura.......
grazie e scusate la lunghezza!
Marco


[cut]
vediamo se ho capito:
A(IDCliente,NumA,DataA) -> B1(IDCliente,NumA,DataA) 1..N
B1(NumB,DataB) -> B2(NumB,DataB) 1..N (?)
B2(IDCliente,NumA,DataA) -> A(IDCliente,NumA,DataA) 1..1
...
ho qualche dubbio, puoi provare a chiarirmi
il percorso da fare con un esempio?
mi sembra una gerarchia multilivello, e il problema e' che
vorresti eploderla tutta ma non sai quali sono
i record di partenza, giusto?
stand-by
R

 i record di partenza, giusto?
più che gerarchica (anche se non sono molto esperto in questo campo e potrei
dare definizioni sbagliate) mi sembra si una struttura multilivello ma senza
una tabella di "partenza". potrei iniziare da qualunque tabella del mio db e
seguendo lo stesso principio arrivo allo stesso risultato... con gli stessi
problemi!
per comodità ho assunto il record di partenza ogni record della tabella A ma
funzionerebbe anche partendo da B.
per capirMi ho immaginato di prendere in mano fisicamente un record di A e
sollevandolo devono restargli attaccati tutti i record di A e di B ad esso
collegati (tramite appunto le query di cui sopra). quello che mi sfugge è
capire quante volte e come impostare le query ( = se c'è un metodo più
efficiente di quello di andare avanti e indietro....) !
per fare un esempio grafico, sperando che si veda bene in ASCII sennò metto
su un sito un'immagine:
(ps. ovviamente i numeri dei record sono esempi, non sono certo
progressivi!)
A                          B
record1-----|-->record1
record2        |-->record2
record3<-----------|
   |------------->record3
ecco, se io considero il record1 di A e cerco in B troverò ad esempio le
righe 1 e 2. se adesso per ogni riga trovata faccio una query di ritorno di
A scopro che la riga due è collegata anche al record3 di A ma prima *non*
potevo accorgermene (una specie di senso unico) come ancora non mi posso
accorgere che anche il record3 di A è collegato con il record3 di B finchè
non ripeto la query su B.... e via dicendo finchè ho esaminato tutte le
strade possibili. a un certo punto è chiaro che le query non mi
restituiranno più righe valide (nel senso che quelle già visitate le scarto)
e quindi ho terminato l'esplorazione.
[in realtà esiste anche un'altra complicazione fortunatamente (?) solo in
una coppia di tabelle, che mi costringe a rieseguire su B la query con i
risultati ottenuti perchè potrebbero esserci altre righe con lo stesso
identificativo ma riferite a clienti diversi e quindi non "visibili" durante
la prima query, ma questa è la cosa meno complicata.]
grazie per la disponibilità e la pazienza!!!!
:-)
Marco

 più record.
urca ... quindi non usi mai la chiave primaria in questa ricerca?
stento a capire di che struttura si tratta.
puoi fare un bel disegnino e postarmelo in privato?
basta che togli (nospam) dall'indirizzo
stand-by
R

 stand-by
fatto!
spero ti sia arrivata, chè ultimamente il server di posta mi fa casini......
grazie!
Marco

 spero ti sia arrivata, chè ultimamente il server di posta mi fa
casini......
ricevuto tutto, ma sono un po' incasinato e lo analizzero' domani.
bye
R