Newsgroup: it.comp.lang.visual-basic
Titolo: ...mmmh... come lo "ciclo" questo?

Dovrei "ciclare" una parte di un recordset che soddisfa certe condizioni.
Il codice che ho provato è questo:
'INIZIO CODICE
cn2.Open....
 rs2.Open...
 rs3.Open...
While rs2.EOF = False
If rs2("fsnome").Value = rs("FsnC").Value And rs2("gi").Value =
rs("gio").Value And rs3"fsnome3").Value = rs("FsnF").Value Then
'QUESTO E' LA PARTE CHE VORREI CICLARE PER n=TOT
Open "Risultati" & rs("gio").Value & ".tab" For Append As #1
Print #1, ...
rs2.MoveNext
rs3.MoveNext
Close #1
'FINE DELLA PARTE DA CICLARE
Else
rs2.MoveNext
rs3.MoveNext
End If
Wend
rs3.Close
rs2.Close
cn2.Close
Ho provato con
For i = o To 10
i = i + 1
Open "Risultati" & rs("gio").Value & ".tab" For Append As #1
Print #1 rs2("valore").value & rs3("valore2").value
rs2.MoveNext
rs3.MoveNext
Close #1
Next
Else...
Ma niente, mi cicla sempre i valori  [rs2("valore").value &
rs3("valore2").value] fino alla fine del di rs2.
Ho provato con un ciclo do while, ma mi va in loop.
Mmmh... so che sto sbagliando nel posizione le istruzioni di inizio e fine
ciclo (for next o do while che sia...) ma ora mi sto chiedendo se in realtà
è fattibile quello che cerco.
Grazie per ogni aiuto.

 
di niente, se la mia interpretazione non e' corretta non mi devi nulla
bye
r
PS: altrimenti versi 5 Euro ad una associazione a tua scelta!

Grazie per la risposta... vedo di spiegarmi meglio.
La parte che ho descritto come "da ciclare" dovrebbe essere ripetuta per N
volte (dove N č una variabile definita a monte del problema) se la
condizione If č verificata.
Spero d'essere stato piů chiaro ora.
Ho guardato la tua soluzione ma non risolve il mio problema (forse perchč
come dicevi tu, non mi sono spiegato bene precedentemente)
Grazie comunque.
< PS: altrimenti versi 5 Euro ad una associazione a tua scelta!
Questa č carina ;-)

 
fammi capire:
[ ]devi scorrere N record dopo che si e' verificata la condizione
[ ]devi trovare N record che verificano la condizione
[ ]altro:........................................................
saluti
+1 Euro

 +1 Euro
Qui il conto comincia a salire... :-)

 +1 Euro
Qui il conto comincia  a salire :-)

>saluti


 '---------------------------------------------------
Se tolgo l'exit do non cicla da 1 ad N ma cicla tutto il recordset.
Con l'exit do è tutto ok.
Comunque grazie.

 
PS: non sei un programmatore di professione, vero?

 PS: non sei un programmatore di professione, vero?
Ma ti pare... ;-) è solo un hobby che ho iniziato la settimana scorsa...
Grazie di nuovo.

       For I=1 To N
 [cut]
 Se i due recordset non hanno la stessa lunghezza N, ovviamente mi
 viene restituito un errore.
 E' possibile ovviare a questo e cioč procedere nell'elaborare il
 recordset piů lungo?

 condizioni. Il codice che ho provato è questo:
BUTTA VIA TUTTO!
cosa devi ottenere ? un file?
se devi ottenere un file allora qualcosa devi scrivere
se invece ti accontenti di avere una tabella non devi scrivere che poche
righe
cn2.open
rs.open (sql)
sql?...ammazza si!
da quello che ho capito...vuoi estrarre da 3 tabelle i dati (che vuoi tu) al
verificarsi della condizione
fsnome=FsnC
gi =gio
fsnome3 = FsnF
se sei il solito di qualche post fa ...la indicazione di usare sql ti era
gia stata data!
Non sai nemmeno da che parte iniziare?
San google "SQL tutorial" trovi mille guide per iniziare!
LE prove come le faccio?
ACCESS....
Query....mettici le 3 tabelle...e sperimenta
Ti vorrei far notare che l'IMMANE fatica che hai fatto è risolvibile con UNA
(dico UNA)
query di selezione...molto più pulita e facile da manutenere del quintale di
codice che hai scritto!!!

  recordset piů lungo?
