Newsgroup: it.comp.lang.delphi
Titolo: Autoincrement fields.

Ciao a tutti!
Penso proprio che a questa domanda non ci sia soluzione, ma visto che qui
bazzica gente esperta, la sparo lo stesso:
ammettiamo che io abbia una tabella (paradox) con 100 records e un campo
autoinc. come primary key.
Se cancello tutti i record e poi ne inserisco uno nuovo, il campo autoinc.
riparte da 101, ma io vorrei che ripartisse da 1.
Esiste un metodo per azzerare questo contatore?
Mario
---------------------------------------
MBSoftware
http://web.tiscalinet.it/mbsoftware
---------------------------------------

Esiste un metodo per azzerare questo contatore?
Forse una soluzione esiste...
Io utilizzerei IB e quindi il linguaggio SQL.
La soluzione sta nel crearti un Trigger che agisce come "After Delete".
Però non lo ho mai utilizzato con una tabella con un campo
autoincrementante.
Forse la soluzione sta nell'utilizzare un campo non autoinc.
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support

 Io utilizzerei IB e quindi il linguaggio SQL.
oppure, potresti crearti la tabella da programma,
definendo la struttura di campi e indici.
quando chiami il TTable.CreateTable
ti crea una nuova tabella (resettanto quindi anche il contatore)
e se ne esiste una vecchia la sovrascrive, quindi non devi
neanche star li a svuotarla.

 Esiste un metodo per azzerare questo contatore?
Ciao,
         i campi autoinc hanno dei comportamenti un po' bizzarri ogni
tanto...
Io personalmente ho deciso di non utilizzarli + anche perchè se devi
lavorare in rete sono un massacro. Cmq, veniamo al tuo problema: sui ngs di
Marco Cantù (
www.marcocantu.it
 per iscriversi, gratuitamente) era già
passato il tema con relativa soluzione... prova a cercare lì o su Deja
(penso che gli articoli spediti su 
news.marcocantu.it
 vengano passati anche
a Deja ma non sono sicurissimo...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

> Forse la soluzione sta nell'utilizzare un campo non autoinc.
Gia! E' la normale alternativa che sto seguendo. :-)
Utilizzare IB e SQL per una semplice e unica tabella mi sembra troppo.
Però ho postato la stessa domanda su borland.public.delphi.database.desktop
e li mi hanno risposto che è sufficiente cancellare e ricreare l'index:
"You need to delete the index and recreate it.
You can also define a initial- value to the autoinc- field: ie 1000;
When you create the index new you can set the "min"- Value to 1000 for
an empty database. When the first record is posted the autoinc- value is
1000"
Tradurlo in italiano ci riesco :-) ma c'è qualcuno che può tradurmelo in
Pascal?
Cioè cancellare e ricreare un indice da programma? Io ci riesco solo con
Database-Desktop.
Grazie in anticipo per eventuali consigli.
Ciao


 Cioè cancellare e ricreare un indice da programma? Io ci riesco solo con
io usavo un metodo, forse non molto "pulito", ma molto veloce(da
scrivere):
cancellavo fisicamente i file di indice, e li ricreavo con addindex().

Esiste un metodo per azzerare questo contatore?
c' č una soluzione meno professionale per far quello che chiedi.
Questa soluzione č valida se la struttura del database rimane invariata nel
tempo.
Ok, arrivo al dunque.
Il valore del campo autoincrementale č registrato nei primi byte dell'
header di una tabella Paradox, quindi essendo un tipo di dato Integer,
questo occuperŕ 4 byte.
L' altro giorno ho provato con un mio database di 18000 record.
Ho eliminato tutti i record ma il campo autoincrementale continuava a
ricordarsi del suo ultimo valore. Che pizza questo campo !!
Ho preso un editor esadecimale e visto che la testata della tabella era solo
di circa 2000 byte, avrei fatto presto a cercare questo valore.
Ho settato il tipo di dato da considerare in lettura (cioč quanti byte
leggere alla volta) impostandolo a Long, cioč 4 byte. In pratica l' editor
avrebbe considerato 4 byte alla volta.
Poi ho iniziato la scansione ed ho trovato il valore dell' autoincrementale
che in esadecimale era scritto cosě:
D3 47 00 00
infatti leggendolo all' incontrario (00 00 47 D3 ) e convertendolo in
decimale č: 18387, in pratica il valore
dell' autoincrementale che cercavo.
Quindi basta sovrascrivere i byte D3 e 47 con 00 e 00 per portare il campo
autoincrementale a 0 !!
Infatti dopo aver utilizzato il database nuovamente, il campo
autoincrementale č partito dall' inizio.
Cosa voglio dirti con questo ?
Bč, quel numero (il valore 18387) dovrebbe occupare sempre la stessa
posizione all' interno del database, quindi basta aprire il file con
TFileStream o altre funzioni per la gestione di file generici, e spostarsi a
quel byte.
Poi scriverci il numero 0 utilizzando il tipo di dato Integer o Longint.
Logicamente se al database cambi struttura, ti troverai quasi sicuramente
che i byte che identificano il valore dell' autoincrementale non stanno piů
nella stessa posizione e tu vai a scrivere altri byte rovinando il database.
Ma quando un' applicazione č pronta e funzionale, il database rimane
strutturalmente inviariato !!
La soluzione che ti ho dato funziona, poi se ti studi il formato paradox
puoi capirci di piů, io ho fatto solo una prova al volo e visto che non era
stata menzionata mi č sembrato giusto accennarla.
Per eliminare un indice, prova con "DeleteIndex", cioč un metodo della
classe TTable.
Con gli indici secondari mi pare che funzioni, con i primari non ho mai
provato.
Ti saluto......ciaoooo !!!!
Antonio Tarolla
BSSoftware Tips Mailing - List Support

 cancellavo fisicamente i file di indice, e li ricreavo con addindex().
E usare le IndexDefs?
(o, se non ricordo male, c'è una DeleteIndex da qualche parte, penso sia un
metodo di TTable...)
Ciao
