Chiudere il ciclo con EOF

di il
4 risposte

Chiudere il ciclo con EOF

Salve A tutti ho creato un codice per individuare le assenze per malattia nella mia applicazione:
rsAdo1.Open "SELECT IdGenerale, [Cod Cliente], [Id Listino], Inquadramento, matricola, giorno, mese, anno, tipo_assenza, val_assenza " & _
"FROM CalendarioPresenze " & _
"WHERE (anno = " & TempVars!TempAnno & ") AND (Inquadramento = " & TempVars!TempInq & ") AND (IdGenerale = " & TempVars!AggIdGenerale & ")" & _
"ORDER BY IdGenerale, anno, mese, giorno", cnG
'Calcolo I Giorni di Malattia
Do Until rsAdo1.EOF = True
    'Se il Tipo di Assenza è uguale ad M o ad MA allora inizia la malattia
    If (rsAdo1!tipo_assenza = "M") Or (rsAdo1!tipo_assenza = "MA") Then
    IdGeneraleMalattia = rsAdo1!IdGenerale
    MatricolaMalattia = rsAdo1!matricola
    DataInizioMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
    DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
        For i = 1 To 370
            rsAdo1.MoveNext
            If (Left(rsAdo1!tipo_assenza, 1) = "M") Then
                DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
            Else
                Exit For
            End If
        Next
    rsAdo2.Close
    rsAdo3.Close
    End If
IdGeneraleMalattia = ""
MatricolaMalattia = ""
DataInizioMalattia = ""
DataFineMalattia = ""
    
'Vado Al Record Successivo
rsAdo1.MoveNext
Loop
rsAdo1.Close
fin qui tutto Ok, il problema mi sorge quando anche l' ultimo giorno del mese il dipendente è in malattia
in patrica mi da errore dicendo che il record è l' ultimo dell' recordset o è stato elimnato
infatti insersendo un debug print qui:
  For i = 1 To 370
            rsAdo1.MoveNext
            If (Left(rsAdo1!tipo_assenza, 1) = "M") Then
                DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
            	debug.print DataFineMalattia
            Else
                Exit For
            End If
        Next
mi stampa tutti i giorni di malattia fino al ultimo e poi non si ferma (giustamente dato che gli ho detto di farlo per 370 volte) e và in errore, allora ho pensato metto un if così:
  For i = 1 To 370
            rsAdo1.MoveNext
            If (Left(rsAdo1!tipo_assenza, 1) = "M") Then
                DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
            	If rsAdo1.EOF = True then
            		Exit For
            	End If 
            Else
                Exit For
            End If
        Next
Ma non fà quello che vorrei, come posso ad ovviare il problema?
dovrei dirgli se il record è ultimo del recorset dopo aver indeficato la data esci dal ciclo

