Curiosità su errore runtime 3167

di il
1 risposte

Curiosità su errore runtime 3167

Ciao,

premesso che ho già risolto dopo qualche sbattimento,
ma vorrei soddisfare la mia curiosità, in quanto ricercando su internet non ho trovato nulla a riguardo:

per prima cosa cancello questa tabella CurrentDb.Execute "DELETE * FROM [tbl_B]"

apro due recordset e copio i dati dalla tbl_A alla tbl_B
addnew e update nel ciclo con un do until EOF del recordset riferito alla tbl_A

esco dal ciclo

mi posiziono con un movefirst sul recordset della tbl_B

copio il primo valore in una variabile e ricevo errore runtime 3167 dato cancellato

ho risolto chiudendo e riaprendo il recordset della tbl_B prima di copiare il valore nella variabile

quello che faccio è:
svuotare la tbl_B
copiare i dati dalla tbl_A alla tbl_B
posizionarmi sul primo record della tbl_B e ciclare i dati (qui ho il problema dell'errore 3167 se non chiudo e riapro il recordset)

dato cancellato è chiaramente riferito allo svuotamento con il Delete

ciao a tutti

1 Risposte

  • Re: Curiosità su errore runtime 3167

    ocrot ha scritto:


    ...ma vorrei soddisfare la mia curiosità,
    Non so se riuscirò a soddisfare completamente la tua curiosità però... sarebbe interessante ripetere il tutto con queste indicazioni, per vedere se l'errore si ripete (cioè una soluzione diversa da quella che hai usato tu).

    ocrot ha scritto:


    per prima cosa cancello questa tabella CurrentDb.Execute "DELETE * FROM [tbl_B]"
    1) CurrentDb non si usa così. Si assegna ad un oggetto DAO.Database il risultato della funzione CurrentDb e si usa il metodo Execute dell'oggetto
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "DELETE * FROM [tbl_B]"
    a cui aggiungerei un dbFailOnError, il tutto all'interno di una Transaction, se proprio si vogliono fare le cose bene.
    Ovviamente chiusura e distruzione degli oggetti al termine.
    2) Imprecisione da forum, probabilmente: non stai cancellando la tabella ma il contenuto della tabella.
    apro due recordset e copio i dati dalla tbl_A alla tbl_B
    addnew e update nel ciclo con un do until EOF del recordset riferito alla tbl_A
    No, si usa una query di inserimento, molto più performante. Hai già un oggetto database dichiarato da prima da usare ancora con Execute e la transaction "aperta".
    Se tutto va bene, Commit, se ci sono errori Rollback. Fine.
    Dopo fai quello che devi fare sulla tbl_B
    Poi bisognerebbe sapere anche se stai usanto un database diviso in FE e BE, se in multiutenza con accesso concorrente e se il FE è usato contemporaneamente da vari utenti o ognuno ha il "suo proprio"
Devi accedere o registrarti per scrivere nel forum
1 risposte