DAO Recordset su tabelle collegate

di il
25 risposte

DAO Recordset su tabelle collegate

Salve a tutti,

ho da poco iniziato ad usare MS Access a lavoro e premetto che non sono un esperto.

In particolare, ho creato da zero (seguendo tutorial qua e la) un database di gestione scadenze e relativi pagamenti.

Inizialmente il db veniva utilizzato da una sola persona, ma ora è nata la necessità di essere gestito da più persone simultaneamente.

Ho quindi spostato il db in una cartella condivisa nella rete aziendale e creato, tramite la procedura guidata di access, be (che contiene le sole tabelle) e fe (che contiene tabelle collegate e tutto il resto).

Ora, veniamo al problema..

Oltre ad altre, ho due tabelle che contengono rispettivamente scadenze e pagamenti che si chiamano “T_Scadenze” e “T_Pagamenti”.

In una delle maschere, in particolare quella per inserire un pagamento effettuato, ho il seguente codice:

Private Sub cmdSalva_Click()

Dim Rs1 As DAO.Recordset
Dim rowCount As Long

…

Set Rs1 = CurrentDb.OpenRecordset("T_Scadenze", dbOpenTable)
rowCount = Rs1.RecordCount
For row = 0 To rowCount - 1
       If Rs1.Fields("IDScadenza") = [IDScadenza].Value Then
               Rs1.Edit
               Rs1.Fields("Residuo") = Rs1.Fields("Residuo") - [Importo]
               Rs1.Update
       If Rs1.Fields("Residuo") = 0 Then
           Rs1.Edit
           Rs1.Fields("Pagata") = 1
           Rs1.Update
       End If
       End If
       If row <> rowCount - 1 Then
           Rs1.Move (1)
       End If
Next
Rs1.Close
Set Rs1 = Nothing
…
End Sub

Praticamente lo scopo di questa Sub è quella di aggiornare i campi della tabella “T_Scadenze”, in particolare l'importo residuo della specifica fattura e impostare il campo “pagata” come "vero" nel caso in cui il pagamento sia uguale all'importo residuo da pagare.

Il problema nasce ora che ho “spostato fuori” le tabelle, in quanto va in errore l'istruzione:

Set Rs1 = CurrentDb.OpenRecordset("T_Scadenze", dbOpenTable)

Mi dice “Errore di run-time ‘3219’: Operazione non valida”. Immagino che sia perché non riesce a “raggiungere” la tabella..

Mi sapreste gentilmente indicare una possibile soluzione al problema?

Grazie mille

Jacopo

