Aggiornamento campi da tabella A alla sottomaschera di una tabella B

di il
61 risposte

61 Risposte - Pagina 3

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    05/08/2023 - Pattygirl ha scritto:


    05/08/2023 - fratac ha scritto:


    Aiutarti sarà veramente difficile per il semplice motivo che in access, per fare una cosa esistono decine di metodi differenti, sia per quanto riguarda le tabelle, le relazioni tra di esse, la costruzione delle query per salvare i dati o per visualizzarli e sopratutto il codice vba.
    Ognuno di noi ragiona in modo diverso e quindi affronta e scrive i codici in modo diverso.

    Quindi non sappiamo come hai ragionato e come hai affrontato le varie soluzioni.

    Ci hai fornito le immagini delle maschere, ma in realtà, le maschere sono solo l'ultima ruota del carro e non bisogna concentrarsi su di loro.

    QUello che veramente serve,  sono la struttura delle tabelle e come sono collegate tra di loro tramite le relazioni.
    Poi, serve sapere come sono fatte le query fonte dati delle maschere e come sono collegati i campi master.

    Bisogna conoscere il tipo di relazioni, se hanno l'integrità referenziale attiva oppure no. 

    Da quello che hai descritto e quindi penso di aver capito fin dall'inizio, hai delle relazioni molti a molti.

    Il problema che riscontri è che cerchi di aggiungere un record su una tabella che necessita di una chiave primaria presente su un'altra tabella.

    Molto probabilmente sembra tutto funzionare, perchè non hai attivato l'integrità referenziale a livello di relazioni e quindi non ti si genera nessun errore, fino a quando, tramite VBA non cerchi di andare ad inserire un nuovo record sulla tabella.

    Quando cerchi di inserire un nuovo record nella tabella figlia tramite vba, non essendo presente nessun record nella tabella madre ti si genera qualche tipo di errore.

    Cosa che non accade se lo fai manualmente, perchè access fa riferimento agli ID dei campi master delle varie tabelle e quindi lo fa da solo, oppure ti lascia il campo vuoto.

    Ora il tipo di errore lo conosci solo tu, perchè può variare in base a come hai costruito il tutto.

    Nel fatto specifico del codice vba che hai scritto, filtri tramite id un record e ti vengono visualizzati i dati corretti.
    A naso poi, dovresti ricevere qualche tipo di errore, visto che il codice non mi sembra giusto. Sopratutto quando tenti di aggiungere un nuovo record.

    Al momento che cerchi di aggiungere un nuovo record nella tabella figlia, il nuovo record è privo del codice id della tabella madre, quindi, se non ti da errore, access andrà a sovrascrivere il primo record che incontra nella tabella figlia, in base all'id della tabella madre che hai filtrato. Oppure non ti permette di aggiungerne altri.

    Quindi nel nuovo record che andrai a creare, dovrai aggiungere, oltre ai campi delle visite, anche il numero ID relativo all'anagrafica del paziente.
    E non si fa usando 

    DoCmd.GoToRecord , , acNewRec

    Ma in altre maniere, come ad esempio un codice di questo tipo.

    Ma anche questo è solo un metodo possibile.

    Tutto dipende da come sono collegate le tabelle e le query delle fonti dati delle varie maschere.

    Dim dbs As Database
    Dim rst As DAO.Recordset
    
    
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(tabella)
    
    For i = 1 To puntate
    With rst
    .AddNew
    !campouno = i
    !campodue = variabile o nome controllo
    !id = chiave primaria della tabella madre
    !campotre = variabile o nome controllo
    
    
    
    .Update
    
    End With
    Next i
    Forms![nomeform].Refresh
     DoCmd.Close acForm, "nomeform"

    Il codice aggiunge una quantità di record scelto dall'utente, in una tabella figlia con i vari dati che vengono presi dai controlli della maschera, più l'id della tabella madre.

    Naturalmente se togli il ciclo for next, aggiunge solo un record.

    E se togli il campo id, praticamente dovrebbe generarsi il problema che riscontri.

    Sempre che i collegamenti tra i campi master siano corretti e che le query della fonte dati delle maschere siano corrette.

    Ma se inserendo manualmente i dati tutto funziona, in teoria i collegamenti tra le maschere dovrebbero andare bene. Sempre che i dati all'interno delle tabelle siano collegati in modo giusto o che non ci siano campi NULL o vuoti.

    Oppure può capitare che avendo ad esempio tre tabelle molti a molti, se ometti una delle tabelle, riesci a visualizzare i dati corretti, ma non riesci ad aggiungerli, perchè manca un campo indispensabile per l'aggiornamento dei record, presente nella tabella che non hai inserito nella fonte dati.

    I casi sono molti, ma il problema riesci a risolverlo solo tu, facendo un attento debug passo passo.

    Noi possiamo fare solo ipotesi.

    Comunque perchè hai una tabella appuntamenti ed una tabella storico?

    Lo storico si genera quando serve prendendo i dati dalla tabella appuntamenti.

    Una terza tabella, che tra parentesi non so come riempi, genera solo una marea di problemi.
    Proprio questo genere di problemi.

    Ni… 

    Le mie tabelle sono 1 a molti (1 dipendente può avere tanti accertamenti da fare) e si, non ho applicato la integrità preferenziale. 

    Il codice che hai proposto non va bene perché non devo fare per tutti i record usando un contatore, devo creare 1 record alla volta. Nel caso specifico, se un dipendente ha fatto l'esame, inserisco la riga nella sottomaschera dello storico, che appunto è una procedura che faccio manualmente e volevo ottimizzare. 

    Perciò, ribadisco, che tutto l'informazione che mi serve è l'analisi del codice che ho postato sopra all'inizio del thred per capire perché non mi si crea un nuovo record nella sotto maschera. 

    Lunedi faccio lo screen degli errori e della SQL a cui viene appoggiata la maschera. 

    Provo a vedere il codice proposto levando la funzione next. Quando avrò il pc lunedì, grazie ?? 

    Comunque le tabelle sono collegate con la chiave 

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    05/08/2023 - Pattygirl ha scritto:


    l codice che hai proposto non va bene perché non devo fare per tutti i record usando un contatore, devo creare 1 record alla volta. Nel caso specifico, se un dipendente ha fatto l'esame, inserisco la riga nella sottomaschera dello storico, che appunto è una procedura che faccio manualmente e volevo ottimizzare

    Lo so che non va bene, ma ho copiato al volo un codice di un mio database.
    Nello specifico va ad aggiungere gli episodi di una determinata stagione di una determinata serie tv.
    Visto che ci sono serie tv con 12 stagioni e 30 episodi a stagione, tipo Big bang theory che sono 279 episodi, inserirli uno per volta diventava un lavoro.
    Quindi il ciclo mi serve solo per aggiungere un numero di record pari alle puntate. Ciclo che poi salvo nel record per identificare il numero della puntata.

    Quindi per aggiungere con un pulsante gli episodi, mi porto dietro due chiavi primarie delle precedenti tabelle, (nella query della fonte dati della maschera di inserimento per filtrare la serie e la stagione giusta) più naturalmente i dati da aggiungere, compreso il numero ID della stagione che è quello che collega stagione/puntata, nelle rispettive tabelle.
    In teoria vorresti fare una cosa del genere.

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    04/08/2023 - Pattygirl ha scritto:


    Come sei riuscito a risolvere? 

    Non sono riuscito.

    04/08/2023 - Pattygirl ha scritto:


    Non so lavorare con recordset, ammetto la mia ignoranza 

    Senza entrare in merito alla struttura del tuo database, che già altri stanno affrontando, cercando quindi di rispondere alla tua richiesta, prova questo codice, che utilizza appunto un Recordset.

    Private Sub Comando5_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "pianosanitario_m"
    stLinkCriteria = "[ID]=" & Me![IDAnagrafica]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Forms![PianoSanitario_M].SetFocus
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Tabella B", dbOpenDynaset)
    rs.AddNew
    rs!Accertamenti = Forms!PianoSanitario_M!Accertamento
    rs!DataUltima = Forms!PianoSanitario_M!SelData
    rs.Update
    Forms!PianoSanitario_M.Refresh
    rs.Close
    db.Close
    End Sub
    
  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    05/08/2023 - harry61 ha scritto:


    04/08/2023 - Pattygirl ha scritto:


    Come sei riuscito a risolvere? 

    Non sono riuscito.

    04/08/2023 - Pattygirl ha scritto:


    Non so lavorare con recordset, ammetto la mia ignoranza 

    Senza entrare in merito alla struttura del tuo database, che già altri stanno affrontando, cercando quindi di rispondere alla tua richiesta, prova questo codice, che utilizza appunto un Recordset.

    Private Sub Comando5_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "pianosanitario_m"
    stLinkCriteria = "[ID]=" & Me![IDAnagrafica]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Forms![PianoSanitario_M].SetFocus
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Tabella B", dbOpenDynaset)
    rs.AddNew
    rs!Accertamenti = Forms!PianoSanitario_M!Accertamento
    rs!DataUltima = Forms!PianoSanitario_M!SelData
    rs.Update
    Forms!PianoSanitario_M.Refresh
    rs.Close
    db.Close
    End Sub
    

    Grazie mille per la dritta, lunedì provo il codice. 

    Provo a vedere se riesco a trovare le istruzioni dei record set per capire meglio. 

    Ti ringrazio ancora e ti faccio sapere come va 

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    04/08/2023 - Pattygirl ha scritto:


    Ciao a tutti, qualche buon samaritano mi saprebbe dire dove sbaglio? Vi prego non ditemi tutto ! hahaahha

    Ciaoooo… come va, tutto bene?

    Forse in questo caso, con una sola riga di codice, potresti semplificare il tutto usando una semplice stringa sql e inserire il record nella tabella, poi a seguire farai il refresh o requery della maschera così da visualizzare il record appena inserito:

    DBEngine(0)(0).Execute "INSERT INTO TuaTabella (IdAnagrafica, Accertamenti, DataUltima) " & _
                           "VALUES (" & Me.IdAnagrafica & ", '" & Me.Accertamento & "', " & CStr(CLng(Me.DataUltima)) & ");"
    
    ' refresh form
    NomeTuaForm.Refresh oppure .Requery (dipende dal record source che hai usato per la Form)

    Non conosco la tua tabella in cui devi aggiungere il nuovo record e pertanto aggiungi le colonne necessarie da popolare, comunque la traccia sarebbe questa:

    • TuaTabella : da sostituire con il nome della tabella in cui inserire il record
    • le colonne della tabella da popolare:
      • IdAnagrafica
      • Accertamenti
      • DataUltima
      • …. eventuali altre colonne da popolare per la tabella
    • i dati da reperire per le colonne della tabella saranno:
      • Me.IdAnagrafica
      • Me.Accertamento
      • Me.DataUltima
      • …. eventuali altre informazioni da passare alle colonne da popolare per la tabella

    In pratica la stringa sql per INSERT INTO sarà:

    INSERT INTO TuaTabella (
    		IdAnagrafica
    		Accertamenti
    		DataUltima
    		)
    VALUES  ( 
    		Me.IdAnagrafica 
    		'Me.Accertamento'
    		CStr(CLng(Me.DataUltima))
    		)

    Se devi aggiungere altre colonne implementi la traccia che ti ho lasciato inserendo le eventuali colonne che ti occorrono e i valori da assegnare alle stesse.
    Fai attenzione a come passare le informazioni per i vari tipi di dati. 
    Per esempio le colonne di tipo Stringa li dovrai racchiudere tra Apicini: es… ‘Me.Accertamento’
    mentre per i campi numerici non c'è bisogno di racchiuderli tra apici.
    Per esempio la colonna di tipo Date dovrà essere racchiusa tra #: es… #Me.DataUltima#
    ma come vedi nell'istruzione sql la data viene convertiva e quindi in questo caso non serve passarla racchiusa tra #.


    ti lascio i link di approfondimento per il metodo:
    DBEngine object reference (DAO) | Microsoft Learn
    Istruzione INSERT INTO - Supporto tecnico Microsoft


    P.S. 
    non ti ho chiesto se devi o non devi eseguire taluni controlli prima di inserire il nuovo record… 
    Pe esempio:
    - se lo stesso viene inserito più volte? cioè se associ ad un pulsante il codice da eseguire per inserire il nuovo record… cosa accade se viene premuto più volte il pulsante?
    - se vengono aggiornati i dati del record che hai appena aggiunto ? dovrai aggiornare il record appena inserito con i nuovi valori, etc etc etc…

    Forse hai già provveduto per tali circostanze, ma se non fosse così sarà semplicemente sufficiente eseguire un test di esistenza record e decidere se inserire un nuovo record con (DBEngine INSERT INTO) oppure aggiornarlo con (DBEngine UPDATE) 
    Insomma con 3 righe di codice (3 stringhe Sql) fai tutto quello che ti occorre. 

    Esempio di implementazione e controlli:

    ' check record for insert or update
    If Not DBEngine(0)(0).OpenRecordset("SELECT * FROM TuaTabella WHERE TuaCondizioneRecordUnivoco & ";").EOF Then
    	' record update
       	DBEngine(0)(0).Execute "UPDATE TuaTabella SET Accertamenti = '" & Me.Accertamento & "', DataUltima = " & CStr(CLng(Me.DataUltima)) & " " & _
                               "WHERE TuaCondizioneRecordUnivoco & ";"
    Else
    	' record insert
        DBEngine(0)(0).Execute "INSERT INTO TuaTabella (IdAnagrafica, Accertamenti, DataUltima) " & _
                               "VALUES (" & Me.IdAnagrafica & ", '" & Me.Accertamento & "', " & CStr(CLng(Me.DataUltima)) & ");"
    End If

    Dove:

    - la prima stringa Sql verifica se esiste oppure no il record
    - la seconda stringa Sql aggiorna il record se esiste già nella tabella
    . la terza stringa Sql inserisce un nuovo record se non esiste nella tabella

    Mentre nella Where Condition dovrai inserire le colonne e/o campi chiave da testare per individuare il record univoco da inserire o da aggiornare. 


  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    06/08/2023 - By65Franco ha scritto:


    se lo stesso viene inserito più volte? cioè se associ ad un pulsante il codice da eseguire per inserire il nuovo record… cosa accade se viene premuto più volte il pulsante?

    Secondo me accade che il paziente deve sperare che non si tratti di una colonscopia…..  :)  :)  :)

    Ottima osservazione.

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    06/08/2023 - fratac ha scritto:


    Secondo me accade che il paziente deve sperare che non si tratti di una colonscopia…..  :)  :)  :)

    Allora in tal caso dovrai fare da cavia ahahahahahaha ;-))

    Voglio dire… qualcuno dovrà pur  fare il test se funziona il programma … o no ?  ;-))

    Vedo che sono in buona compagnia stamani… ma adesso però doccia e a dormire ;-)  l'ora è tarda…
    Ciaoooo fratac


    p.s. gli ho messo proprio adesso le 3 righe sql per fargli vedere come testare per decidere se aggiornare o inserire il record.

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    06/08/2023 - By65Franco ha scritto:


    04/08/2023 - Pattygirl ha scritto:


    Ciao a tutti, qualche buon samaritano mi saprebbe dire dove sbaglio? Vi prego non ditemi tutto ! hahaahha

    Ciaoooo… come va, tutto bene?

    Forse in questo caso, con una sola riga di codice, potresti semplificare il tutto usando una semplice stringa sql e inserire il record nella tabella, poi a seguire farai il refresh o requery della maschera così da visualizzare il record appena inserito:

    DBEngine(0)(0).Execute "INSERT INTO TuaTabella (IdAnagrafica, Accertamenti, DataUltima) " & _
                           "VALUES (" & Me.IdAnagrafica & ", '" & Me.Accertamento & "', " & CStr(CLng(Me.DataUltima)) & ");"
    
    ' refresh form
    NomeTuaForm.Refresh oppure .Requery (dipende dal record source che hai usato per la Form)

    Non conosco la tua tabella in cui devi aggiungere il nuovo record e pertanto aggiungi le colonne necessarie da popolare, comunque la traccia sarebbe questa:

    • TuaTabella : da sostituire con il nome della tabella in cui inserire il record
    • le colonne della tabella da popolare:
      • IdAnagrafica
      • Accertamenti
      • DataUltima
      • …. eventuali altre colonne da popolare per la tabella
    • i dati da reperire per le colonne della tabella saranno:
      • Me.IdAnagrafica
      • Me.Accertamento
      • Me.DataUltima
      • …. eventuali altre informazioni da passare alle colonne da popolare per la tabella

    In pratica la stringa sql per INSERT INTO sarà:

    INSERT INTO TuaTabella (
    		IdAnagrafica
    		Accertamenti
    		DataUltima
    		)
    VALUES  ( 
    		Me.IdAnagrafica 
    		'Me.Accertamento'
    		CStr(CLng(Me.DataUltima))
    		)

    Se devi aggiungere altre colonne implementi la traccia che ti ho lasciato inserendo le eventuali colonne che ti occorrono e i valori da assegnare alle stesse.
    Fai attenzione a come passare le informazioni per i vari tipi di dati. 
    Per esempio le colonne di tipo Stringa li dovrai racchiudere tra Apicini: es… ‘Me.Accertamento’
    mentre per i campi numerici non c'è bisogno di racchiuderli tra apici.
    Per esempio la colonna di tipo Date dovrà essere racchiusa tra #: es… #Me.DataUltima#
    ma come vedi nell'istruzione sql la data viene convertiva e quindi in questo caso non serve passarla racchiusa tra #.


    ti lascio i link di approfondimento per il metodo:
    DBEngine object reference (DAO) | Microsoft Learn
    Istruzione INSERT INTO - Supporto tecnico Microsoft


    P.S. 
    non ti ho chiesto se devi o non devi eseguire taluni controlli prima di inserire il nuovo record… 
    Pe esempio:
    - se lo stesso viene inserito più volte? cioè se associ ad un pulsante il codice da eseguire per inserire il nuovo record… cosa accade se viene premuto più volte il pulsante?
    - se vengono aggiornati i dati del record che hai appena aggiunto ? dovrai aggiornare il record appena inserito con i nuovi valori, etc etc etc…

    Forse hai già provveduto per tali circostanze, ma se non fosse così sarà semplicemente sufficiente eseguire un test di esistenza record e decidere se inserire un nuovo record con (DBEngine INSERT INTO) oppure aggiornarlo con (DBEngine UPDATE) 
    Insomma con 3 righe di codice (3 stringhe Sql) fai tutto quello che ti occorre. 

    Esempio di implementazione e controlli:

    ' check record for insert or update
    If Not DBEngine(0)(0).OpenRecordset("SELECT * FROM TuaTabella WHERE TuaCondizioneRecordUnivoco & ";").EOF Then
    	' record update
       	DBEngine(0)(0).Execute "UPDATE TuaTabella SET Accertamenti = '" & Me.Accertamento & "', DataUltima = " & CStr(CLng(Me.DataUltima)) & " " & _
                               "WHERE TuaCondizioneRecordUnivoco & ";"
    Else
    	' record insert
        DBEngine(0)(0).Execute "INSERT INTO TuaTabella (IdAnagrafica, Accertamenti, DataUltima) " & _
                               "VALUES (" & Me.IdAnagrafica & ", '" & Me.Accertamento & "', " & CStr(CLng(Me.DataUltima)) & ");"
    End If

    Dove:

    - la prima stringa Sql verifica se esiste oppure no il record
    - la seconda stringa Sql aggiorna il record se esiste già nella tabella
    . la terza stringa Sql inserisce un nuovo record se non esiste nella tabella

    Mentre nella Where Condition dovrai inserire le colonne e/o campi chiave da testare per individuare il record univoco da inserire o da aggiornare. 


    Ho provato il tuo codice e funziona alla grande!!! 

    il problema sta che il campo accertamenti della tabella B si tratta di una CBO che mi riporta i mesi di scadenza nella seconda colonna. Quando scelgo, un tipo di accertamento, mi riporta la tempistica che sta nella colonna 2  della cbo detto ciò, quando faccio girare il codice sql mi ci crea il nuovo record inserendo appunto il valore del campo senza che mi si venga aggiornato il campo.

    come da prima riga qui sotto, mentre gli altri inserimenti ho fatto manualmente per far vedere la riga come mi serve, con i campi calcolati.

    Ho provato ad inserire una riga di aggiornamento campo: ma da errore di debug

    me.accertamenti.requery

    Mi sa che mollo… va oltre le mie competenze fare questo lavoro… 

    però volevo ringraziare tanto per aver speso del tempo a darmi una mano e fare una spiegazione accurata della procedura, davvero! molto apprezzato e il codice, come mi hai spiegato mi ha aiutato ad imparare una qualcosa di nuovo!

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    05/08/2023 - harry61 ha scritto:


    04/08/2023 - Pattygirl ha scritto:


    Come sei riuscito a risolvere? 

    Non sono riuscito.

    04/08/2023 - Pattygirl ha scritto:


    Non so lavorare con recordset, ammetto la mia ignoranza 

    Senza entrare in merito alla struttura del tuo database, che già altri stanno affrontando, cercando quindi di rispondere alla tua richiesta, prova questo codice, che utilizza appunto un Recordset.

    Private Sub Comando5_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "pianosanitario_m"
    stLinkCriteria = "[ID]=" & Me![IDAnagrafica]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Forms![PianoSanitario_M].SetFocus
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Tabella B", dbOpenDynaset)
    rs.AddNew
    rs!Accertamenti = Forms!PianoSanitario_M!Accertamento
    rs!DataUltima = Forms!PianoSanitario_M!SelData
    rs.Update
    Forms!PianoSanitario_M.Refresh
    rs.Close
    db.Close
    End Sub
    

    Ho provato anche questo codice, me lo sono studiata e ho visto che c'erano degli errori di riferimenti delle mie tabelle e campi (es. Forms!PianoSanitario_M!Accertamento questo riferimento andrebbe messo quello della mia maschera A e non la maschera B quella di destinazione Giusto?)

    Ho provato ma non funziona, da errore …

    grazie anche te per avermi dato questa dritta del record set, provo a leggere di piu per capire il suo funzionamento.

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    07/08/2023 - Pattygirl ha scritto:


    il problema sta che il campo accertamenti della tabella B si tratta di una CBO che mi riporta i mesi di scadenza nella seconda colonna. Quando scelgo, un tipo di accertamento, mi riporta la tempistica che sta nella colonna 2  della cbo detto ciò, quando faccio girare il codice sql mi ci crea il nuovo record inserendo appunto il valore del campo senza che mi si venga aggiornato il campo.

    Ciao

    ma non devi mollare…. se il campo Accertamenti è una combobox allora dovrai impostare il valore che contiene la combobox che è in pratica la chiave di lettura della stessa.

    Non so come spiegartelo, diciamo che di norma la combobox contiene delle colonne 
    Di queste una colonna rappresenta il vero valore che viene memorizzato nel record della tabella

    Esempio : 

    • Se combobox ha 3 colonne e vengono popolate da una tabella per esempio accertamenti … di cui :
      • colonna 0 Id accertamenti
      • colonna 1 descrizione accertamenti
      • colonna 2 mesi Accertamenti
        • normalmente le dimensioni della combobox saranno: esempio…  0cm;2;cm;1cm e con colonna associata = 1
          • in questo modo l'id = alla colonna 0 non viene visualizzato, mentre la descrizione e i mesi verranno visualizzati
    • nel record devi memorizzare il valore della colonna 0

    quindi assicurati di impostare nel record la colonna corretta proveniente dalla combobox che se è di tipo Numerico perchè magari corrisponde ad un Id della tabella che l'ha popolata, ti basterà assegnare il valore della combobox colonna(0) e il gioco è fatto.

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    07/08/2023 - Pattygirl ha scritto:


    Ho provato anche questo codice, me lo sono studiata e ho visto che c'erano degli errori di riferimenti delle mie tabelle e campi (es. Forms!PianoSanitario_M!Accertamento questo riferimento andrebbe messo quello della mia maschera A e non la maschera B quella di destinazione Giusto?)

    Ho provato ma non funziona, da errore …

    Ho dedotto i riferimenti dal tuo codice.
    Comunque nella stringa:

    
    rs!Accertamenti = Forms!PianoSanitario_M!Accertamento

    “accertamenti” è il nome del campo nella [tabella B], mentre “accertamento” è il nome del controllo sorgente nella maschera PianoSanitario_M (o [maschera A] come la chiami tu).
    Detto questo, che errore ti da?

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    07/08/2023 - harry61 ha scritto:


    , mentre “accertamento” è il nome del controllo sorgente nella

    Allora praticamente la maschera sorgente (maschera A - AvvisiM) lavora sulla tabella appuntamentiT, mentre la maschera destino (è una sottomaschera - PianoSanitarioSM) sulla maschera B (PianoSanitarioM) che lavora su lla tabella pianosanitarioT, ho inserito il codice facendo riferimento alla sottomaschera.

    Girando il codice in questa maniera, mi da errore 3265 “elemento non trovato in questa raccolta”.

    Sicuramente è qualcosa legato ai riferimenti delle tabelle, ma non sapendo lavorare con questo metodo RS non saprei nemmeno cosa fare.

    stDocName = "pianosanitario_m"
    stLinkCriteria = "[ID]=" & Me![IDAnagrafica]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Forms![PianoSanitario_M].SetFocus
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("PianoSanitarioT", dbOpenDynaset)
    rs.AddNew
    rs!Accertamento = Forms!PianoSanitario_M!PianoSanitario_SM!Accertamenti
    rs!DataUltima = Forms!PianoSanitario_M!PianoSanitario_SM!SelData
    rs.Update
    Forms!PianoSanitario_M!PianoSanitario_SM.Refresh
    rs.Close
    db.Close
  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    07/08/2023 - By65Franco ha scritto:


    07/08/2023 - Pattygirl ha scritto:


    il problema sta che il campo accertamenti della tabella B si tratta di una CBO che mi riporta i mesi di scadenza nella seconda colonna. Quando scelgo, un tipo di accertamento, mi riporta la tempistica che sta nella colonna 2  della cbo detto ciò, quando faccio girare il codice sql mi ci crea il nuovo record inserendo appunto il valore del campo senza che mi si venga aggiornato il campo.

    Ciao

    ma non devi mollare…. se il campo Accertamenti è una combobox allora dovrai impostare il valore che contiene la combobox che è in pratica la chiave di lettura della stessa.

    Non so come spiegartelo, diciamo che di norma la combobox contiene delle colonne 
    Di queste una colonna rappresenta il vero valore che viene memorizzato nel record della tabella

    Esempio : 

    • Se combobox ha 3 colonne e vengono popolate da una tabella per esempio accertamenti … di cui :
      • colonna 0 Id accertamenti
      • colonna 1 descrizione accertamenti
      • colonna 2 mesi Accertamenti
        • normalmente le dimensioni della combobox saranno: esempio…  0cm;2;cm;1cm e con colonna associata = 1
          • in questo modo l'id = alla colonna 0 non viene visualizzato, mentre la descrizione e i mesi verranno visualizzati
    • nel record devi memorizzare il valore della colonna 0

    quindi assicurati di impostare nel record la colonna corretta proveniente dalla combobox che se è di tipo Numerico perchè magari corrisponde ad un Id della tabella che l'ha popolata, ti basterà assegnare il valore della combobox colonna(0) e il gioco è fatto.

    Quello lo so, Infatti, nella mia maschera, io uso inserisco il dato della seconda colonna in automatismo richiamando la seconda colonna della combo in cui metto la scadenza in mesi, ma traddure questa roba in sql da inserire nel codice, non lo saprei proprio fare. 

    Anche perchè il campo della combo, è sulla maschera stessa che devo caricare, mentre con sql stai lavorando direttamente sulla fonte dei record della tabella… Ho provato a fare un requery del campo, ma non funziona

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    07/08/2023 - harry61 ha scritto:


    07/08/2023 - Pattygirl ha scritto:


    Ho provato anche questo codice, me lo sono studiata e ho visto che c'erano degli errori di riferimenti delle mie tabelle e campi (es. Forms!PianoSanitario_M!Accertamento questo riferimento andrebbe messo quello della mia maschera A e non la maschera B quella di destinazione Giusto?)

    Ho provato ma non funziona, da errore …

    Ho dedotto i riferimenti dal tuo codice.
    Comunque nella stringa:

    
    rs!Accertamenti = Forms!PianoSanitario_M!Accertamento

    “accertamenti” è il nome del campo nella [tabella B], mentre “accertamento” è il nome del controllo sorgente nella maschera PianoSanitario_M (o [maschera A] come la chiami tu).
    Detto questo, che errore ti da?

    Private Sub AggiornaPS_Btn_Click()
    Dim stDocName As String
    Dim stLinkCriteria As String
    stDocName = "pianosanitario_m"
    stLinkCriteria = "[ID]=" & Me![IDAnagrafica]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Forms![PianoSanitario_M].SetFocus
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("AppuntamentiQ", dbOpenDynaset)
    rs.AddNew
    rs!Accertamento = Forms!PianoSanitario_M!PianoSanitario_SM!Accertamenti
    rs!DataUltima = Forms!PianoSanitario_M!PianoSanitario_SM!SelData
    rs.Update
    Forms!PianoSanitario_M!PianoSanitario_SM.Refresh
    rs.Close
    db.Close
    End Sub

    Se io cambio l'origine dei record per quello della mia maschera A - lavora su una query non sulla tabella come erroneamente avevo detto sopra… mi da un altro errore  3061 - parametri insufficienti, previsto 1 .

  • Re: Aggiornamento campi da tabella A alla sottomaschera di una tabella B

    Forse è più semplice darti un aiuto se posti un file di esempio, su un sito di condivisione tipo Dropbox, ecc…, con un minimo di dati sostiuendo quelli eventualmente sensibili.

Devi accedere o registrarti per scrivere nel forum
61 risposte