Access Crash su modifica record

di il
4 risposte

Access Crash su modifica record

Buongiorno,

sto sbattendo la testa con questo problema che non riesco ad aggirare.

Access va in crash come provo a modificare qualsiasi campo di una tabella locale.

Eseguendo il codice seguente in debug Access si arresta cercando di eseguire la riga 

Rs.Fields("Action") = 8

Private Sub TxtOra_AfterUpdate()
    Dim Rs As Recordset
    Set Rs = CurrentDb.OpenRecordset("LOC_ras_AttRecord", dbOpenDynaset)
    Rs.MoveLast
    Rs.FindFirst ("[DIN] =" & DIN & " AND [Clock] = #" & Format(DataOra, "yyyy/mm/dd hh:mm:ss") & "#")
    If Rs.NoMatch Then
        MsgBox "Non trovo il record relativo nella tabella LOC_ras_AttRecord"
        Exit Sub
    End If
    Debug.Print Rs.Fields("Clock") & "<-" & CDate(Format(Me.TxtData, "yyyy/mm/dd") & " " & Me.TxtOra)
    Rs.Edit
    Rs.Fields("Action") = 8
    Rs.Fields("Clock") = CDate(Format(Me.TxtData, "yyyy/mm/dd") & " " & Me.TxtOra)
    Rs.Fields("CollectDate") = Now
    Rs.Update
    Rs.Close
    Forms!Presenze!Sottomaschera_Timbrature2_CampiIncrociati.Requery
End Sub 

Ho provato a modificare l'ordine dei campi da modificare ma niente. Va in crash qualsiasi campo provi a toccare.

Suggerimenti?

4 Risposte

  • Re: Access Crash su modifica record

    Nono ci sono molti elementi per capire lo scenario… provo a suggerire qualche spunto che mi viene all'occhio:

    • Apertura del Recordset in modalità dbOpenTable se è una tabella e non una Query, anche se mi chiedo perchè aprire TUTTA la tabella per poi cercare il Record quando con una SELECT e WHERE condition si limita il traffico dati e sei ottimizza la velocità del codice…!!!!! 
    • Dichiarazione DAO.Recordset
    • Il Campo Clock lo gestirei in modalià semplificata [Clock] = " & str(cdbl(DataOra)
    • Dal momento che non ti serve sapere quanti Records ci sono il MoveLast lo implementerei subito dopo con il MoveFirst, oppure nulla… di fatto non serve

    Temo che il 1° sia quello che risolve.

    Set Rs = CurrentDb.OpenRecordset("SELECT * FROM LOC_ras_AttRecord WHERE [DIN] =" & DIN & " AND [Clock]=" & str(cDbl(DataOra)),dbOpenDynaset)
    If Rs.Bof And rs.Eof Then
            MsgBox "Non trovo il record relativo nella tabella LOC_ras_AttRecord"
            Exit Sub
    End If
    Rs.Edit
    ....
  • Re: Access Crash su modifica record

    Ciao Alex, 

    grazie per la risposta fulminea.

    Il problema con dbOpenTable è che il metodo Find non funziona e non so usare .Seek con indici multipli (Clock e DIN) (Suggerimeti ben accetti)

    Il secondo e terzo punto non risolvono

    Effettivamente il .movelast lo avevo messo solo perchè in debug avevo messo un recordcount

    Ho aggirato il problema con un predicato SQL di aggiornamento ma rimango comunque basito del comportamento sopra.

  • Re: Access Crash su modifica record

    Seek  non si usa se sono LINKED TABLE, anche se tu non lo specifichi… immagino lo siano.

    Corretto che il FindFirst non funzioni su Rs di tipo OpenTable, ma come ti ho mostrato usando la SELECT ottieni 2 vantaggi, e questo non comprendo perchè tu non l'abbia ritenuto come prioritario…!

    Cioè perchè ritieni sia meglio aprite una Tabella in OpenTable, scorrere l'intero RS per arrivare ad un Singolo Record, piuttosto che Estrarre solo il Record che serte e dedicarti a quello…?

    Dovresti analizzare il traffico dati che generi con il tuo sistema… quando si lavora in modalità Client-Server questi aspetti non sono secondari.

    Peraltro se fai una Query UPDATE è ancora più performante.

  • Re: Access Crash su modifica record

    24/11/2022 - @Alex ha scritto:


    Seek  non si usa se sono LINKED TABLE, anche se tu non lo specifichi… immagino lo siano.

    No, è una tabella locale ma non so usare Seek con due criteri su [DIN] e [Clock]

    24/11/2022 - @Alex ha scritto:


    Cioè perchè ritieni sia meglio aprite una Tabella in OpenTable, scorrere l'intero RS per arrivare ad un Singolo Record, piuttosto che Estrarre solo il Record che serte e dedicarti a quello…?

    Non lo Ritengo affatto! Anzi, ho colto al volo il suggerimento ma va in crash lo stesso

    Come già detto ho risolto con Query Update che, come sottolinei tu, è preferibile.

    Mi rimane comunque il dubbio sul perchè si inchiodi in quel modo.

    In ogni caso 

    Grazie

Devi accedere o registrarti per scrivere nel forum
4 risposte