25 Risposte

  • Re: DAO Recordset su tabelle collegate

    Personalmente non capisco perché ricorri al metodo update del recordset anziché ricorrere ad una action query per aggiornare le tabelle. Apparte questo se sposti le tabelle in un posto diverso da dove il codice si aspetta di trovarle, cosa c'è di strano? Ad ogni modo sospetto che non sia quello il motivo. Prova a sostituire dbOpenTable con dbOpenDynaset.

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - Antony73 ha scritto:


    Personalmente non capisco perché ricorri al metodo update del recordset anziché ricorrere ad una action query per aggiornare le tabelle. Apparte questo se sposti le tabelle in un posto diverso da dove il codice si aspetta di trovarle, cosa c'è di strano? Ad ogni modo sospetto che non sia quello il motivo. Prova a sostituire dbOpenTable con dbOpenDynaset.

    Ciao Antony,

    grazie per la tua risposta.

    Avevo già provato ad usare dbOpenDynaset  ma non si risolve il problema.. nel senso che non da errore, ma non aggiorna nemmeno la tabella.. :)

  • Re: DAO Recordset su tabelle collegate

    Ad ogni modo c è qualcosa di oscuro nella tua spiegazione… ad esempio il fatto di aver “spostato fuori” le tabelle".

  • Re: DAO Recordset su tabelle collegate

    Con “spostato fuori” le tabelle intendevo dire che prima era un unico e solo database con tabelle, query, etc etc tutto insieme.

    Poi ho dovuto dividerlo in fe e be e quindi le tabelle sono finite in un file diverso da quello utilizzato dagli utilizzatori finali.

    Non ho comunque spostato il file dopo aver “diviso in 2” il db (con questo intendo dire che il collegamento funziona).

  • Re: DAO Recordset su tabelle collegate

    Usare una query di UPDATE sarebbe meglio… ma il codice è scritto male contiene un massacro di errori… in particolare l'ultima parte….

    If row <> rowCount - 1 Then
        Rs1.Move (1)
    End If

    Cosa pensi faccia questo codice…?

    Ti risposta ad 1… ma il valore ROW del ciclo si incrementa ma non sincronizza il Recordset… quindi sei sempre sullo stesso Record… ERRORE

    Non solo tenti di forzare l'EDIT e l'UPDATE 2 volte… assurdo…

    Manca la gestione errori…!

    Poi Apri un Recordset chiamato RS ed usi RS1… insomma hai scopiazzato malissimo senza nemmeno capire quello che devi fare, l'inizio è comlicato…!

    Il Recordset si scorre e modifica così:

    Private Sub cmdSalva_Click()
    Dim rs As DAO.Recordset
    
    Set rs = CurrentDb.OpenRecordset("T_Scadenze", dbOpenTable)
    rs.MoveFirst
    Do Until rs.Eof
       If Rs.Fields("IDScadenza") = [IDScadenza].Value Then
           Rs.Edit
           Rs.Fields("Residuo") = Rs.Fields("Residuo") - [Importo]
           If Rs.Fields("Residuo") = 0 Then Rs.Fields("Pagata") = 1
           Rs.Update
        End If
    	rs.MoveNext
    Loop
    Rs.Close
    Set Rs = Nothing
    
    End Sub
  • Re: DAO Recordset su tabelle collegate

    Ciao @Alex

    io per le tabelle collegate ho sempre usato il dbOpenDynaset

    Set rs = CurrentDb.OpenRecordset("T_Scadenze", dbOpenDynaset)

    Condivido in pieno quanto da te esposto, ma a mio avviso mi sembra che si scorra tutta la tabella per aggiornare un solo record, quello con un certo ID

    E la Where non si usa più ? boh, forse mi sfugge qualcosa. ;)

    Comunque una stringa Sql Update andrebbe usata senza ombra di dubbio.

    Ma tu @Alex tutta questa pazienza dove la trovi? come fai?  ;))

  • Re: DAO Recordset su tabelle collegate

    Ciao Alex!

    Grazie mille anche a te per l'interesse/aiuto.

    Come ho detto all'inizio, sono praticamente all'inizio.

    04/05/2023 - @Alex ha scritto:


    If row <> rowCount - 1 Then
        Rs1.Move (1)
    End If

    Cosa pensi faccia questo codice…?

    Ti risposta ad 1… ma il valore ROW del ciclo si incrementa ma non sincronizza il Recordset… quindi sei sempre sullo stesso Record… ERRORE

    In realtà questo pezzo di codice l'ho “creato di sana pianta” perché il ciclo mi dava errore quando c'era un solo record nella tabella.

    Se non mi ricordo male “Move (1)” non si muove sul primo record, ma va avanti di 1... quindi questo mi serviva per evitare di andare avanti col ciclo in caso di ultimo record. Però ho appena imparato grazie a te che esistono “Do Until”, “eof” e “Loop”.

    04/05/2023 - @Alex ha scritto:


    Non solo tenti di forzare l'EDIT e l'UPDATE 2 volte… assurdo…

    Su questo faccio mea culpa, sono ignorante.. pensavo che l'istruzione valesse una volta per campo..

    04/05/2023 - @Alex ha scritto:


    Poi Apri un Recordset chiamato RS ed usi RS1…

    Questo non l'ho capito.. dove ho aperto un recordset chiamato RS? A me pare di averlo chiamato sempre RS1.. :)

    04/05/2023 - @Alex ha scritto:


    insomma hai scopiazzato malissimo senza nemmeno capire quello che devi fare

    In realtà è il contrario.. ho "scopiazzato" cercando di adattare e usando le mie competenze.. ecco perché risulta una "schifezza".. :)

    Comunque grazie mille per le annotazioni e per il codice corretto, ma secondo me non mi risolve il problema iniziale.. :(

  • Re: DAO Recordset su tabelle collegate

    Ciao Franco, grazie anche a te per l'intervento!

    04/05/2023 - By65Franco ha scritto:


    Ciao @Alex

    io per le tabelle collegate ho sempre usato il dbOpenDynaset

    Set rs = CurrentDb.OpenRecordset("T_Scadenze", dbOpenDynaset)

    Condivido in pieno quanto da te esposto, ma a mio avviso mi sembra che si scorra tutta la tabella per aggiornare un solo record, quello con un certo ID

    E la Where non si usa più ? boh, forse mi sfugge qualcosa. ;)

    Comunque una stringa Sql Update andrebbe usata senza ombra di dubbio.

    Ma tu @Alex tutta questa pazienza dove la trovi? come fai?  ;))

    Confermo.. come detto, tale codice viene usato quando si tenta di inserire un pagamento di una fattura.. il ciclo serve a individuare tale fattura nella tabella “T_Scadenze” (tramite ID) e aggiornare i campi “residuo” e “pagata”.

    04/05/2023 - By65Franco ha scritto:


    Comunque una stringa Sql Update andrebbe usata senza ombra di dubbio.

    Sareste così gentili da illuminarmi meglio su tale concetto?

    Potrei usare una query per aggiornare i dati nella tabella anziché “entrarci” tramite il recordset?

    Grazie! :)

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - DrJack89 ha scritto:


    Comunque grazie mille per le annotazioni e per il codice corretto, ma secondo me non mi risolve il problema iniziale.. :(

    Perdonami, ma devi aggiornare solo un record ? quello che corrisponde all'ID ?

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - By65Franco ha scritto:


    04/05/2023 - DrJack89 ha scritto:


    Comunque grazie mille per le annotazioni e per il codice corretto, ma secondo me non mi risolve il problema iniziale.. :(

    Perdonami, ma devi aggiornare solo un record ? quello che corrisponde all'ID ?

    Sì, ma non è così semplice..

    Nel senso che la maschera nella quale “parte” il codice in questione ha come origine record la tabella “T_Pagamenti” che contiene, appunto, tutti i pagamenti eseguiti.

    Quindi oltre a inserire i dati del pagamento come nuovo record della “T_Pagamenti”, il bottone “salva” che lancia il codice mi deve anche aggiornare il record relativo alla fattura a cui si riferisce il pagamento con importo residuo e con pagata (si/no) che si trova in un'altra tabella ("T_Scadenze").

    Grazie di nuovo per l'aiuto.

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - DrJack89 ha scritto:


    Sì, ma non è così semplice..

    Nel senso che la maschera nella quale “parte” il codice in questione ha come origine record la tabella “T_Pagamenti” che contiene, appunto, tutti i pagamenti eseguiti.

    Quindi oltre a inserire i dati del pagamento come nuovo record della “T_Pagamenti”, il bottone “salva” che lancia il codice mi deve anche aggiornare il record relativo alla fattura a cui si riferisce il pagamento con importo residuo e con pagata (si/no) che si trova in un'altra tabella ("T_Scadenze").

    In realtà è semplice … 

    ' update T_Scadenze table
    DBEngine(0)(0).Execute "UPDATE T_Scadenze SET Residuo = Residuo-" & Me.Importo & ", " & _
                           "Pagata = IIf(Residuo-" & Me.Importo & "=0, True, False) " & _
                           "WHERE IDScadenza=" & Me.IDScadenza & ";"

    Ho dato per scontato che Importo e IdScadenza provengano dalla Form e li ritrovi con il suffisso Me.
    E ho dato per scontato che SI/NO corrispondano a True/False

    Verifica e controlla, prova e riprova e fai sapere ;)

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - By65Franco ha scritto:


    In realtà è semplice … 

    ' update T_Scadenze table
    DBEngine(0)(0).Execute "UPDATE T_Scadenze SET Residuo = Residuo-" & Me.Importo & ", " & _
                           "Pagata = IIf(Residuo-" & Me.Importo & "=0, True, False) " & _
                           "WHERE IDScadenza=" & Me.IDScadenza & ";"

    Ho dato per scontato che Importo e IdScadenza provengano dalla Form e li ritrovi con il suffisso Me.
    E ho dato per scontato che SI/NO corrispondano a True/False

    Verifica e controlla, prova e riprova e fai sapere ;)

    Franco, grazie per il codice..

    l'ho testato ed ha funzionato correttamente alla prima esecuzione, ma la cosa strana è che ora se provo a rieseguirla mi da “Errore di run-time ‘3144’: errore di sintassi  nell'istruzione UPDATE” (ovviamente non ho cambiato nulla)..

    Da cosa può dipendere?

    Grazie di nuovo

  • Re: DAO Recordset su tabelle collegate

    Vai in Debug mettendo un punto di interruzione su DbEngine(0)(0)

    Quando si ferma l'esecuzione a tale istruzione apri finestra immediata e copia incolla tutta la stringa:

    CTRl-G per aprire finestra immediata, metti il ? e incolli quanto segue:

    
    ? "UPDATE T_Scadenze SET Residuo = Residuo-" & Me.Importo & ", " & _
                           "Pagata = IIf(Residuo-" & Me.Importo & "=0, True, False) " & _
                           "WHERE IDScadenza=" & Me.IDScadenza & ";"

    Premi INVIO e vedi come risolve la stringa 
    Analizza e trova i valori non validi

  • Re: DAO Recordset su tabelle collegate

    04/05/2023 - By65Franco ha scritto:


    Ciao @Alex

    io per le tabelle collegate ho sempre usato il dbOpenDynaset

    Set rs = CurrentDb.OpenRecordset("T_Scadenze", dbOpenDynaset)

    Condivido in pieno quanto da te esposto, ma a mio avviso mi sembra che si scorra tutta la tabella per aggiornare un solo record, quello con un certo ID

    E la Where non si usa più ? boh, forse mi sfugge qualcosa. ;)

    Comunque una stringa Sql Update andrebbe usata senza ombra di dubbio.

    Ma tu @Alex tutta questa pazienza dove la trovi? come fai?  ;))

    Io non ne ho molta… quindi man mano che invecchio rispondo sempre meno… ;-)

    Per il RS hai ragione, non ci avevo fatto caso deve essere dbOpenDynaset, e sicuramente deve usare una Query Action.

Devi accedere o registrarti per scrivere nel forum
25 risposte