[RISOLTO] Aggiornamento dati utilizzando VBA

di il
5 risposte

[RISOLTO] Aggiornamento dati utilizzando VBA

Buongiorno
La situazione attuale consiste in una maschera (attinente alla valutazione del personale) con sottomaschera che contiene i dati di ogni singola valutazione effettuata sul conto della persona.
La maschera principale, si "poggia" sulla Tabella [Personale], mentre la sottomaschera si poggia sulla Tabella [StoricoNote], legate dalla relazione [CIP] (Pk) uno a molti [CIP] (matricola del personale)
L'intento è quello di aggiornare alcuni campi della tabella [Personale] quando vengono aggiunti e o modificati i record alla sottomaschera (tabella [StoricoNote]) e magari aggiornare la visualizzazione della maschera principale con i nuovi dati inseriti.

Attualmente l'operazione viene effettuata mediante l'esecuzione di diverse query di aggiornamento, che fanno le operazioni richieste; il fatto che ciascuna richieda diverse conferme (finestre di avviso) prima della sua esecuzione.
Non vorrei disattivare tutte queste finestre nel Db, perchè alcune di esse (in altri casi) mi fanno comodo per avere una conferma ulteriore dell'operazione che viene effettuata.

Vorrei quindi ottenere lo stesso risultato mediante l'esecuzione di codice VBA, che piano piano sto scoprendo come un ottimo strumento di ausilio.
ho predisposto il seguente codice, che attualmente viene eseguito tramite un pulsante presente nella sottomaschera, ma una volta testato e funzionante, lo vorrei inserire nella sezione "after update" della maschera, dopo aver inserito anche gli altri campi da aggiornare, con altri If....

Private Sub Comando81_Click()
Dim dbs As DAO.Database
Dim Tabella As DAO.Recordset
Set dbs = CurrentDb
Set Tabella = dbs.OpenRecordset("Personale", [dbOpenDynaset])

Tabella.FindFirst "CIP = '& Me![CIP]'"
MsgBox Tabella.Fields("CIP") ' Verifica CIP selezionato
'========== Modifica Classifica =======
If Me.Classifica <> "Non Prevista" Then
Tabella.Edit 'Abilita la modifica del record
Tabella.Fields("ClassificaAttuale") = Me.Classifica  'imposta nuovo valore
Tabella.Update 'Salva La modifica
End If
End Sub
Il problema è nella ricerca del record da modificare, attraverso la stringa
Tabella.FindFirst "CIP = '& Me![CIP]'"
Dalla ricerca viene rilevato sempre lo stesso CIP, ovvero quello dell'ultimo impiegato inserito nella tabella [Personale]
Se inserisco il dato della ricerca manualmente es. "CIP = '123456'", invece, funziona correttamente

Ho provato a inserire "CIP = Me.CIP", oppure "CIP = [Maschere]![Personale]![CIP]" oppure altre varianti, ma sempre con lo stesso risultato.

L'aggiornamento del record viene eseguito regolarmente, utilizzando il valore richiamato (Me.Classifica), ma sempre sul record relativo a quel [CIP]

Qual'é l'orrore che sto commettendo?

