Aggiornamento tabella access

di Hollywood il
2 risposte

Buongiorno a tutti.

Ho un programma che deve aggiungere un record ad una tabella di un dBase access.

Questo programma gira in una piccola rete domestica su diversi computer. In questo record c'è un numero che deve essere sequenziale. Ora accade che se due postazioni cercano di scrivere il proprio record nel database contemporaneamente, il numero non "aumenta" ma scrive lo stesso numero.

Il codice è quello sotto: leggo il numero dell'ultimo record, lo aumento di uno, e poi scrivo l'intero record.

Ecco a volte se l'operazione è "in contemporanea da due postazioni" mi ritrovo lo stesso numero. Ho provato anche ad usare le transazioni (se interessa posto anche quel codice), ma non cambia nulla se non il rallentamento dell'esecuzione.

Quindi chiedevo se qualcuno volesse dire la sua. Vi prego solo di non rilevare che il metodo è sbagliato, oppure che è al posto di quello devo usare quell'altro, se poi non è utile alla soluzione finale.

Orfano di Masterdrive.it ho visto che fra gli utenti di questo forum ci sono nomi che "conosco"... confido molto in buon consiglio.

Una Serena giornata a tutti!

Rem  ----- Leggo in db l'ultimo ordine ---------------------------------------------
sSql = "select numero from " & sTabella & " order by numero"
rs.Open sSql, CN, adOpenStatic, adLockReadOnly, adCmdText
   If Not rs.EOF Then
       rs.MoveLast
       iOrd = rs!numero + 1
   Else
       iOrd = 1
   End If
rs.Close
Rem  --------------------------------------------------------------------------------
sSql = "select * from " & sTabella & " order by numero"
rs.Open sSql, CN, 3, 3
rs.Find "numero = '" & iOrd & "'"
If rs.EOF Then
   Rem ------------------------------------------------------------
   Rem   INSERT
   Rem ------------------------------------------------------------
   rs.AddNew
   rs!ordine = iPagina
   rs!layout = "Landscape"
   rs!numero = iOrd
   rs!datacc = Date
   rs.Update
   rs.Close
Else
   Rem  codice per UPDATE
End If

2 Risposte

  • Non ti dirò cosa fare, perchè non lavoro con VB da una vita (reale), ne conosco a sufficienza Access, ma tendenzialmenteti direi che esistono le "cache".

    E' motto probabile che le tue letture vadano a leggere in realtà la cache e non il record reale. Questo è un problema che incontrai moltissimo tenpo fà lavorando con i db non multiutente dove la cache era diretta all'unica utenza ammessa.

    Sicuramente qualcuno potrà meglio illuminarti e darti una soluzione più concreta.

    Buona fortuna.

  • A mio avviso, la routine che hai scritto non consente di risolvere questo classico conflitto di concorrenza. Non esistono in access statements che consentano di frizzare la tabella, per evitare la doppia (o forse anche maggiore) lettura dell'ultimo numero, in questo caso, di ordine.

    Il mio suggerimento è quello di utilizzare una tabella dedicata ai contatori.
    A questo punto potresti gestirla così:

    Set rs = CurrentDb.OpenRecordset("SELECT * FROM TblContatori WHERE NomeContatore='Ordini'", dbOpenDynaset, dbPessimistic) 
    rs.Edit 
    nuovoOrdine = rs!UltimoNumero + 1 
    rs!UltimoNumero = nuovoOrdine 
    rs.Update 
    rs.Close

    Prelevato il numero e risolto il conflitto di concorrenza, lo utilizzi dove vuoi.

Devi accedere o registrarti per scrivere nel forum
2 risposte