si e' possibile, pero' mi sembra che la struttura dei dati sia
un po strana, per quel poco che si intuisce ovviamente.
non puoi essere piu' chiaro su quello che vuoi fare?
eventualmente, puoi modificare la struttura del db?
bye
r

 3giolo wrote:
e perchč?
??????????

3giolo wrote:
http://wodka40.altervista.org/mytest/giolo.htm

 Query....mettici le 3 tabelle...e sperimenta
Sto proprio facendo cosě. Grazie dell'aiuto ;-)

 quintale di codice che hai scritto!!!
Allora, sperimentando con le query sono d'accordo che ci sarei riuscito
ma... ho trovato questo ostacolo al quale non ho trovato risposta ne su san
google ne altrove.
Il problema era il seguente:
tabella1
2 campi: id e elenco
id - elenco
1  - 110%321%411%9
2 -  321%200%132%234
tabella2
2 campi: idcod e nome
idcod - nome
9     - Marco
110 - Paolo
132 - Antonio
200 - Giovanni
234 - Maria
321 - Alberto
411 - Pierpaolo.
Il risultato doveva essera una tabella3 con 2 campi (id e NomedeCodificati)
così strutturata:
id NomedeCodificati
1 - Paolo
1 - Alberto
1 - PierPaolo
1 - Marco
2 - Alberto
2 - Giovanni
2 - Antonio
2 - Maria
Ho certato di essere il più chiaro possibile, spero d'essermi spiegato.
Praticamente devo decodificare i codici contenuti in tabella1.elenco con in
nomi di tabella2.nomi il problema sta nel fatto che i codici di
tabella1.elenco sono tutti inseriti in una stessa cella, separati da un %.
Io, non trovando una query adatta, ho letto la tabella, splittato la stringa
e ripopolato una tabella con il contenuto della stringa splittata. Ed ecco
il tutto.
Grazie dell'aiuto e della chiara pagina html che hai fatto.

 2 -  321%200%132%234
questa tabella e' strutturata nel modo sbagliato, te nei sei gia' reso 
conto da solo.
a questo punto se puoi modificare la struttura devi trasformare il campo
elenco in un valore singolo su piu record.
se non puoi toccare la struttura di tabella1 crei una tabella temporanea
cosi':
id   campo
1    110
1    321
1    411
1    9
2    321
2    200
2    132
2    234
e dopo fai la query
bye
r

 e dopo fai la query
Ed č esattamente quello che ho fatto ed il motivo per cui mi ritrovo a
manovrare diverse tabelle anzichč un'unica query.
Grazie

 
e qui non ti capisco, secondo me dovresti fare cosi:
1) fai un ciclo sulla tabella1 e ti crei *tutti* i record
    della tabella temporanea,
2) fai una select con:
    SELECT tab2.*, tab.*
    FROM tab2 INNER JOIN tab3 ON tab2.Campo = tab3.Campo
in questo modo ti togli un po di problemi e velocizzi il tutto
bye
r

     FROM tab2 INNER JOIN tab3 ON tab2.Campo = tab3.Campo
Il problema di base è nel codice che ho postato all'inizio e che qui riporto
in parte...
While rs2.EOF = False
If rs2("fsnome").Value = rs("FsnC").Value And rs2("gi").Value =
rs("gio").Value And rs(3"fsnome3").Value = rs("FsnF").Value Then
[cut]
Print #1, Chr(9) rs2("fsnome").Value Chr(9) & rs3("fsnome3").Value
[cut]
Come vedi, devo stampare il contenuto di rs2("fsnome").Value al fianco di
rs3("fsnome3").Value ma potrei avere il caso in cui rs2("fsnome").Value
abbia, ad esempio, 5 valori mentre rs3("fsnome3").Value ne abbia 7 che
soddisfino la condizione if iniziale.
Questo è l'ultimo problema che mi è rimasto da superare.

 
vediamo se adesso ho capito:
in una tabella 'rs' tu hai *DUE* campi che contengono
un elenco di codici, tipo:
id	elenco1		elenco2
1	110%120%300	135%350
2	120%300%410	220%350%700%815
giusto?
a questo punto dovresti ottenere questo:
id	campo1	campo2
1	110	135
1	120	350
1	300	null
2	120	220
2	300	350
2	410	700
2	null	815
e cosi'?
bye
r

 e cosi'?
