Newsgroup: it.comp.lang.visual-basic
Titolo: [Database] Conoscere l'ID di un nuovo record

Ho una tabella con un contatore come indice. 
Vorrei sapere se, quando salvo un nuovo record, posso sapere in
anticipo il valore del contatore.
Io l'unico modo che ho trovato e' di riaprire la tabella ordinando
secondo ID e andando a leggere l'ID dell'ultimo record. Mi sembra
strano pero' che non ci sia una via piu' breve...
Non posso leggere prima di aggiungere il record l'ultimo valore del
contatore perche' l'ultimo veramente aggiunto potrebbe essere stato
cancellato...
Grazie a tutti quelli che mi risponderanno..
Ciao 
Marco

 Ho una tabella con un contatore come indice.
WARNING...fa attenzione.
Se usi il contatore (mi immagino che usi Access) perchè vuoi saperlo prima?
Dice che te frega....a me nulla ma fa attenzione.
Il contatore in Access viene usato per identificare in maniera univoca
(secondo me a sproposito molto spesso) un record.
Ma non è sequenziale eh!o meglio è sequenziale (1,2,3....e se lo scegli)ma
non si riordina quindi non va bene per numerare articoli se vuoi che siano
sempre conseguenti l'uno a l'altro!
Non ci puoi fare la numerazione di un libro giornale (o meglio sarebbe
meglio non farlo!!!)perchè al primo record cancellato ti "brucia" quel
numero e non lo riassegna più!
Sosituisci il campo contatore con un campo numerico (anche sempre un
Long...o un testo così potresti anche usare AB0001) e tieni in memoria (dove
vuoi...registro di Windows,tabella indici,etc) fin dove sei arrivata...il
prossimo record è quello +1.Lo gestisci tu!
Sono solo consigli!
:-)

 cancellato...
Se ho capito bene e soprattutto se ricordo bene, il valore è
disponibile solo dopo l'update e non dopo l'addnew ( in questa fase
credo sia ancora impostato a null...).
Se non sei in fase già troppo avanzata col tuo progetto EVITA i
campi contatore ad autoincremento, che creano un sacco di casini
specie con le relazioni tra tabelle e in fase di riorganizzazione e/o
clonazione delle stesse.
Ti conviene gestire un long e per sapere il valore da attribuire all'indice
dei nuovi records puoi usare ad esempio una Select Max che ti restituisce il
valore massimo presente nel recordset, valore che potrai incrementare di
1 ad ogni aggiunta, gestendo naturalmente la possibilità di più utenti
collegati
alla medesima tabella.
Il mio è solo un consiglio naturalmente... ;-)
Ciao
 Valter

 prossimo record è quello +1.Lo gestisci tu!
perchè pensi che sia una Lei ?

 credo sia ancora impostato a null...).
non so in ado. in dao direi che se colleghi un label al campo contatore,
quando fai addnew viene valorizzato.
Private Sub Command1_Click()
    Data1.Recordset.AddNew
'    Data1.Recordset.Update
'    Data1.Recordset.MoveLast
End Sub
fatta una prova di corsa col datacontrol.
se scommenti le due righe, il record viene salvato.
in ogni caso il contatore in label1 cresce.

 anticipo il valore del contatore.
Anch'io ti sconsiglio l'uso dei contatori.
Di solito, quando voglio avere la sequenza, o meglio,
quando voglio che il prossimo numero sia successivo
all'ultimo caricato uso qualcosa come:
Set Pippo = OpenRecordset("Select Max(Campo) As Ultimo From MiaTabella")
MioMax = Pippo!Ultimo
A questo punto, in MioMax ho il massimo valore che c'è in quel momento
nella tabella. Se voglio inserire il successivo, non dovrò fare altro che
incrementarlo ed assegnarlo al relativo campo.
--
Er Roscio.

 ha scritto nel messaggio
news:a6ilt0$kd5$1...@fe1.cs.interbusiness.it...
ZIP!

 Er Roscio.
Si ma cosě fai una select in piů
si puň anche fare una insert into
dove imposti un campo come select(max(campo)+1))
....

 ha scritto nel messaggio
news:ecjp8ukk762vtgkbj...@4ax.com...

