Newsgroup: it.comp.appl.access
Titolo: ancora su contatore in rete

Ho preso spunto da questa funzione trovata su internet per la numerazione 
progressiva  di documenti in rete.
Si appoggia a una tabella (ContatoreCassa) che ha un unico campo 
(idcontatore).
In origine era per DAO ma,anche per fare pratica,l'ho modificata per ADO.
Funziona tutto OK,ma in rete con 2 o più computer che fanno la stessa 
operazione nello stesso momento,e sottolineo solo nello stesso momento, 
quella cioè di inserire un nuovo numero a volte va in errore,oppure mi 
assegna lo stesso IdContatore a più computer,
Qualcuno mi potrebbe spiegare come risolvere il problema ?
Passo il codice
 lancio la funzione
      Me.TxtNumOrdine = Cnt_Cassa()
che esegue la seguente function
 Public Function Cnt_Cassa() As Integer
 Dim Cnt As Integer
Dim RsCntCassa As ADODB.Recordset
On Error GoTo Cnt_Cassa_err
strSQL = "select * from ContatoreCassa "
Set RsCntCassa = New ADODB.Recordset
RsCntCassa.Open (strSQL), CurrentProject.Connection, adOpenStatic, 
adLockPessimistic
Cnt = RsCntCassa!IdContatore
    RsCntCassa!IdContatore = Cnt + 1
    Cnt = RsCntCassa!IdContatore
    RsCntCassa.Update
        Cnt_Cassa = Cnt
   RsCntCassa.UpdateBatch
    RsCntCassa.Close
Set RsCntCassa = Nothing
 Exit Function
Cnt_Cassa_err:
            MsgBox "Errore " & Err.Number & ": " & Err.Description
        If Err.Number <> 0 Then Resume
    End
End Function
Grazie per la disponibilità
Ciao a tutti
Maurizio 

 ha scritto nel messaggio 
news:48aab900$0$41654$4faf...@reader4.news.tin.it...

Non risponde alla tua specifica domanda...ma...se usassi il campo contatore?
Forse con ADO eviti la routine...dico forse pperchè io uso DAO (che risulta 
anche più veloce...almeno cossì dicono ;-) )
Ciao
-- 
Roberto da Parma 

 ha scritto nel messaggio 
news:g8f0nk$fdj$1...@tdi.cu.mi.it...

Forse ho posto male la questione...
Preciso che il campo IdContatore è un campo numerico (non contatore)che 
naturalmente aggiorno,azzero o inserisco un numero tramite apposite 
funzioni.,
quindi la tabella è sempre composta da 1 record .
il mio problema è che pur avendo il cursore adLockPessimistic ,2 computer 
che accedono nello stesso istante al record, lo trovino tutti e 2 libero e 
prendano lo stesso valore iniziale restituendo poi lo stesso valore finale 
alle rispettive macchine.
è possibile questo ?
Esiste  un modo per ovviare al problema ?
Grazie ancora
Ciao
Maurizio 

 ha scritto nel messaggio 
news:48ab16ff$0$1085$4faf...@reader2.news.tin.it...

Prova a salvare subito il record.
Appena viene attribuito il valore al campo salva il record.In questo modo 
dovresti ovviare.


 ha scritto nel messaggio 
news:48aab900$0$41654$4faf...@reader4.news.tin.it...

Questo spezzone:
Cnt = RsCntCassa!IdContatore
attribuisce a Cnt il primo id del recordset ADO che è aperto come set di 
record statico...
Non conosco ADO ma mi sembra che qualcosa non quadra:
tu dovresti ricavare l'ultimo ID inserito o, in mancanza di questo, 
impostare a 1 il Cnt.
Ma non ti posizioni sull'ultimo id! In più hai un recordset statico e non 
aggiornabile (dovresti usare adOpenDynamic).
(Al massimo potresti usare i vari MoveFirst, MoveLast per posizionarti 
sull'ultimo ID inserito.)
Cose da controllare:
usi adLockPessimistic invece che adLockBatchOptimistic;
usi adOpenStatic;
UpdateBatch non funziona con tutti i tipi di recordset;
non usi il parametro AffectRecords (p.e. adAffectCurrent) per determinare se 
aggiornare tutti i record o solo il record corrente/modificato;
non capisco perchè usi sia Update che UpdateBatch quando basterebbe il solo 
secondo per richiamare automaticamente anche il primo;
in ultimo la procedura, in caso di errore (per la concorrenza) va a buon 
fine ugualmente se NON hai fatto una gestione degli errori.
Ciao, Carlo 

cut
 Sono ancora impantanato...
per ora ho risolto cosě gestendo gli errori
Public Function Cnt_Cassa() As Integer
 Dim Cnt As Integer
    On Error GoTo Cnt_Cassa_err
    StrSql = "select * from ContatoreCassa "
    Dim RsCntCassa As ADODB.Recordset
    Set RsCntCassa = New ADODB.Recordset
    RsCntCassa.Open (StrSql), CurrentProject.Connection, adOpenDynamic, 
adLockBatchOptimistic
        'I = I + 1
        Cnt = RsCntCassa!IdContatore
        RsCntCassa!IdContatore = Cnt + 1
        DoCmd.Save
        RsCntCassa.UpdateBatch
        Cnt = RsCntCassa!IdContatore
        Cnt_Cassa = Cnt
RsCntCassa.Close
Set RsCntCassa = Nothing
 Exit Function
' se in errore...
Cnt_Cassa_err:
'
If MsgBox("Errore " & Err.Number & ": " & Err.Description & Chr(13) _
& "Vuoi riprovare a fare un nuovo ordine ?" & Chr(13), vbYesNo + vbQuestion 
+ vbDefaultButton2, "Database occupato") = vbNo Then
    Exit Function
        Else
                Cnt_Cassa
        MsgBox "Per fare un nuovo ordine seleziona NUOVO", vbInformation, 
"Numero scontrino a 0 "
End If
End Function
Comunque credo di non avere intoppato il modo giusto per gestire questo 
contatore in rete.
Ringrazio CARLO e ROBERTO per il tempo dedicatomi.
Se qualcuno ha un sistema che funziona e volesse spiegarmelo gliene sarei 
grato
Ciao a tutti
Maurizio 

 ha scritto nel messaggio 
news:48adf78c$0$1088$4faf...@reader1.news.tin.it...

La butto lě...e se usassi una cosa del tipo
RsCntCassa!IdContatore = DMax(...) + 1 ???
