Newsgroup: it.comp.lang.visual-basic
Titolo: [DAO] Seek e ID

Ciao a tutti,
devo ricavare il primo ID non utilizzato da una tabella, quindi utilizzo una
funzione per assegnare manualmente l'ID impostando il campo come Numerico e
non come Contatore.
Ho realizzato così una piccola funzione per ricavare il nuovo ID (ovvero il
primo disponibile). Il problema è che in alcuni casi non funziona, mi
restituisce un ID già occupato quando devo salvare più di un record con un
ciclo FOR .. ADDNEW, ecc...
Ma stranamente se eseguo la funzione con F8, passo passo, mi restituisce
l'indice esatto.
Come posso risolvere questo problema?
saluti,
---------
Public Function fnNewID(ByVal sTable As String, _
 Optional ByVal sKey As String = "PrimaryKey") As Long
'
VARIABILI ------------------------------------------------------------------
    Dim dbMain  As Database
    Dim rsTbl   As DAO.Recordset
    Dim lIdx    As Long
    Dim lTmp    As Long
'
INIZIO ---------------------------------------------------------------------
    ' apro il database
    Set dbMain = DBEngine.Workspaces(0).OpenDatabase(sOptDBFile, _
 False, False, sOptDBPwd)
    ' apro la tabella specificata negli argomenti
    Set rsTbl = dbMain.OpenRecordset(sTable)
    ' inizio del ciclo di ricerca
    With rsTbl
        .Index = sKey
        Do
            Let lIdx = (lIdx + 1)
            .Seek "=", lIdx
            If .NoMatch Then Exit Do
        Loop    ' of EOF...
    End With    ' of rsTbl
    ' chiudo la tabella e il database
    rsTbl.Close
    dbMain.Close
    ' libero la memoria dagli oggetti
    Set rsTbl = Nothing
    Set dbMain = Nothing
    ' assegno il valore di ritorno alla funzione
    Let fnNewID = lIdx
'
FINE -----------------------------------------------------------------------
End Function

 
Prova ad aggiungere, dopo aver salvato ogni record:
DBEngine.Idle dbRefreshCache
ciao
		maxx

 DBEngine.Idle dbRefreshCache
Ti ringrazio ma nada de nada, quando provo a salvare mi duplica sempre i
valori dell'indice (3022)

"zerodefex" ha scritto:

Il problema dell'aggiornamento ritardato dopo una modifica è decisamente
fastidioso. Per risolverlo ci sono varie tecniche diverse a seconda dei
diversi motori di database utilizzati.
Secondo la guida effettivamente il metodo Idle con il parametro
dbRefreshCache dovrebbe essere un toccasana... in realtà a me non ha mai
funzionato.
Mi sa che dovrai "smanettare" un po' provando diverse impostazioni prima di
ottenere una buona soluzione. Mi permetto di dare un paio di consigli:
1) Se scrivi i dati con un recordset e poi li leggi dallo stesso recordset,
saranno sempre aggiornati (indipendentemente dal fatto che siano già stati
riportati fisicamente sul disco fisso) (!): il problema del mancato
aggiornamento è bypassato all'origine.
2) Se blocchi la tabella su cui stai scrivendo in modo completo (lo so, è
brutto...) non potrai sicuramente avere problemi di sdoppiamento indici.
3) Usa il Contatore o qualunque altra struttura automatica gestita dal
motore stesso! Ogni volta che puoi!! Non solo per comodità tua, ma anche per
questioni di prestazioni.
4) Considera la possibilità di inscrivere le tue azioni in opportune
transazioni
HTH
Ciao,
Carlo.

 transazioni
Grazie 1000! A dire il vero tutto è partito dalla necessità di conoscere
l'ID del record appena creato. Mi sa che dovrò utilizzare @@IDENTITY ma
spero non mi rallenti il tutto.
saluti,

 spero non mi rallenti il tutto.
Beh, subito dopo l'aggiornamento puoi interrogare il motore e farti
restituire l'Id appena creato. Prova!..
Ciao,
Carlo.

Con un SELECT o esiste qualche funzione apposita?


 Con un SELECT o esiste qualche funzione apposita?
No, con una normale lettura. Basta che nel recordset di update inserisci
anche il campo Id.
Esempio con DAO:
...
recArchivio.Edit
recArchivio.Fields("Codice").Value = "Nuovo codice"
recArchivio.Update
Id = recArchivio.Fields("Id").Value
...
Per ADO non esiste il metodo Update e ti regoli di conseguenza.
Ciao,
Carlo.

> Id = recArchivio.Fields("Id").Value
Purtroppo questo metodo funziona solo con MDB Access 2000 e non con Access
97 e comunque non con il primo record.
cmq grazie

 97 e comunque non con il primo record.
Mi duole correggerti: io l'ho usato proprio con Access 97 e anche col primo
record.
Ciao,
Carlo.

 ha scritto nel messaggio
news:9u52f8$i5e$1...@pegasus.tiscalinet.it...


 Per ADO non esiste il metodo Update e ti regoli di conseguenza.
esiste eccome! Solo che a differenza di Dao se ti sposti su un altro record
viene eseguito implicitamente.
Se però vuoi sapere il valore del campo contatore appena inserito devi fare
proprio così:
esegui update, e poi leggi il valore del campo contatore
ciao
Alfonso