Si è così.
Però, diciamo che molto brutalmente ho risolto quel passaggio e per adesso
mi accontento.
Ora il problema, come ti dicevo è questo:
Riporto parte del codice...
While rs2.EOF = False
If rs2("fsnome").Value = rs("FsnC").Value And rs2("gi").Value =
rs("gio").Value And rs(3"fsnome3").Value = rs("FsnF").Value Then
[cut]
Print #1, Chr(9) rs2("fsnome").Value Chr(9) & rs3("fsnome3").Value
[cut]
Devo stampare il contenuto di rs2("fsnome").Value al fianco di
rs3("fsnome3").Value ma potrei avere il caso in cui rs2("fsnome").Value
abbia, ad esempio, 5 record mentre rs3("fsnome3").Value ne abbia 7 che
soddisfino la condizione if iniziale e quindi la procedura non va a buon
fine perchè rs2 ha meno record di rs3.
Questo è l'ultimo problema che mi è rimasto da superare.
Sto cercando di ovviare a questo creando dei record vuoti in rs2 per quanti
sono i record di differenza col rs3.
Grazie

 
tu continui a mostrare la tua soluzione e non il problema!
se quello che ti ho detto prima e giusto, quello che devi
fare e' praticamente questo:
Ele1=Split(elenco1,"%")
Ele2=Split(elenco2,"%")
I=0
Do
    IF I <= UBOUND(Ele1) Then
	campo1="'"+Ele1(I)+"'"
    Else
	campo1="Null"
    End If
    IF I <= UBOUND(Ele2) Then
	campo2="'"+Ele2(I)+"'"
    Else
	campo2="Null"
    End If
    cn.Execute "INSERT TabTemp (id,Campo1,Campo2) " & _
               "VALUES ("+Cstr(id)+","+campo1+","+campo2+")"
    I = I + 1
Loop Until (I > UBOUND(Ele1)) And (I > UBOUND(Ele2))
A questo punto fai una query con due join e fine
se questa soluzione non e' ancora quella giusta, o esponi piu' 
chiaramente quello che e' *il problema* o ... di piu' nin zo!
bye
r

 A questo punto fai una query con due join e fine
Questo va bene, grazie è più o meno quello che ho già fatto.
Tutto ok, fin qui ho splittato ripopolato le tabelle ed ok.
Questo problema l'ho "superato".
Ora mi manca solo l'altro problema da risolvere e poi lascerò per sempre Vb,
access e compagnia bella a chi lo fa di mestiere. :-)
Riespongo il "nuovo" ed ultimo problema con cercando di essere più chiaro
possibile.
Ho 2 tabelle (lette con 2 recordset rs2 e rs3) con gli stessi campi:
tab1
id nome eta
1 Marta 31
2 Ugo    31
3 Maria  29
4 Giovanni 28
tab 2
id nome etabis
1 Piero 31
2 Giovanna   31
3 Marzia  31
4 Antonio 28
Ora la condizione if fa si che vengano "presi" dalle due tabelle, solo i
nomi di chi ha età uguale 31.
Come vedi nella tabella 1 ho solamente 2 record che soddisfano tale
requisito, mentre nella tab2 ho 3 record.
Questo crea un errore nel ciclo:
While rs2.EOF = False
If rs2("eta").Value = rs("FsnC").Value And rs2("gi").Value =
rs("gio").Value And rs(3"etabis").Value = rs("FsnF").Value Then
[cut]
Print #1, Chr(9) rs2("fsnome").Value Chr(9) & rs3("fsnome3").Value
[cut]
Devo solo risolvere questo.
Spero d'essere stato un pò più chiaro.

 A questo punto fai una query con due join e fine