Che tipo di database usi?
In Oracle usi una bella sequence al posto
del campo autoincrementante e lo controlli meglio
(a mio parere) penso che esista un equivalente anche
in SqlServer.
                                    danilo

 wrote in message
news:a6kcei$evfk8$1...@ID-111402.news.dfncis.de...

Sě... e la differenza qual č ?... :-)))
Te lo dico io: che per ogni riga che inserisci rifai la sub-select,
mentre se la fai a parte, puoi farla una sola volta per sessione
e poi ti basta incrementare il campo.
Prova a fare una sub-select su una tabella con qualche
migliaio di righe... :-)))
--
Er Roscio.

Abbandoneo' il "campo contatore"...
Ciao e grazie!!!


:-)))))))))))))))))))))))))))))))))))))))))))))))))))))
Sono felice per te!
ciao
ugo

in SqlServer.
Uso un DB di access che gestisco con VB6.
Ho fatto vari tentativi ma non ho trovato un sistema per trovare
subito il nuovo valore di contatore assegnato. Quindi visto che in
effetti non e' un gran vantaggio utilizzare il campo contatore ho
deciso di seguire i consigli di chi mi ha risposto e utilizzare un
campo long....
Non ho mai utilizzato ne' oracle ne' SqlServer e non capisco cosa
intendi per sequence...
Grazie 
Marco

 quando fai addnew viene valorizzato.
Ma non č definitivo... Se uno fa un addnew ed un update ti soffia il
numero... almeno cosě mi pare dato che all'epoca la cosa mi aveva creato una
serie inusitata di grattacapi con relativa eliminazione di OGNI campo
contatore da tutti i successivi progetti! :-)
Errare č umano perseverare... :)
--
Ciao

 Errare č umano perseverare... :)
infatti i contatori possono essere molto comodi ma solo in certe condizioni.
ciao, a.

 infatti i contatori possono essere molto comodi ma solo in certe
condizioni.
In quali di grazia? :-?
--
Ciao
Alessandro

"Fox Mulder" ha scritto nel messaggio

Perché non ha letto la firma (Marco) :-PPP
Bye, G.

 Perché non ha letto la firma (Marco) :-PPP
secondo me invece perche' ha letto "berna" e l'inconscio ha lavorato :>
j.

 In quali di grazia? :-?
p.e. app monoutente, o in cui e' altamente improbabile
1. che due utenti inseriscano contemporaneamente
2. che si debbano mai riversare le tabelle, soprattutto quelle  in cui le
chiavi esterne puntano ai contatori.
qui lavoriamo in 3-4 su un mdb con contatori e non c'e' mai stato problema.
ma siamo in 4 scrivanie contigue...
pero' se puoi farli gestire al db a volte ti risparmiano codice. un po' come
i controlli data, se li conosci sai quando evitarli.
ciao, a.

 In quali di grazia? :-?
Es. quando la tabella non ha una chiave primaria definibile.
Un es. potrebbe essere una tabella di log.
Ogni record potrebbe essere duplicabile e quindi non "chiavabile" :P nemmeno
inserendo un campo data ora, perchè se ho due LOG in sequenza potrebbero
cadere addirittura nello stesso millisecondo (esperienza, purtroppo).
Allora metti un bel ID contatore che ti tiene anche l'ordine sequenziale.
Ciao

 Allora metti un bel ID contatore che ti tiene anche l'ordine sequenziale.
Preferisco generarmelo io l'id! :-)
Ok avete vinto... non lo userò mai! :-)

 Ok avete vinto... non lo userò mai! :-)
Come sempre, ognuno è responsabile per le proprie scelte :)
Ciao


E se trovi dei sassi piccona.

 credo sia ancora impostato a null...).
Non e' esatto. Gia' sull'addnew il campo contatore viene assegnato. La cosa
fastidiosa invece e' che se ci fai una cancelupdate il valore assegnato non
viene recuperato ma sempre incrementato. Di conseguenza se all'utente capita
di annullare degli inserimenti, si ritrovera' con un campo progressivo con
dei "buchi".
A quel punto meglio considerare la possibilita' di utilizzare un'apposita
tabella di progressivi che tra l'altro, con una gestione opportuna potrebbe
facilitare la generazione del "successivo" nel caso di utilizzo
dell'applicazione in rete.
--
Starman