CICLO DOWHILE - IMPOSTAZIONE CODICE VBA [RISOLTO]

Anonimo
2023-08-30T07:13:16+00:00

Buongiorno a tutti

ho un problema con il ciclo Do While. Ho impostato il codice vba, adattato sulla falsa riga del codice che mi ha aiutato ad impostare nello stesso database il carissimo Amico Mimmo esperto della community, è il seguente:

Private Sub EsportaPDF_Click() 

    Dim Rst1 As Recordset 

    Set Rst1 = CurrentDb.OpenRecordset("Select * From QRY_Riepilogo_Stampa_Report_Anagrafica Where Id_Anagrafica = " & id_anagrafica) 

'    If Rst1.EOF Then 

'       MsgBox ("RecordSet aperto") 

'    GoTo Chiudi 

'    End If 

Rst1.MoveFirst 

       DoCmd.SetWarnings False 

       Do While Not Rst1.EOF 

             DoCmd.RunSQL ("Update Quota_incentivi Set Stampa_Report_Anagrafica = -1 Where Anagrafica_id = " & Rst1("id_anagrafica")) 

             Rst1.MoveNext 

       Loop 

       DoCmd.SetWarnings True 

'Chiudi: 

    Set Rst1 = Nothing 

'    Me.Requery 

DoCmd.OpenReport "Riepilogo_progetti_dipendente", acViewPreview, , , acHidden 

DoCmd.OutputTo acOutputReport, "Riepilogo_progetti_dipendente", acFormatPDF, "C:_schede\schede_liquidate_dipendente\" & Me.Cognome & "_" & Me.Codice_Fiscale & "_" & Format(Me.Data_Stampa, "yyyy-mm-dd") & ".pdf" 

DoCmd.Close acReport, "Riepilogo_progetti_dipendente" 

MsgBox "L'esportazione è stata completata con successo. Puoi trovare il file salvato nel seguente percorso: C:_schede\schede_liquidate_dipendente", vbInformation 

End Sub 

Chiedo il Vostro aiuto poichè il codice non viene eseguito in maniera corretta. In pratica l'Update viene eseguito sulla Tabella "Quota_Incentivi" su tutti i progetti associati all' Id_Anagrafica e non solo sugli ID_Anagrafica contenuti nel Recorset.

Ho provato più volte a modificare il codice ma il risultato è sempre lo stesso.

Non riesco a capire dove ho sbagliato nel ciclo Do While per questo chiedo il Vostro gradito e competente aiuto.

Grazie

Luca

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-08-31T19:40:08+00:00

Ciao Luca,

potresti provare a commentare le istruzioni

DoCmd.OpenReport ....

e

Docmd.Close acReport.....

penso che non servono.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-08-31T06:37:31+00:00

Ciao e scusa il ritardo,

forse, se nella query estrai anche Id_Quota_Incentivi, puoi utilizzare questo campo per gli aggiornamenti.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-08-30T12:29:24+00:00

Ok.

Quindi i records da aggiornare sono quelli restituiti dalla query "QRY_Riepilogo_Stampa_Report_Anagrafica" e mi sembra di capire che il criterio che invece utilizzi nella Update Where Anagrafica_id = " & Rst1("id_anagrafica") non è sufficiente ad identificare un preciso record.

Hai nella query uno o più campi che identificano il record nella Quota_Incentivi da aggiornare in modo univoco e puntuale?

Nella condizione della Update devi utilizzare il/i campo/i comune/i tra la query di origine e la tabella da aggiornare.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-08-30T10:36:38+00:00

Ciao Luca,

  1. se per recordset intendi quello generato nel codice con nome Rst1, l'istruzione: Set Rst1 = CurrentDb.OpenRecordset("Select * From QRY_Riepilogo_Stampa_Report_Anagrafica Where Id_Anagrafica = " & id_anagrafica)

ha una sola condizione che estrae tutti i records con l'Id_Anagrafica. Quindi il loop tratta tutti i records presenti nel recordset Rst1.

  1. Se invece per recordset intendi l'elenco dei records, magari filtrati, presenti in maschera allora devi utilizzare il recordsetclone dell maschera.
  2. Più in generale, se l'obiettivo è solo quello di aggiornare la tabella Quota_incentivi impostando il campo Stampa_Report_Anagrafica a -1, non ti serve la gestione del recordset ma ti è sufficiente la sola istruzione di Update con, se vuoi, l'aggiunta della soppressione del messaggio derivante

docmd.setwarnings = false

DoCmd.RunSQL ("Update Quota_incentivi Set Stampa_Report_Anagrafica = -1 Where Anagrafica_id = " & Me.id_anagrafica)

docmd.setwarnings = true

Come vedi utilizzo nella condizione Me.Id_Anagrafica che è il corrente in maschera ( visto che sei nella Sub EsportaPDF_Click ).

Facci sapere

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2023-08-30T07:47:20+00:00

    Ciao, mi chiamo Ajibola e sono entusiasta di aiutarti oggi!

    Per risolvere il problema, è necessario modificare l'istruzione SQL update per includere una condizione che filtri gli aggiornamenti in base al valore 'id_anagrafica' corrente dal recordset. Ecco come puoi modificare il tuo codice per raggiungere questo obiettivo:

    '''VBA Sub privato EsportaPDF_Click()

    Dim rst1 come recordset Set Rst1 = CurrentDb.OpenRecordset("Select * From QRY_Riepilogo_Stampa_Report_Anagrafica Where Id_Anagrafica = " & id_anagrafica)

    Se Rst1.EOF allora MsgBox ("Open RecordSet") Esci Sub Fine Se

    DoCmd.SetWarnings False

    Esegui il problema non rst1.EOF Corrente attenuataIdAnagrafica As Long currentIdAnagrafica = Rst1("id_anagrafica")

    DoCmd.RunSQL "UPDATE Quota_incentivi SET Stampa_Report_Anagrafica = -1 WHERE Anagrafica_id = " & currentIdAnagrafica

    Rst1.MoveNext Ciclo

    DoCmd.SetWarnings True

    set rst1 = niente Me.Requery

    DoCmd.OpenReport "Riepilogo_progetti_dipendente", acViewPreview, , , acHidden DoCmd.OutputTo acOutputReport, "Riepilogo_progetti_dipendente", acFormatPDF, "C:\schede\schede_liquidate_dipendente" & Me.Cognome & "_" & Me.Codice_Fiscale & "_" & Format(Me.Data_Stampa, "aa-mm-gg") & ".pdf" DoCmd.Chiudi acReport, "Riepilogo_progetti_dipendente"

    MsgBox "L'esportazione è stata completata correttamente. È possibile trovare il file salvato nel seguente percorso: C:\schede\schede_liquidate_dipendente", vbInformation

    Fine sub

    
    Ho aggiunto una variabile 'currentIdAnagrafica' per memorizzare il valore 'id\_anagrafica' dal record corrente nel ciclo. Quindi, l'istruzione SQL di aggiornamento viene modificata per utilizzare questo valore nella clausola 'WHERE' per garantire che vengano aggiornati solo i record con il corretto 'Anagrafica\_id'. Questo dovrebbe risolvere il problema che stavi affrontando con gli aggiornamenti applicati a tutti i progetti associati al "Id\_Anagrafica".
    
    Se hai ulteriori domande o hai bisogno di ulteriore assistenza, non esitare a chiedere. Sono qui per aiutarti!
    
    Se la risposta è stata utile, non dimenticare di votare o accettarla come risposta, Grazie
    
    Cordiali saluti  
    
    *Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.*
    

    La risposta è stata utile?

    0 commenti Nessun commento