Questo va bene, grazie è più o meno quello che ho già fatto.
Tutto ok, fin qui ho splittato ripopolato le tabelle ed ok.
Questo problema l'ho "superato".
Ora mi manca solo l'altro problema da risolvere e poi lascerò per sempre Vb,
access e compagnia bella a chi lo fa di mestiere.
Riespongo il "nuovo" ed ultimo problema con cercando di essere più chiaro
possibile.
Ho 2 tabelle (lette con 2 recordset rs2 e rs3) con gli stessi campi:
tab1
id nome eta
1 Marta 31
2 Ugo    31
3 Maria  29
4 Giovanni 28
tab 2
id nome etabis
1 Piero 31
2 Giovanna   31
3 Marzia  31
4 Antonio 28
Ora la condizione if fa si che vengano "presi" dalle due tabelle, solo i
nomi di chi ha età uguale 31.
Come vedi nella tabella 1 ho solamente 2 record che soddisfano tale
requisito, mentre nella tab2 ho 3 record.
Questo crea un errore nel ciclo:
While rs2.EOF = False
If rs2("eta").Value = rs("FsnC").Value And rs2("gi").Value =
rs("gio").Value And rs("etabis").Value = rs("FsnF").Value Then
[cut]
Print #1, Chr(9) rs2("eta").Value Chr(9) & rs3("etabis").Value


 solo i nomi di chi ha età uguale 31.
Anziché usare due recordset distinti non potresti usarne uno solo
aprendolo con una UNION SELECT? Esempio:
set rs2 = db.OpenRecordset( _
   "SELECT nome, 1 as t FROM [tab 1] WHERE eta = 31; " & _
   "UNION SELECT nome, 2 as t FORM [tab 2] WHERE etabis = 31 ORDER BY nome;"
NOTA: il campo t l'ho aggiunto (solo se ti serve) per sapere da quale delle
due tabelle arrivano i dati.
In alternativa, se vuoi scriverli in parallelo (uno della tabella 1 ed uno
della tabella 2) li apri comunque con due OpenRecordset distinte, ma
sempre con una SELECT .... WHERE eta = 31 (o il valore che ti serve) in
modo da non dover fare confronti con IF arzigogolate...
P.S.: lo so di non avere risposto alla tua domanda, ma forse la tua domanda
presupponeva una complicazione non necessaria. Spero almeno fosse così.
Ciao.
Mauro

 in modo da non dover fare confronti con IF arzigogolate...
Cerco di spiegare ulteriormente...
Quello che hof atto era un esempio. in realtà devo stampare tante tabelle
per quante sono le età, quindi non posso mettere una condizione where
all'inizio, devo ciclare tutto il recordset e raggruppare per età, ma
siccome ho il problema, delle quantità di recordset che rispondono allo
stesso criterio ecco che mi sono bloccato.
Se hai una qualsiasi soluzione...
grazie. Ciao

 Se hai una qualsiasi soluzione...
Stavolta aspetto le indicazioni... :-)))
Ciao.
Mauro

 Stavolta aspetto le indicazioni... :-)))
Spero d'essermi spiegato altrimenti ti passo tutta la porcheria di codice
che ho scritto a fatica fin'ora...
grazie

 età nome - età nome
OK.... allora prima di tutto l'errore iniziale è che nella condizione
della WHILE hai messo uno solo degli rs.EOF, quindi era fatale che non
controllase dob'era finito con l'altro recordset. Prova così:
' la variabile iEta deve contenere -di volta in volta- le età
' prese dall'altra tabella, di cui non mi parli
set rs2 = db.OpenRecordset ( _
    "SELECT nome FROM [tab 1] WHERE eta = " & CStr (iEta))
set rs3 = db.OpenRecordset ( _
    "SELECT nome FROM [tab 3] WHERE etabis = " & CStr (iEta))
