Newsgroup: it.comp.lang.delphi
Titolo: Id Autoincrementale

Io ho D5 Ado e Access.
faccio Un Inserimento di un recor dove il mio Id č Un campo
autoincrementale.
Come faccio a sapere il valore del campo id senza fare una select o un
table.last di quella tabella?????
Questa tabella č una tabella dove piů utenti possono inserire record
contemporaneamente( + o - ).
           grazie per aiuto Damiano.

 table.last di quella tabella?????
Non credo tu possa farlo.
La soluzione è non usare un autoinc, ma assegnare il valore del campo dal
codice della tua applicazione.
Bye
AS

 table.last di quella tabella?????
Premetto che  D5+ AdoExpress + Access.
Non uso table, ma query ed evito i campi autoincremetali.
Non credo sia possibile senza rifare la query, perchè il campo è gestito dal
motore del Db e non da Delphi, e quindi leggibile solo dopo che il motore ha
provveduto a generarlo.
Spero di non avere detto ca@@ate.

 una select o un table.last di quella tabella?????
Senza fare una select o un riposizionamento non e' possibile.
Potresti bypassare il problema calcolando tu stesso il codice 
del nuovo record, pero' in questo caso stai molto attento 
alla multiutenza.  
L'uso dei campi autoincrementanti e' conveniente, quando si
e' in un ambiente multiutente, in cui si delega il controllo
dell'unicita' dei codici al db.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Aggiungo un suggerimento: se vuoi continuare ad usare
un campo autoincrementante, assegna ad ogni client nel
sistema un identificativo e introduci nel tuo record
un campo "owner".  In questo modo, quando un client 
inserisce un record, lo marca come proprio, successivamente
ti riposizioni con una condizione WHERE OWNER = idclient
e leggi l'id.  Un po' macchinoso, ma perlomeno efficace.



wrote:

Allora, forse č un tentativo di aiuto inutile, ma tentar non nuoce :)
In MSSQL faccio cosě;
esempio di query:
Insert Into TaskList (ID, TaskID, TimeID, StartTime, Status, NAS,
Port, CallerID, TotalBytesIn, TotalBytesOut, TotalPacksIn,
TotalPacksOut) values (:ID, :TaskID, :TimeID, :StartTime, 2, :NAS,
:Port, :CallerID, 0, 0, 0, 0)
select @@identity as MyID
    if TaskExists.IsEmpty then with AddTask.Parameters, Account do
begin
        ParamByName('ID').Value := User.ID;
        ParamByName('TaskID').Value := ATaskID;
        ParamByName('TimeID').Value := Start_TimeArg;
        ParamByName('StartTime').Value := ADate;
        ParamByName('NAS').Value := ANas;
        ParamByName('Port').Value := APort;
        ParamByName('CallerID').Value := ACallerID;
        AddTask.Open;
        NewID := AddTask.FieldByName('MyId').AsInteger;
        AddTask.Close;
        UpdateDetail(User, Account, NewID);
      end;
in pratica invece di fare un EXECSQL faccio un open e leggo il valore
@@Identity che torna l'ID autoinc.
Il problema č che non so se in access esista una variabile di sistema
che faccia la stessa cosa.
Ciao.
Massimo.
-- 
Ore 18.30: premo invio.

 autoincrementale.
Ciao, io ho appena risolto il tuo stesso problema salvando su un file il
numero dell'ultimo record inserito..
Matia Salsi


Hai perfettamente ragione. Non avevo pensato a questo aspetto anche perchè
non mi serviva ( e se devo essere sincero se mi fosse servito non avrei mai
pensato di risolvere in un altro modo al di fuori del file)
Chiedo scusa del consiglio errato.
Salsi Matia

 numero dell'ultimo record inserito..
Soluzione che, in determinati casi, puo' funzionare, ma che e'
equivalente a fare una select max sul campo o conservare l'ultimo
id in una tabella a parte (piu' pulito, secondo me, che utilizzare
un file esterno).  Il problema nasce quando sono in due (o +) a fare
gli inserimenti.  L'operazione complessiva di inserimento di un
nuovo record e lettura dell'id generato non e' atomica, nel senso
che non e' possibile serializzare queste operazioni in blocco.
Potresti avere, difatti, la seguente situazione:
istante t0: client A esegue l'inserimento
istante t1: client A esegue la select e ottiene l'id generato (1).
istante t2: client B esegue l'inserimento
istante t3: client B esegue la select e ottiene l'id generato (2).
in questo caso non ci sono problemi, ma purtroppo nessuno assicura
che le operazioni vengano serializzate in questo modo, mentre e'
possibilissimo avere:
istante t0: client A esegue l'inserimento
istante t1: client B esegue l'inserimento
istante t2: client A esegue la select e ottiene l'id generato (2).
istante t3: client B esegue la select e ottiene l'id generato (2).
In questo caso, come si puo' vedere, entrambi i client lavorano
sullo stesso record, mentre non dovrebbe essere cosi'.