5 Risposte

  • Re: [RISOLTO] Aggiornamento dati utilizzando VBA

    Robpagna ha scritto:


    La maschera principale, si "poggia" sulla Tabella [Personale], mentre la sottomaschera si poggia sulla Tabella [StoricoNote], legate dalla relazione [CIP] (Pk) uno a molti [CIP] (matricola del personale)
    L'intento è quello di aggiornare alcuni campi della tabella [Personale] quando vengono aggiunti e o modificati i record alla sottomaschera (tabella [StoricoNote]) e magari aggiornare la visualizzazione della maschera principale con i nuovi dati inseriti.
    Non capisco il senso di questa operazione. Potresti esplicitare tutti i campi di entrambe le tabelle?

    Robpagna ha scritto:


    Attualmente l'operazione viene effettuata mediante l'esecuzione di diverse query di aggiornamento, che fanno le operazioni richieste; il fatto che ciascuna richieda diverse conferme (finestre di avviso) prima della sua esecuzione.
    Non vorrei disattivare tutte queste finestre nel Db, perchè alcune di esse (in altri casi) mi fanno comodo per avere una conferma ulteriore dell'operazione che viene effettuata.
    DoCmd.SetWarnings False 'per disattivare gli avvisi di esecuzione di query di comando
    DoCmd.SetWarnings True 'per riattivare
  • Re: [RISOLTO] Aggiornamento dati utilizzando VBA

    Robpagna ha scritto:


    Attualmente l'operazione viene effettuata mediante l'esecuzione di diverse query di aggiornamento, che fanno le operazioni richieste; il fatto che ciascuna richieda diverse conferme (finestre di avviso) prima della sua esecuzione.
    Cosa gestibile con il medoto Execute di un oggetto DAO.Database.

    Robpagna ha scritto:


    Non vorrei disattivare tutte queste finestre nel Db, perchè alcune di esse (in altri casi) mi fanno comodo per avere una conferma ulteriore dell'operazione che viene effettuata.
    Anche questo gestibile via codice con un messaggio ad hoc.

    Robpagna ha scritto:


    ...viene eseguito tramite un pulsante presente nella sottomaschera...
    ...
    Il problema è nella ricerca del record da modificare, attraverso la stringa
    Tabella.FindFirst "CIP = '& Me![CIP]'"
    (quella non è una stringa)
    CIP è numerico o testo? a seconda del tipo di dato devi usare i delimitatori giusti (in un caso non usarli proprio)
    Aggiungi una MsgBox o un Debug.Print di Me![CIP] prima di usare il metodo FindFirst e guarda se è quello giusto.
    A parte questo, che potrebbe essere comunque utile per imparare a fare debug, ricorda che hai il record corrispondente a quel CIP nella maschera principale, forse è più facile modificare i valori prendendoli da lì?
    Per orizzontarti nella struttura maschera/sottomaschera (facendo attenzione a distinguere i controlli dai campi) questa pagina va messa al sicuro:
  • Re: [RISOLTO] Aggiornamento dati utilizzando VBA

    Philcattivocarattere ha scritto:


    ...

    Robpagna ha scritto:


    ...viene eseguito tramite un pulsante presente nella sottomaschera...
    ...
    Il problema è nella ricerca del record da modificare, attraverso la stringa
    Tabella.FindFirst "CIP = '& Me![CIP]'"
    (quella non è una stringa)
    CIP è numerico o testo? a seconda del tipo di dato devi usare i delimitatori giusti (in un caso non usarli proprio)
    Aggiungi una MsgBox o un Debug.Print di Me![CIP] prima di usare il metodo FindFirst e guarda se è quello giusto.
    A parte questo, che potrebbe essere comunque utile per imparare a fare debug, ricorda che hai il record corrispondente a quel CIP nella maschera principale, forse è più facile modificare i valori prendendoli da lì?
    Per orizzontarti nella struttura maschera/sottomaschera (facendo attenzione a distinguere i controlli dai campi) questa pagina va messa al sicuro:
    Grazie per l'attenzione
    Ora, con il comando "DoCmd.SetWarnings" suggerito (che non conoscevo), potrei ovviare al mio problema, che a questo punto potrebbe essere superato (almeno credo).
    Tornando alla situazione attuale (ormai è una sfida), Il valore del CIP è alfanumerico (solitamente 6 numeri e 2 lettere, senza spazi)
    Il Msgbox suggerito è già presente, infatti proprio da lì visualizzo sempre lo stesso CIP... che poi viene effettivamente aggiornato.
    il MsgBox prima del metodo findfirst, Me.CIP, restituisce il CIP corretto (quello visualizzato in maschera)
    I dati di origine (quelli che devono essere "copiati" sulla tabella [Personale]) , si trovano nella sottomaschera;
    da lì devono essere "incollati" sulla tabella [Personale] o sui relativi campi della maschera principale, motivo per il quale, secondo me, la sintassi "CIP = Me.CIP" poteva essere già corretta.
    Allo stesso modo, l'aggiornamento del campo della tabella, viene regolarmente effettuato prelevando il valore di "Me.Classifica", ovvero il valore presente nel campo "classifica" della sottomaschera.
    (passatemi il riferimento al "copia-incolla", utilizzato per rendere l'idea)

    OsvaldoLaviosa ha scritto:


    Robpagna ha scritto:


    La maschera principale, si "poggia" sulla Tabella [Personale], mentre la sottomaschera si poggia sulla Tabella [StoricoNote], legate dalla relazione [CIP] (Pk) uno a molti [CIP] (matricola del personale)
    L'intento è quello di aggiornare alcuni campi della tabella [Personale] quando vengono aggiunti e o modificati i record alla sottomaschera (tabella [StoricoNote]) e magari aggiornare la visualizzazione della maschera principale con i nuovi dati inseriti.
    Non capisco il senso di questa operazione. ...
    ...
    Il senso è il seguente:
    Per ogni dipendente vengono fatte delle valutazioni dettagliate periodicamente (periodi variabili in base all'esigenza), e memorizzati nella tabella [StoricoNote]
    Alcuni dettagli riferiti all'ultima valutazione fatta, sono riportati ANCHE nella tabella che contiene i dati di ciascun dipendente [Personale].
    Tali dati sono gestiti attraverso maschera e sottomaschera appositamente predisposte.
    l'idea era quella di far aggiornare automaticamente i dati di interesse nella tabella [Personale] (con riferimento alla matricola univoca CIP) con quelli appena inseriti nella tabella [StoricoNote] (per alcuni in base a delle condizioni specifiche riferiti al valore dei dati da aggiornare).
  • Re: [RISOLTO] Aggiornamento dati utilizzando VBA

    Forse modificando in questo modo: Tabella.FindFirst "CIP = '" & Me.CIP & "'"
  • Re: [RISOLTO] Aggiornamento dati utilizzando VBA

    Grazie Stifone.
    Così sembra funzionare
    Ora viene selezionato il record visualizzato in maschera, che poi viene correttamente aggiornato nel campo di interesse.
    Adesso implemento il codice per aggiornare anche altri 2 campi.
    Grazie... per il momento
Devi accedere o registrarti per scrivere nel forum
5 risposte