4 Risposte

  • Re: Chiudere il ciclo con EOF

    E non puoi uscire dal ciclo se, appunto, sei arrivato all'ultimo giorno del mese? L'unico mese "difficile" è febbraio che ha il 28 o il 29, ma non più di tanto se fai l'anno modulo 4 (non credo che il tuo codice funzionerà fino al 2100...)
  • Re: Chiudere il ciclo con EOF

    Il tuo codice è strutturalmente anomalo... hai un Ciclo in cui incrementi il puntatore del RS, all'interno un'altro ciclo indipendente in cui lo incrementi ancora... perchè...?
    Non basta solo 1 Cilco...?

    Credo tu abbia qualche cosa da rivedere... anche i 2 RS non usati...
  • Re: Chiudere il ciclo con EOF

    Per rispondere a Weierstrass al 2100 spero di aver smesso di smanettare.

    per Alex in effetti il codice che ho messo non è completo ho messo solo la parte dove mi dava l' errore
    il codice completo è:
    rsAdo1.Open "SELECT IdGenerale, [Cod Cliente], [Id Listino], Inquadramento, matricola, giorno, mese, anno, tipo_assenza, val_assenza " & _
    "FROM CalendarioPresenze " & _
    "WHERE (anno = " & TempVars!TempAnno & ") AND (Inquadramento = " & TempVars!TempInq & ") AND (IdGenerale = " & TempVars!AggIdGenerale & ")" & _
    "ORDER BY IdGenerale, anno, mese, giorno", cnG
    'Calcolo I Giorni di Malattia
    Do Until rsAdo1.EOF = True
        'Se il Tipo di Assenza è uguale ad M o ad MA allora inizia la malattia
        If (rsAdo1!tipo_assenza = "M") Or (rsAdo1!tipo_assenza = "MA") Then
        IdGeneraleMalattia = rsAdo1!IdGenerale
        MatricolaMalattia = rsAdo1!matricola
        DataInizioMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
        DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
            For i = 1 To 370
                rsAdo1.MoveNext
                If (Left(rsAdo1!tipo_assenza, 1) = "M") Then
                    DataFineMalattia = rsAdo1("giorno") & "/" & rsAdo1("mese") & "/" & rsAdo1("anno")
                    If rsAdo1.EOF = True Then
                        Exit For
                    End If
                Else
                    Exit For
                End If
            Next
    
    'CONTROLLO se ci sono DOMENICHE in mezzo alla malattia
                domeniche = DateDiff("ww", DataInizioMalattia, DataFineMalattia, 1)
    'CALCOLO la durata della malattia
                GiorniMalattia = DateDiff("d", DataInizioMalattia, DataFineMalattia) + 1 - domeniche
    'GENERO il progressivo della malattia
                Dim rsAdo3 As ADODB.Recordset
                Set rsAdo3 = New ADODB.Recordset
                rsAdo3.Open "SELECT Count(durata_gg) AS ConteggioDidurata_gg " & _
                "FROM TabellaMalattieTemp  WHERE (IdGenerale=" & IdGeneraleMalattia & ")", cnG
                Progressivo = rsAdo3("ConteggioDidurata_gg") + 1
    'INSEIRSCO tutto Nella TabellaMalattieTemp
                rsAdo2.Open "SELECT * FROM TabellaMalattieTemp ", cnG, 3, 3
                rsAdo2.AddNew _
                Array("Progressivo", "CodiceCliente", "IdGenerale", "data_inizio", "data_fine", "durata_gg", "Anno", "Mese", "matricola", "Id Listino", "Inquadramento"), _
                Array(Progressivo, TempVars![CodCliente], IdGeneraleMalattia, DataInizioMalattia, DataFineMalattia, GiorniMalattia, rsAdo1!Anno, rsAdo1!Mese, MatricolaMalattia, rsAdo1![Id Listino], rsAdo1!Inquadramento)
                rsAdo2.Update
        rsAdo2.Close
        rsAdo3.Close
        End If
    IdGeneraleMalattia = ""
    MatricolaMalattia = ""
    DataInizioMalattia = ""
    DataFineMalattia = ""
        
    'Vado Al Record Successivo
    
    rsAdo1.MoveNext
    Loop
    rsAdo1.Close
    
    forse così ti è chiaro perchè ho messo un doppio ciclo in modo che quando identifico la malattia la metto in una tabella
  • Re: Chiudere il ciclo con EOF

    Non si fa proprio come hai fatto tu... è assurdo...!
    Il Ciclo lo si fa in modo NORMALE, all'interno del ciclo se identifichi l'inizio della MALATTIA attivi un FLAG ed ad ogni giro controlli se si è chiusa la malattia, solo se hai attivato quel FLAG di malattia Iniziata...
    In questo modo il ciclo principale rimane inalterato e, puoi anche identificare più PERIODI... ad esempio TRASFERTE CONTINUATIVE, DISTACCHI... ovviamente magari a te non servono ma è per farti capire che quello che hai fatto.... è da rifare concettualmente, ed ad essere sincero si semplifica molto... quindi il controllo di EOF rimane in capo al LOOP iniziale.
Devi accedere o registrarti per scrivere nel forum
4 risposte