Recupero ID max dopo salvataggio in form modale

di il
8 risposte

Recupero ID max dopo salvataggio in form modale

Buongiorno,

ho necessita' di recuperare l'Id max nella procedura di salvataggio di un  nuovo record in una form modale. Adesso ho il seguente codice sull'evento del pulsante di salvataggio, ma non recupera l'ID (IDtabEVid) piu' grande. L'id e' un contatore automatico.

Private Sub frmEVcmdsalva_Click()
On Error GoTo Err_handler
Dim indice As Long
Dim ctrl As Access.Control
   
   DoCmd.RunCommand acCmdSaveRecord
   
   indice = Nz(DMax("IDtabEVid", "tblEVelencovociordine"), 0)
   ...

La form e' aperta in modalita' nuovo record (acformadd) e modale (acdialog). 

Puo' essere perche' non viene fatto l'inserimento in tabella finche' la routine non si chiude?

Grazie in anticipo

8 Risposte

  • Re: Recupero ID max dopo salvataggio in form modale

    Ciao, 
    si , può essere che la transazione ancora non sia eseguita.

    Prova ad inserire un Me.Refresh dopo il SaveRecord, questo dovrebbe permettere alla form di cambiare lo stato attuale e forzare l'aggiornamento del record nella tabella del database.

  • Re: Recupero ID max dopo salvataggio in form modale

    Apri una finestra modale con inserimento nuovo record con id autoincrement...

    l'ID verrà inserito appena rilasciato il nuovo record.

    Nell'ipotesi di multiutenza non ha senso spostarsi al max id.

    Tu inserisci l'ID 3

    Pippo l'ID 4

    Pluto l'ID 5

    Se al rilascio del tuo record nr3 cerchi max id ti ritrovi con il record 5

    Sarebbe opportuno in fase di inserimento recuperare l'ID del tuo record e posizionati a quell'id.

    Al rilascio del record, prima di chiudere la modale ti leggi l'ID

    Al form principale ti posizioni

  • Re: Recupero ID max dopo salvataggio in form modale

    Ci sarebbe da capire meglio operativamente come operi, ma fossi in te userei IDENTITY SQL... anche perchè il DMAX in caso di Multiutenza non è una gran idea usarlo... l'interrogazione è Locale e non ServerSide...

    Usi DAO ed interroghi il Server così, sono chiamate equivalenti:

    LastID=DbEngine(0)(0).OpenRecordset("SELECT @@IDENTITY as LastPKID")!LastPKID
    LastID=DbEngine(0)(0).OpenRecordset("SELECT @@IDENTITY as LastPKID")(0)

    Questo metodo funziona anche nel caso di Tranzazioni MultiUtente... 

  • Re: Recupero ID max dopo salvataggio in form modale

    Grazie a tutti per i suggerimenti. 

    Siccome il DB e' monoutenza con il suggerimento di @Franco ho risolto. Pero approfondisco il suggerimento di @Alex, fosse anche solo per imparare qualcosa di nuovo.

    Grazie ancora

  • Re: Recupero ID max dopo salvataggio in form modale

    Ho qualche ricordo sulla differenza tra Refresh e Requery, ti suggerisco di leggere bene questo, se la Modale la usi per MODIFICA solo il metodo refresh va bene, ma se aggiungi non è il metodo adatto, in quanto non ricarica realmente il Recordset dalla tabella...

    "In an Access database, the Refresh method shows only changes made to records in the current set. Because the Refresh method doesn't actually requery the database, the current set won't include records that have been added or exclude records that have been deleted since the database was last requeried, nor will it exclude records that no longer satisfy the criteria of the query or filter."

    https://learn.microsoft.com/en-us/office/vba/api/access.form.refresh

    Quindi se il refresh ha dato i suoi risultati, è perchè il Save era già andato a buon fine, in caso di ADDNEW... tuttavia al rientro dalla Modale se non fai il Requery non visualizzerai il NUOVO.

  • Re: Recupero ID max dopo salvataggio in form modale

    Il requery e' inserito nella seconda parte di codice, che non ho postato. 

    14/03/2025 - @Alex ha scritto:

    Quindi se il refresh ha dato i suoi risultati, è perchè il Save era già andato a buon fine, in caso di ADDNEW

    Se il SAVE era andato a buon fine perche' allora non trovava l'ultimo ID creato, mentre inserendo il refresh lo trova?

    Cosi' indice non viene valorizzato con l'ultimo ID generato ma con il penultimo:

    Private Sub frmEVcmdsalva_Click()
    On Error GoTo Err_handler
    Dim indice As Long
    Dim ctrl As Access.Control
       
       DoCmd.RunCommand acCmdSaveRecord
       indice = Nz(DMax("IDtabEVid", "tblEVelencovociordine"), 0)

    Cosi' invece funziona:

    Private Sub frmEVcmdsalva_Click()
    On Error GoTo Err_handler
    Dim indice As Long
    Dim ctrl As Access.Control
       
       DoCmd.RunCommand acCmdSaveRecord
       Me.Refresh
       indice = Nz(DMax("IDtabEVid", "tblEVelencovociordine"), 0)
  • Re: Recupero ID max dopo salvataggio in form modale

    Prima di tutto perchè usi DMAX...?
    Se hai una Form modale ed esegui l'AddNew e salvi, con il comando che hai usato il Controllo(Campo) legato alla PK viene valorizzata correttamente ed il comando acCmdSaveRecord non fa spostare il Bookmark quindi perchè non leggi il valore ID della PK...? Come detto inizialmente sono poco chiare le modalità che usi...!

    Se invece il DMAX lo usi dalla Form chiamante e non dalla modale qualche cosa non torna...!

    Secondo me stai sovrapponendo alcuni concetti di base che mischiati danno il risultato, in ogni caso la guida di MS è molto chiara e non ha modo di essere fraintesa, quindi lascio a te che sicuramente conosci bene come stai operando tutto il workflow del sistema.

  • Re: Recupero ID max dopo salvataggio in form modale

    14/03/2025 - Mailman ha scritto:

    Cosi' invece funziona:

    Ciao... si funziona perchè come ti dicevo può bastare anche cambiare solo il focus per forzare la transazione del record. Ma come sempre dipende dal contesto/scenario specifico.

    Ma per avere una più corretta gestione e un sistema più robusto, segui le istruzioni di @Alex... il requery sicuramente restituisce un nuovo recordset e a quel punto sei veramente a posto. 
    Infine esegui i metodi descritti da @Alex per reperire il nuovo ID e, in ogni scenario, avrai sicuramente il risultato voluto.

Devi accedere o registrarti per scrivere nel forum
8 risposte