Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Id e database

Ho creato un database con Access, inserendo il campo automatico "ID".
Ho impostato anche l'incremento automatico ma,una volta cancellato un 
record da VB, la lista di ID non si aggiorna.
Mi spiego:
Ho come lista
1 aaa
2 bbb
3 ccc
se cancello "bbb", vorrei che l'ID di "ccc" diventi 2, che non rimanga 3.
Infatti da Vb, cancellando "bbb" la lista sarà:
1 aaa
3 ccc
Devo lavorare su qualche opzione del database o inserire una funzione 
all'interno del mio progetto?
Edoardo

"Edoardo" <gd...@NOSPAMtin.it> ha scritto


a parte che i campi contatore non c'e' pezza che li si tocchi a mano,
tutt'al piu' si recupera l'ultimo della serie se lo si elimina e si fa un
pack subito dopo--
a parte questo, la cosa migliore sarebbe che lasciassi proprio perdere...
situazione 1
tab.1 -- #1 fiat, #2 alfa, #3 ford
tab.2 -- 500 --> #1, 145 --> #2, focus --> # 3
situazione 2, dopo quello che vorresti fare
tab. 1 -- #1 fiat, #2 ford
tab. 2 -- 500 --> #1, focus --> e' una ford o un'alfa ??
nel caso migliore, devi andare nelle altre tabelle del db a cambiare tutte
le chiavi che puntavano a 3-ccc in modo che sempre puntando a ccc puntino
pero' a 2.
nel caso peggiore, vai a creare legami inesistenti o peggio falsi.
se vuoi evitare la sgradevolezza del salto numerico, puoi provare a
utilizzare il campo contatore nascosto (non visualizzato nei form) e un
numeratore tuo, puramente estetico.
ma francamente mi sembra un sovraccarico inutile.
hth, pal
--
andrea dot palazzi at tin dot it
free vb/sw: 
http://www.comune.modena.it/cittadini/apal/html/

 all'interno del mio progetto?
Bella domanda! Mi aspettavo fosse la solita questione del contatore che si
incrementa anche quando si crea un nuovo record e poi si rinuncia, creando
dei buchi nella numerazione...
Dicevo "bella domanda", ma anche un po' inquietante: perche' vuoi ottenere
il risultato che chiedi? "ID" sta per identificatore, cioe' un numero, ad
incremento automatico, appunto, che garantisce l'univocita' di tale
identificatore. E' un po' come se tu dicessi: "c'e' un nonno che si chiama
Pippo, un padre che si chiama Pluto e un figlio che si chiama Paperino:
vorrei che quando muore il nonno, pace all'anima sua, Pluto prenda il nome
di Pippo, Paperino quello di Pluto e il prossimo nato (si', anche questa
madre e' sempre incinta) quello di Paperino. Normalmente tutto questo non ha
molto senso.
L'Id che ottieni in automatico ti da' comunque la corretta sequenza che e',
credo, cio' che ti interessa, quindi in qualsiasi momento sei in grado di
avere una "numerazione", mettendo in ordine per "Id" e incrementando un
contatore.
Ma forse non comprendo il tuo scopo: sarei curioso di capire meglio.
--
Ciao.
Maurizio

 all'interno del mio progetto?
"formazione" fabs -> db3 -> clipper   eh ?
a parte purismi e nuovismi:
evita assolutamente riferimenti a record attraverso numeri !
la vita va cosi'... uno piu' bravo di te scopre che tutto va meglio
in un altro modo e tu sei costretto a seguirlo.
(vedrai che ti troverai meglio)
Miao


Naaaahh... questo non può accadere, se si è impostata opportunamente
l'integrità referenziale tra le tabelle collegate. Al massimo, puoi
automaticamente cancellare tutti i record collegati insieme con il record
della tabella primaria.
Il VERO motivo per cui si devono usare i campi contatore con estrema
parsimonia (leggi mai) è che, se vengono usati come campi chiave primaria,
producono spesso lo sgradevole risultato di rendere univoci record che non
lo sono. Ad esempio:
#1 FIAT, #2 ALFA, #3 FORD, #4 FIAT
Naturalmente, il record 4 non dovrebbe esistere in una tabella primaria.
Campi contatore: se li conosci li eviti, se li conosci non ti uccidono il
codice.
--
Lunga vita e prosperità
Joshua
mailto://
jos...@mclink.it

 evita assolutamente riferimenti a record attraverso numeri !
cioe' ?

, 
maurizio...@tin.it
 
says...


 rendo conto che è un po macchinoso come metodo, ma non ho trovato altro.
In questi casi, quando aggiungi un elemento alla listbox, aggiungi l'ID
del record alla proprietà all'ItemData.
    ListBox1.AddItem Nome_Campo
    ListBox1.ItemData(ListBox1.NewIndex) = ID_Campo
Quando vuoi far riferimento al record in base all'ID
    ID_Campo = ListBox1.ItemData(ListBox1.ListIndex)

 Naturalmente, il record 4 non dovrebbe esistere in una tabella primaria.
naturalmente. in compenso, se la tabella e' saggiamente impostata su "marca"
univoco, il contatore puo' essere anche comodo, se p.e. fai dei seek da
altre tabelle, in cui il riferimento (chiave esterna ? mi sbaglio sempre :)
sia numerico e non alfanumerico. non indispensabile cmq, anche perche' mi
sembra di capire che quando si passa a sql serio uno il seek se lo scorda...
ciao, a.

 codice.
Usando gli ADO, è quasi impossibile fare a meno di un contatore come campo
chiave in ogni tabella perchè altrimenti si verificano errori imprevisti e
seccanti.
Ciao,
   <--< Nik >-->