08/09/2023 - By65Franco ha scritto:
07/09/2023 - ombry ha scritto:
Ovviamente mi va in errore quando raggiungo l'EOF
Scusate, ma sono parecchio arrugginita....
Ciao,
dopo che hai valutato quanto sottolineato da @Alex….
se effettivamente hai più records da ciclare, ma non conoscendo l'origine dati è difficile da valutare, un esempio potrebbe essere il seguente:
- scorrere tutti i records del recordset fino a end of file
- selezionare solo i records da processare se <> da seq
Esempio:
' read records
Do While Not rs1.EOF
' select type seq
If rs1.Fields("DBLIVE") <> seq Then
costo = costo + rs1.Fields("MAT") + rs1.Fields("MAC") + rs1.Fields("LAVE")
Perctot = Perctot + rs1.Fields("PMAT") + rs1.Fields("PMAC") + rs1.Fields("PLAVE")
End If
' next record
rs1.MoveNext
Loop
Ma se il recordset proviene da una select sql string, in essa potresti mettere la condizione Where Condition per filtrare solo i records che ti interessa leggere… per esempio:
Select ... From ... Where rs1.Fields("DBLIVE") <> seq;
e a questo punto il ciclo di lettura dei records che sarà anche più performante, si riduce in:
' read records
Do While Not rs1.EOF
costo = costo + rs1.Fields("MAT") + rs1.Fields("MAC") + rs1.Fields("LAVE")
Perctot = Perctot + rs1.Fields("PMAT") + rs1.Fields("PMAC") + rs1.Fields("PLAVE")
' next record
rs1.MoveNext
Loop
Se invece hai solo un record da processare allora non ti serve un ciclo di lettura ma solo un semplice test…
- verifica se il recordset non si trova a fine file (Not .Eof)
- verifica se è soddisfatta la condizione DBLIVE <> seq
Per esempio:
If Not rs1.EOF And rs1.Fields("DBLIVE") <> seq Then
costo = costo + rs1.Fields("MAT") + rs1.Fields("MAC") + rs1.Fields("LAVE")
Perctot = Perctot + rs1.Fields("PMAT") + rs1.Fields("PMAC") + rs1.Fields("PLAVE")
End If
Ma ripeto, è solo un ipotesi in quanto non conosco l'origine records che stai utilizzando.
;-))
Temo che nessuna di queste soluzioni possa andare bene,
Vediamo se riesco a spiegarmi meglio.
la prima tabella è tblimport, la seconda è tbloutput. Entrambe sono tabelle locali
La prima tabella contiene delle distinte basi, dove troviamo righe ordinate a priori con i campi id riga, sequenza, livello, padre, figlio, cdter, cmat.
La riga che identifica il codice padre è quella con idriga=0 (in questo caso in figlio ci sarà sempre il codice del padre), le righe successive sono i vari livelli di distinta (immaginate un grafico ad albero), dove il codice padre sarò sempre lo stesso, e ilcodice figlio cambierà di riga in riga).
Ciò che voglio ottenere io è una tabella che segue esattamente la stessa struttura, che scrive un record nella tabella output con gli stessi dati della tabella input, ad eccezione del caso in cui, a qualsiasi livello di distinta, incontra una riga in tblinput con campo cdter = ‘603320’ (memorizzo il campo sequenza in seq).
In quest'ultimo caso in tbloutput ci va esattamente la riga corrente, ma per le righe successive della tabella input deve sommare il campo cmat ed aggiornare il record corrente della tabella output con l'incremento di cmat. Questo fino a che in tblinput il campo sequenza resta diverso da seq.
tblinput
idriga | sequenza | padre | figlio | cdter | cmat |
0 | 0 | padre1 | padre1 | 603320 | 3 |
1 | 1 | padre1 | figlioA | | 2 |
2 | 2 | padre1 | figlioB | | 1 |
3 | 2 | padre1 | figlioC | | 3 |
4 | 1 | padre1 | figlioD | | 2 |
0 | 0 | padre2 | padre2 | | 1 |
1 | 1 | padre2 | figlioA | | 3 |
2 | 1 | padre2 | figlioB | 603320 | 4 |
3 | 2 | padre2 | figlioC | | 3 |
4 | 3 | padre2 | figlioD | | 1 |
5 | 1 | padre2 | figlioE | | 1 |
6 | 1 | padre2 | figlioF | | 2 |
tbloutput
0 | 0 | padre1 | padre1 | 603320 | 11 |
| | | | | |
0 | 0 | padre2 | padre2 | | 1 |
1 | 1 | padre2 | figlioA | | 3 |
2 | 1 | padre2 | figlioB | 603320 | 8 |
5 | 1 | padre2 | figlioE | | 1 |
6 | 1 | padre2 | figlioF | | 2 |
questo il codice impostato…..che non sarà sicuramente corretto…….mi va in errore nella parte evidenziata quando raggiungo EOF
Private Sub Comando2_Click()
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim seq As Integer
Dim costo As Double
Set rs1 = CurrentDb.OpenRecordset("DBASEInput", dbOpenTable)
Set rs2 = CurrentDb.OpenRecordset("DBASEOutput", dbOpenTable)
rs1.MoveFirst
Do While Not rs1.EOF
If rs1.Fields("cdter") = "603320" Then
seq = rs1.Fields("SEQUENZA")
rs2.AddNew
costo = 0
Perctot = 0
rs2.Fields("DBRIGA") = rs1.Fields("DBRIGA")
rs2.Fields("DBLIVE") = rs1.Fields("SEQUENZA")
rs2.Fields("PADRE") = rs1.Fields("PADRE")
rs2.Fields("FIGLIO") = rs1.Fields("FIGLIO")
rs2.Fields("CDTER") = rs1.Fields("CDTER")
rs2.Fields("MAT") = costo
Do
costo = costo + rs1.Fields("MAT")
rs1.MoveNext
Loop While rs1.Fields("SEQUENZA") <> seq
rs2.Fields("MAT") = costo
Else
rs2.AddNew
rs2.Fields("DBRIGA") = rs1.Fields("DBRIGA")
rs2.Fields("SEQUENZA") = rs1.Fields("SEQUENZA")
rs2.Fields("PADRE") = rs1.Fields("PADRE")
rs2.Fields("FIGLIO") = rs1.Fields("FIGLIO")
rs2.Fields("CDTER") = rs1.Fields("CDTER")
rs2.Fields("MAT") = rs1.Fields("MAT")
rs1.MoveNext
End If
rs2.Update
If rs1.EOF = False Then
If rs1.Fields("SEQUENZA") <> 0 Then
rs1.MoveNext
End If
End If
Loop
End Sub
Spero che possiate darmi una mano….sono giorni che ci giro attorno.