INTERCETTARE EOF

di il
11 risposte

INTERCETTARE EOF

Ciao

mi aiutate ad intercettare l'Eof in questo ciclo ?


Do
costo = costo + rs1.Fields("MAT") + rs1.Fields("MAC") + rs1.Fields("LAVE")
Perctot = Perctot + rs1.Fields("PMAT") + rs1.Fields("PMAC") + rs1.Fields("PLAVE")

rs1.MoveNext

Loop While rs1.Fields("DBLIVE") <> seq

Ovviamente mi va in errore quando raggiungo l'EOF
Scusate, ma sono parecchio arrugginita....

Grazie

11 Risposte

  • Re: INTERCETTARE EOF

    Hai già fatto una valutazione del fatto che non serve nessun LOOP per fare quello che mostri…?

  • Re: INTERCETTARE EOF

    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.

    ;-))

  • Re: INTERCETTARE EOF

    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

    idrigasequenzapadrefigliocdtercmat
    00padre1padre16033203
    11padre1figlioA 2
    22padre1figlioB 1
    32padre1figlioC 3
    41padre1figlioD 2
    00padre2padre2 1
    11padre2figlioA 3
    21padre2figlioB6033204
    32padre2figlioC 3
    43padre2figlioD 1
    51padre2figlioE 1
    61padre2figlioF 2

    tbloutput 

    00padre1padre160332011
          
    00padre2padre2 1
    11padre2figlioA 3
    21padre2figlioB6033208
    51padre2figlioE 1
    61padre2figlioF 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.

  • Re: INTERCETTARE EOF

    Usa DSUM, ripeto che non ha alcun senso quello che fai…!!!

    rs2.Fields("MAT") = DSUM("MAT","DBASEInput","cdter = 603320")

    Quello che fai sballa tutti i Pointer e poi non ti ci ritrovi più.

  • Re: INTERCETTARE EOF

    Il classico ciclo per scorrere un recordset, del tipo

    Do until rs1.eof

       …

       rs1.movenext

       loop

    l'hai provato?

  • Re: INTERCETTARE EOF

    08/09/2023 - @Alex ha scritto:


    Usa DSUM, ripeto che non ha alcun senso quello che fai…!!!

    rs2.Fields("MAT") = DSUM("MAT","DBASEInput","cdter = 603320")

    Quello che fai sballa tutti i Pointer e poi non ti ci ritrovi più.

     Esplicati, cos'e' che la Dsum sballerebbe?

  • Re: INTERCETTARE EOF

    Hai capito male… e forse non hai guardato bene il codice che ha postato…?

    Il ciclo che fa lui si basa su RS1 come Loop Esterno, se all'interno del ciclo interno su RS2 si rimette a Ciclare RS1 sicuramente fa della confusione, quindi suggerisco DSUM.

    Chiaro…?

  • Re: INTERCETTARE EOF

    08/09/2023 - @Alex ha scritto:


    Hai capito male… e forse non hai guardato bene il codice che ha postato…?

    Il ciclo che fa lui si basa su RS1 come Loop Esterno, se all'interno del ciclo interno su RS2 si rimette a Ciclare RS1 sicuramente fa della confusione, quindi suggerisco DSUM.

    Chiaro…?

    Ah adesso vedo, si hai ragione, non avevo fatto caso

  • Re: INTERCETTARE EOF

    08/09/2023 - @Alex ha scritto:


    Usa DSUM, ripeto che non ha alcun senso quello che fai…!!!

    rs2.Fields("MAT") = DSUM("MAT","DBASEInput","cdter = 603320")

    Quello che fai sballa tutti i Pointer e poi non ti ci ritrovi più.

    ciao

    il problema non è la somma che funziona perfettamente….

    Nel momento in cui all'interno del ciclo do trovo un record con cdter='603320' devo continuare a leggere i record successivi di rs1 (ecco percè un ulteriore ciclo)  sommando cmat fino a quando trovo un record il cui numero di sequenza è uguale a quello salvavto prima di entrare nel ciclo.  (non è detto che i record successivi abbiano cdter ='603320')

    E' all'interno di questo secondo cicli che mi va in errore se raggiungo l'EOF.

    Per assurdo se in rs1 aggiungessi un record “inutile”, il programma andrebbe cmq in errore , ma la tabellina di output ottenuta avrebbe tutti i record che mi aspetto di avere.

  • Re: INTERCETTARE EOF

    Ciao … non entro in merito a quanto giustamente sottolineato da @Alex per non ripetere le stesse cose, ma come da esempio fatto in precedenza se devi solo controllare l'EOF e una certa condizione che si deve verificare, allora ti basterebbe scrivere il codice così come lo hai esposto…

    08/09/2023 - ombry ha scritto:


    Nel momento in cui all'interno del ciclo do trovo un record con cdter='603320' devo continuare a leggere i record successivi di rs1 (ecco percè un ulteriore ciclo)  sommando cmat fino a quando trovo un record il cui numero di sequenza è uguale a quello salvavto prima di entrare nel ciclo.

    quindi lo traduci con :

    • fino a quando non mi trovo a fine file 
    • e se la sequenza è quella desiderata
    • allora esegui la somma 

    Tradotto in codice il controllo lo farai in questo modo:

            Do While rs1.Fields("SEQUENZA") <> seq And Not rs1.EOF
                costo = costo + rs1.Fields("MAT")
                rs1.MoveNext
            Loop
    

    Ripeto, non entro in merito alle altre questioni già trattate ma posso solo aggiungere che solo in un mondo perfetto potrebbe funzionare il ciclo complessivo che hai mostrato…. quindi fai attenzione e valuta attentamente… ;-)) 

  • Re: INTERCETTARE EOF

    Non aggiungo altro, ma il probelma è proprio di concetto e non può funzionare come hai fatto, se non al PRIMO...

    Ti lascio in ogni caso proseguire con la tua convinzione, se vera, significa che ti concentrerai su EOF e tutto funzionerà….

Devi accedere o registrarti per scrivere nel forum
11 risposte