Gestione record

di il
20 risposte

Gestione record

Buonasera a tutti,

mi trovo ad aver bisogno di una gestione ottimale su aggiunta, modifica e cancellazione di record in maschere e sottomaschere (in modalità maschere continue)

Vi allego un file con il database. Potreste consigliarmi, e di conseguenza aiutarmi a scrivere il codice vba, per la gestione delle modifiche ecc?


Quello che dovrebbero fare i pulsanti è molto semplice:
per ogni maschera/sottomaschere 3 pulsanti: cmdNew, cmdMod, cmdDel
cmdNew: apre una maschera di dettaglio che ha i campi della maschera/sm principale VUOTA
cmdMod: apre una maschera di dettaglio ma con già inseriti tutti i dati del record selezionato
cmdDel: msgbox di conferma per la cancellazione record e relativo codice per la cancellazione

20 Risposte

  • Re: Gestione record

    Non scarico il tuo Demo perchè non lo trovo necessario, ti si forniscono delle indicazioni e poi tu puoi adattarle con tranquillità al tuo caso specifico.

    La Modifica/Aggiunta di un Record hanno un metodo secondo me molto standard da seguire, SEMPRE.
    Si predispone una Maschera basata sull'origine Record uguale alla Maschera o Sottomaschera con la Visualizzazione dei dati, ovviamente deve essere scrivibile.
    Per EDITARE
    
    DoCmd.OpenForm "NomeForm", , , "IdPK=" & Me.IdPk, acFormAdd, acDialog
    DoCmd.OpenForm "NomeForm", , , "IdPK=" & Me.IdPk, acFormEdit, acDialog
    In questo modo la Maschera di ADDNEW viene aperta in modalità SINCRONA, quindi al rientro, basta mettere l'aggiornamento dei Dati della Maschera/Sottomaschera origine...
    Quì poi si possono fare delle cose più fini... come ritornare al Record Ediatto dopo il Requery o Andare al Nuovo...
    
    Dim vPK As Variant
    vPK=Me.IdPK
    DoCmd.OpenForm "NomeForm", , , "IdPK=" & Me.IdPk, acFormEdit, acDialog
    Me.Requery
    Me.RecordsetClone.FindFirst  "IdPK=" & Me.IdPk
    Me.Bookmark=Me.RecordsetClone.Bookmark
    In caso di ADDNEW, se l'ordinamento è per idPk basta andare all'ultimo, altrimenti è un poco più complicato... ma fattibile.

    Per il DELETE basta che crei il Button con il DELETE RECORD, converti la Macro in codice e dovresti avere il necessario...
  • Re: Gestione record

    Provo a chiederti di più

    Per la modifica: quando apro la form per la modifica vorrei che i campi siano visibili e compilati, ma che non siano editabili fino al click di un altro tasto che me li sblocca
    Quindi nella form di lkp vorrei ancora 3 tasti: un cmdMod per sbloccare i campi da editare, un cmdSave per salvare, un cmdExit per tornare alla form principale dopo aver salvato. Tuttavia vorrei che quando si crea un record vengano visualizzati solo alcuni di questi cmd e quando si edita ne vengano visualizzati degli altri.. E' possibile farlo? Risolto, ho giocato sulla proprietà OpenArgs.

    EDIT: ho provato a creare il cmdDel con le macro e poi a convertirle in vba ma mi cancella il record selezionato nella sottomaschera e non nella maschera principale...
  • Re: Gestione record

    GabryBarbe ha scritto:


    Provo a chiederti di più....
    EDIT: ho provato a creare il cmdDel con le macro e poi a convertirle in vba ma mi cancella il record selezionato nella sottomaschera e non nella maschera principale...
    Questa affermazione va chiarita... intendi che vorresti cancellare ENTRAMBI o far funzionare il codice sia/sia...
    Nel 1° Caso se cancelli il Record nella SubForm non ha senso cancellare quello nella Form...
    Per far funzionare il codice nella Form devi mettere un Button nella Form, in quanto il codice della macro funziona sull'Oggetto Attivo... quindi devi forzare come attivo la Form, e basta un Button, oppure il codice...

    Io userei il Metodo "Delete" del Recordset di Maschera, in quel modo puoi essere più flessibile nel cancellare... cerca in merito al metodo DELETE dell'oggetto RECORDSET...
  • Re: Gestione record

    @Alex ha scritto:


    GabryBarbe ha scritto:


    Provo a chiederti di più....
    EDIT: ho provato a creare il cmdDel con le macro e poi a convertirle in vba ma mi cancella il record selezionato nella sottomaschera e non nella maschera principale...
    Questa affermazione va chiarita... intendi che vorresti cancellare ENTRAMBI o far funzionare il codice sia/sia...
    Nel 1° Caso se cancelli il Record nella SubForm non ha senso cancellare quello nella Form...
    Per far funzionare il codice nella Form devi mettere un Button nella Form, in quanto il codice della macro funziona sull'Oggetto Attivo... quindi devi forzare come attivo la Form, e basta un Button, oppure il codice...

    Io userei il Metodo "Delete" del Recordset di Maschera, in quel modo puoi essere più flessibile nel cancellare... cerca in merito al metodo DELETE dell'oggetto RECORDSET...
    prima, con un cmdCancella in intestazione maschera creato con macro e poi convertito, non mi cancellava il record della maschera principale ma della subform.. Io vorrei cancellare il record principale (se vuoto, altrimenti msg di errore)

    Ho provato questo codice ma non va, perchè credo che sbagli a prendere il riferimento... Dove sta la mancanza?
    Dim DBCorrente As DAO.Database
        Dim Tabella As DAO.Recordset
        
        Set DBCorrente = CurrentDb
        Set Tabella = DBCorrente.OpenRecordset("tblProduttori")
        
        Tabella.MoveNext
        Tabella.Delete
    
        Tabella.Close
        DBCorrente.Close
  • Re: Gestione record

    Hai provato con quel codice... ma sai cosa fa ogni riga... e come ti posizioni nel recordset...?
    Prova a ragionare su quello che hai scritto...
  • Re: Gestione record

    @Alex ha scritto:


    Hai provato con quel codice... ma sai cosa fa ogni riga... e come ti posizioni nel recordset...?
    Prova a ragionare su quello che hai scritto...
    Giustamente... Grazie, ho sistemato il codice così. E' un codice degno di essere chiamato codice?
    
        Dim Tabella As DAO.Recordset
        
        If MsgBox("Sei sicuro di voler eliminare questo produttore?" & vbCrLf & "Non potrai più tornare indietro!", vbYesNo + vbCritical, "Eliminare dati?") = vbYes Then
            Set Tabella = Me.Recordset
            If Not Tabella.EOF Then
                Tabella.Delete
                Tabella.MoveNext
            End If
            
            Set Tabella = Nothing
        End If
    Però non capisco perchè non mi esce l'errore quando ci sono dei record relazionati...

    A questo punto avrei altre domande..
    Prima: quando sono in un record e lo vado ad editare, come faccio a tornare su quel record quando rendo di nuovo visibile la form principale? Solitamente mi porta al primo perchè eseguo un requery al click del cmdClose nella form di dettaglio

    Seconda: ho una seconda sottomaschera che viene filtrata così:
    id produttore legato campi master/secondary con la form principale + id vigneto con proprietà filter alla prima sottomaschera
    Tuttavia non riesco a far funzionare i button per la modifica. Mi entra in modifica sempre solo il primo record, non gli altri...
  • Re: Gestione record

    GabryBarbe ha scritto:


    ...
    Giustamente... Grazie, ho sistemato il codice così. E' un codice degno di essere chiamato codice?
    Per me no, manca la gestione errori e ci sono cose inuntili... poi dettaglio.

    GabryBarbe ha scritto:


    
        Dim Tabella As DAO.Recordset
        
        If MsgBox("Sei sicuro di voler eliminare questo produttore?" & vbCrLf & "Non potrai più tornare indietro!", vbYesNo + vbCritical, "Eliminare dati?") = vbYes Then
            Set Tabella = Me.Recordset
            If Not Tabella.EOF Then
                Tabella.Delete
                Tabella.MoveNext
            End If
            
            Set Tabella = Nothing
        End If
    Meglio usare il RecordsetClone per evitare continui REPAINT... a termine operazione si sicronizza il Bokmark di Maschera con quello del RecordsetClone.
    A cosa serve il MOVENEXT...? A nulla se hai cancellato l'ultimo... vai al nuovo...?

    GabryBarbe ha scritto:


    Però non capisco perchè non mi esce l'errore quando ci sono dei record relazionati...
    Se hai attivato il DELETE CASCADE nelle relazioni è ovvio...

    GabryBarbe ha scritto:


    A questo punto avrei altre domande..
    Prima: quando sono in un record e lo vado ad editare, come faccio a tornare su quel record quando rendo di nuovo visibile la form principale? Solitamente mi porta al primo perchè eseguo un requery al click del cmdClose nella form di dettaglio
    Ovvio, infatti nel codice che mi pare INUTILMENTE ti ho postato prima avevo inserito anche la parte per ovviare a questo ptoblema.

    GabryBarbe ha scritto:


    Seconda: ho una seconda sottomaschera che viene filtrata così:
    id produttore legato campi master/secondary con la form principale + id vigneto con proprietà filter alla prima sottomaschera
    Tuttavia non riesco a far funzionare i button per la modifica. Mi entra in modifica sempre solo il primo record, non gli altri...
    Non ho capito nulla della 2° Domanda... ma direi che hai da fare i compiti a casa... e se la domanda non è strettamente pertinente con il 3D originale puoi inserire un 3D dedicato.
  • Re: Gestione record

    @Alex ha scritto:



    Ovvio, infatti nel codice che mi pare INUTILMENTE ti ho postato prima avevo inserito anche la parte per ovviare a questo ptoblema.

    Non ho capito nulla della 2° Domanda... ma direi che hai da fare i compiti a casa... e se la domanda non è strettamente pertinente con il 3D originale puoi inserire un 3D dedicato.

    Per quanto riguarda la parte di codice e il delete cascade ho risolto, grazie.

    Ho cercato di capire il meglio possibile il bookmark ma ancora mi sfugge come far tornare la form visibile sul record col bookmark... Sul click del cmdClose della form di dettaglio vado a salvare, chiudere, rendere la form visibile e fare un requery della form principale. Come chiamo il bookmark però...?

    La seconda domanda è questa:
    nella form principale (mProduttori) ho due sottomaschere (smVigneti e smSpecie)
    Produttori.IDProduttore 1-m Vigneti.IDProduttore
    (Vigneti.IDPRoduttore - Specie.IDProduttore)
    Vigneti.IDVigneto 1-m Specie.IDVigneto

    La seconda sottomaschera viene filtrata con la proprietà filter per l'IDVigneto, tuttavia quando seleziono un record e clicco il cmdEdit mi entra in modifica sempre solo il primo record, e non quello selezionato...
  • Re: Gestione record

    GabryBarbe ha scritto:


    ...
    Ho cercato di capire il meglio possibile il bookmark ma ancora mi sfugge come far tornare la form visibile sul record col bookmark... Sul click del cmdClose della form di dettaglio vado a salvare, chiudere, rendere la form visibile e fare un requery della form principale. Come chiamo il bookmark però...?
    Sicuro di aver capito bene a cosa mi riferivo...?
    
    Dim vPK As Variant
    vPK=Me.IdPK
    DoCmd.OpenForm "NomeForm", , , "IdPK=" & Me.IdPk, acFormEdit, acDialog
    Me.Requery
    Me.RecordsetClone.FindFirst  "IdPK=" & Me.IdPk
    Me.Bookmark=Me.RecordsetClone.Bookmark

    GabryBarbe ha scritto:


    La seconda domanda è questa:
    nella form principale (mProduttori) ho due sottomaschere (smVigneti e smSpecie)
    Produttori.IDProduttore 1-m Vigneti.IDProduttore
    (Vigneti.IDPRoduttore - Specie.IDProduttore)
    Vigneti.IDVigneto 1-m Specie.IDVigneto

    La seconda sottomaschera viene filtrata con la proprietà filter per l'IDVigneto, tuttavia quando seleziono un record e clicco il cmdEdit mi entra in modifica sempre solo il primo record, e non quello selezionato...
    Dovrei vedere bene dove hai scritto il codice e a cosa fai riferimento... purtroppo se usi i comandi con DOCMD... l'inesperienza sugli oggetti può creare problemi... sapendo che queli comandi operano sull'Oggetto attivo.
    Per questo io non uso volentieri questi codici.
  • Re: Gestione record

    @Alex ha scritto:


    ...

    Sicuro di aver capito bene a cosa mi riferivo...?
    
    Dim vPK As Variant
    vPK=Me.IdPK
    DoCmd.OpenForm "NomeForm", , , "IdPK=" & Me.IdPk, acFormEdit, acDialog
    Me.Requery
    Me.RecordsetClone.FindFirst  "IdPK=" & Me.IdPk
    Me.Bookmark=Me.RecordsetClone.Bookmark
    Sìsì, avevo capito. Ma penso di sbagliare qualcosa nel cmdClose della form di dettaglio... Provo a postarti i codici

    cmdEdit della form principale:
    Private Sub cmdModifica_Click()
        
        Me.Visible = False
        DoCmd.OpenForm "mProduttoriLkp", , , "IDProduttore = " & Me.IDProduttore, acEdit, acDialog, "Edit"
        Me.Requery
        Me.RecordsetClone.FindFirst "IDProduttore = " & Me.IDProduttore
        Me.Bookmark = Me.RecordsetClone.Bookmark
    
    End Sub
    cmdClose della form di dettaglio:
    Private Sub cmdEsci_Click()
    
        DoCmd.Save
        DoCmd.Close
        Forms!mProduttori.Visible = True
        
    End Sub

    @Alex ha scritto:


    ...
    Dovrei vedere bene dove hai scritto il codice e a cosa fai riferimento... purtroppo se usi i comandi con DOCMD... l'inesperienza sugli oggetti può creare problemi... sapendo che queli comandi operano sull'Oggetto attivo.
    Per questo io non uso volentieri questi codici.
    Per questo ti allego il database aggiornato, dimmi se riesci a ricavarne qualcosa...
    (non far caso alla parte dell'inventario)
  • Re: Gestione record

    GabryBarbe ha scritto:


    ....

    Sìsì, avevo capito. Ma penso di sbagliare qualcosa nel cmdClose della form di dettaglio... Provo a postarti i codici

    cmdEdit della form principale:
    Private Sub cmdModifica_Click()
        
        Me.Visible = False
        DoCmd.OpenForm "mProduttoriLkp", , , "IDProduttore = " & Me.IDProduttore, acEdit, acDialog, "Edit"
        Me.Visible = True
        Me.Requery
        Me.RecordsetClone.FindFirst "IDProduttore = " & Me.IDProduttore
        Me.Bookmark = Me.RecordsetClone.Bookmark
    
    End Sub
    Il Pulsante di Close non serve a nulla, usa la [X] della Form per chiudere... e su Unload metti
    
    Private Sub Form_Unload(Cancel As Integer)
        DoCmd.RunCommand acCmdSaveRecord
    End Sub
  • Re: Gestione record

    @Alex ha scritto:


    ...
    Il Pulsante di Close non serve a nulla, usa la [X] della Form per chiudere... e su Unload metti
    
    Private Sub Form_Unload(Cancel As Integer)
        DoCmd.RunCommand acCmdSaveRecord
    End Sub
    Con questo metodo però non vado a rendere invisibile la form principale, giusto?
  • Re: Gestione record

    Mi pare tu sia un po distratto o sbaglio...
    Guarda il tuo codice che avevo riportato inserendo la variazione...
  • Re: Gestione record

    Hai ragione, scusami. Questa parte dunque è risolta.

    Mi servirebbe ora sistemare solo la parte dell'edit delle specie..

    EDIT: questa sera, riaprendo il database, ho notato che comunque mi riporta al primo record...
Devi accedere o registrarti per scrivere nel forum
20 risposte