Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Aggiornamenti, campi univoci, Access97 in multiutenza, AbsolutePosition

Espongo il mio problema.
Gestisco una tabella con un campo chiave univoco dichiarato come long di cui
calcolo ogni volta il valore univoco tramite una mia funzione TrovaNuovoID
Public Function TrovaNuovoID(Connessione As ADODB.Connection, NomeTabella As
String, NomeID As String) As Long
Dim InTeoria As Long, id As Long, rs As Recordset, TuttoOK As Boolean
Dim Precedente As Long, InPratica As Long
    [....]
    [....]
End Function
Essa usa la connessione già aperta per aprire un nuovo recordset ordinandolo
per il campo chiave, quindi lo scorre per cercare ID mancanti, se non ne
trova restituisce il recordcount+1
In utenza singola funziona tutto perfettamente.
In multiutenza succede questo:
aggiungendo contemporaneamente o quasi contemporaneamente, con uno scarto di
circa cinque secondi, un record in entrambe le istanze dell'applicazione
succede che l'ID è lo stesso.
Private Sub cmdSal_Click()
    If status = adEditAdd Then   'variabile userdefined
        SalvaDati    'procedura che prende i valori dalla form e li mette
nei campi del record
        rs!id = Nav.TrovaNuovoID(Cn, "tab", "ID")    'vedi sopra
        pos = rs.RecordCount + 1    'variabile che uso al posto
dell'absolute position
    Else
        SalvaDati
    End If
    On Error Resume Next
        rs.Update
    If Err.Number <> 0 Then
        rs.CancelUpdate
        MsgBox "Si sono verificati errori di concorrenza sul record,
ripetere l'operazione", vbOKOnly, "Attenzione"
    End If
    status = adEditNone
    Check        'per aggiornare i vari command della form
End Sub
Volevo inoltre chiedere per quale motivo l'absoluteposition di un recordset
mi restituisce sempre -1 (MSDN: il valore non può essere calcolato- ebbhé?)
obbligandomi a gestire una variabile user defined
Concludo dicendo che uso VB6 e ADO
Grazie.

e perché non usi un campo autoincrementante?
Se non trovi il modo di eseguire il tutto in un'unica "botta" non risolverai
mai il problema...
Meglio quindi lasciare qualche buco tra gli id piuttosto che volerli tappare
a tutti i costi e creare questi problemi.
Con sql2000 potresti fare una function che ti restituisce il primo id vuoto
e fare tutto con un'unica transazione (begin transaction nome;....;commit
transaction nome); con access97 se vuoi perseverare su questa strada non so
bene cosa consigliarti...
Puoi settare un flag che indica che la tabella č bloccata in scrittura da un
utente mentre inserisci, ma se per caso il programma si blocca non risetta
piů il flag.....

 a tutti i costi e creare questi problemi.
Non esiste alcun modo per tappare i buchi degli ID usando i campi
autoincrementanti?
Compattando il database, reinizializzando qualche cosa, ecc ecc
Altrimenti, nella mia posizione, dopo un'annetto il mio utente/cliente, si
deve riscrivere tutto il database daccapo per non andare fuori range nel
campo id

No, non esiste nulla
per sql esiste un comandino per resettare l'id ma, anche ammesso e non
concesso che funzioni con access, non ti servirebbe a niente...
sempre con sql puoi fare un lock della tabella e, smadonnando parecchio,
qualcosa potresti riuscire a portare a casa, ma con access97 non so...