While Not (rs2.EOF And rs3.EOF)
    If rs2.EOF then
        Print #1, vbTab & " " & vbTab & rs3("nome")
        rs3.MoveNext
    ElseIf rs3.EOF then
        Print #1, vbTab & rs2("nome") & vbTab & " "
        rs2.MoveNext
    Else
        Print #1, vbTab & rs2("nome") & vbTab & rs3("nome")
        rs2.MoveNext
        rs3.MoveNext
    Endif
Wend
rs2.Close
rs3.Close
... ripetendo tutto questo all'interno del ciclo che (ovviamante)
farai sulla "altra tabella" da cui estrai le età.
Ciao.
Mauro

Guarda...  non sono riuscito a risolvere...
ti linko una pagina con il codice preciso senza esempio o altro...
se ti va di dargli un'occhiata...
http://web.tiscali.it/puz7.40/cod.htm
grazie

 
http://web.tiscali.it/puz7.40/cod.htm
Allora... ripeto quello che ti ho già detto... finché stampi
i titolari (che sono SEMPRE 11 per squadra) puoi permetterti
di controllare solo l'EOF di rs2, perché andando avanti di
un record per volta su ENTRAMBI i recordset finiscono insieme.
Ma le riserve no... possono essere tante uguale (se ti va di
culo), oppure più in rs2 oppure di più in rs3... e quindi devi
controllare gli EOF di ENTRAMBE e SEPARATAMENTE.
Quindi la conzizione WHILE che hai usato non può essere (come
per i titolari) "NOT rs2.EOF", ma devi usare un OR delle due:
"NOT (rs2.EOF OR rs3.EOF)".
Non solo... dentro la WHILE una delle due finirà (genericamente)
prima dell'altra, per cui devi scrivere:
IF rs2.EOF THEN
    ' cose da fare a rs2 finito, che debbono riguardare SOLO rs3
    rs3.MoveNext
ELSEIF rs3.EOF THEN
    ' cose da fare a rs3 finito, che debbono riguardare SOLO rs2
    rs2.MoveNext
ELSE
    ' cose da fare quando sono ancora entrambi attivi
    rs2.MoveNext
    rs3.MoveNext
ENDIF
In questo modo NON fai la MoveNext su recordset già esauriti (che
guardacaso era quello che ti dava errore).
Ciao.
Mauro

 prima dell'altra, per cui devi scrivere:
Avevo capito anche questo, ma ho provato e non sono riuscito, al link di cui
sopra ti metto il codice che ho provato con i cicli while che tu hai
suggerito.
Ora non mi da errore ma l'output non tiene conto della lunghezza maggiore di
uno dei 2 recordeset e si ferma quando finisce il più corto.
http://web.tiscali.it/puz7.40/cod.htm

 guardacaso era quello che ti dava errore).
Credo d'aver capito qualcosina in pių ;-)
Non č il recordesaurito che mi da errore ma la condizione ci sto lavorando
su...
grazie per la collaborazione...

 guardacaso era quello che ti dava errore).
Mauro, ormai sei la mia unica speranza... ho corretto il ciclo while wend ed
in teoria dovrebbe funzionare, in realtą mi perdo un record quando si
verifica l'anomalia...
ti spiego tutti qui
http://web.tiscali.it/puz7.40/cod.htm
Grazie dell'aiuto.

 corto.
Correggi quanto sopra ed andrà a posto...
Ciao.
Mauro

3giolo wrote:
sei senza speranza.....
da quello che dici e provando a seguire l'ordine dei tuoi post:
a) NON sai cosa vuoi
b) Quello che sai č confuso
c) Quello che sai ed č confuso...lo vuoi fare come ti pare a te e non come
andrebbe fatto!
Ti č stato detto....normalizza il tutto trattando tabelle...ci vuole un
attimo a convertire file di testo in tabelle...potresti addirittura se hai
access provare a fare direttamente un import!!!
poi applica uno o piů query sql....
ti ostini a ciclare il recordset facendo IF ( che emulano di fatto query sql
in maniera estremamente piů lenta)
ed allora?
se uno affoga e non prende il salvagente che fai?
arrangiati!
bah!