Newsgroup: it.comp.lang.delphi
Titolo: Numeri progressivi

Ciao,
ho una tabella con IDSocio(contatore),  Cognome ecc ecc.
Ora dovrei assegnare un numero tessera ad ogni record.
Come mi conviene fare? Usare l'IDSocio 1,2 oppure generarmene uno tipo
0001,0002 ecc ecc e quindi
aggiungere un campo alla tabella?
Nel secondo caso, come posso fare?
Grazie per l'aiuto!

aggiungere un campo alla tabella?
Ti suggerisco di determinare a parte il numero di tessera, se lo leghi al 
contatore  il significato di "numero tessera" viene perso. E' un po'
come la numerazione dei documenti contabili (fatture, ecc..).
Per aggiungere un campo dipende da che db stai usando, trovi numerosi
esempi in questo stesso ng, cmq il tutto si riduce ad una sql del tipo
"alter table xxxx add column xxx tipo dato".... a sconda del db cambia il dialetto sql.
Ciao 
Morde.
morde [at] programmer [.] net


Per aggiungere un campo non ho problemi, ma come
posso generare un numero che sia ogni volta diverso e tenerne traccia
per eventualmente incrementare ad ogni nuovo iscritto?
Grazie

per eventualmente incrementare ad ogni nuovo iscritto?
Metti il tutto nell'evento beforeinsert della tabella:
1 - blocca la tabella in modo esclusivo
2 - Fai una query tipo "select MAX.." sul campo numero tessera.
3 - Il risultato della query incrementalo di 1 e quello e' il nuovo numero di tessera.
4 - fai  il post del record aggiornato col numero di tessera nuovo
5 - sblocca la tabella
6 - formatta l'hard disk.
ciao! (il punto 6 e' a tua discrezione :-P!!)


tutti i db client/server, escludendo forse MySql, hanno un meccanismo per la
creazione di id univoci.
In Interbase sono i generators
in Oracle, si chiamano Sequences
Tu quale db usi?
A.

Access 2000....


fino alla 97 non mi sembra avesse un qualcosa di simile ai generatoris di
ib.
Sorry
A.

Access 2000....
Access2000 ha gia' il campo contatore che ti permette di assumere una
numerazione univoca. Il campo e' sufficiente aggiungerlo a mano dall'IDE di access stesso.
Ci lavoro tutti i giorni con questo pseudo DB e ti garantisco che niente č piu' facile da gestire
per quello che devi fare tu.
Vai in struttura della tabella in questione, e aggiungi un nuovo campo contatore.
Ad ogni nuovo record avrai il numero di tessera in automatico.
Piu' rapido di cosi' si muore.... :-)


 Ci lavoro tutti i giorni con questo pseudo DB e ti garantisco che niente è


Ecocti accontentato il avevo lo stesso problema e l'ho risolto cosě e
funziona alla perfezione.
Devi creare una tabella con questi 2 campi:
Campo        Tipo    Carateri
SociId         N
SociCode    A            8
  public
    Max: Integer;
    procedure ComputeMax;
  { Public declarations }
  end;
procedure TSociForm.ComputeMax;
var
  Bookmark: TBookmark;
begin
  Bookmark := Soci.GetBookmark;
  try
    Soci.DisableControls;
    Max := 0;
    try
      Soci.First;
      while not Soci.EOF do
      begin
        if SociId.AsInteger > Max then
          Max := SociId.AsInteger;
        Soci.Next;
      end;
    finally
      Soci.EnableControls;
    end;
  finally
    Soci.GotoBookmark (Bookmark);
    Soci.FreeBookmark (Bookmark);
  end;
end;
procedure TSociForm.SociNewRecord(DataSet: TDataSet);
begin
  SociId.Value := Max + 1;
  SociCode.Value := FormatFloat('00000',VolontariId.Value);
end;

Spero di non aver detto troppe sciocchezze....
Non capisco il collegamento tra il lettore a barre e il tuo programma.
Puoi spiegarti meglio?
Se vuoi che il numero tessera sia formattato a 6 cifre devi crearlo come campo stringa
e gestirlo come tale.


 e gestirlo come tale.
Ho appreso che la quasi totalita' dei lettori di cb funzionano in modalita
tastiera.
Immagino che leggono un codice come se qualcuno lo stesse in quel momento
digitando da tastiera.
Dato che vorrei far partire in automatico la query legata al codice, avevo
pensato di
controllare la editbox di immissione del numero tessera in modo che al sesto
(se il num di
tessera e' composto di 6 caratteri) carattere immesso (sia da tastiera che
da lettore) la editbox si chiuda e parta la query.
Questo posso farlo solo se il numero tessera e' di lunghezza fissa quindi
non
posso usare l'idSocio che e' un contatore a lunghezza variabile 1..10 ecc...
Dovro farmi una procedura che setti la lunghezza dell'id.....
Ciao!

 Spero di non aver detto troppe sciocchezze....
Scusa un attimo, e se quando crei il codice a barre infili tanti 0 davanti
al numero del campo autoincrementante per farlo arrivare a 6 caratteri (es
000001, 0012334) e quando viene scritto nel lettore nel tuo Tedit, fai
partire la qwery col numero inserito, previa eliminazione degli zeri
iniziali???
Ciao
Matteo

 in giro che funziona in emulazione tastiera.
Esatto. Pero' attenzione: nell'emulazione di tastiera e' compresa anche la
pressione del tasto INVIO alla fine del codice (almeno nei lettori con cui
ho lavorato io). Quindi non c'e' bisogno di lunghezze fisse.
E comunque il tuo problema non e' nella lettura, ma eventualmente nella
stampa del codice a barre: se il codice e' "0002", allora se lo converti in
numero lo puoi confrontare con il codice "2" ed e' uguale... Quindi la
conversione da IDSocio (lunghezza variabile) a BarCodeSocio (lunghezza
fissa) non la fai nel DB, ma nel programma.

 e gestirlo come tale.
Ho appreso che la quasi totalita' dei lettori di cb funzionano in modalita
tastiera.
Immagino che leggono un codice come se qualcuno lo stesse in quel momento
digitando da tastiera.
Dato che vorrei far partire in automatico la query legata al codice, avevo
pensato di
controllare la editbox di immissione del numero tessera in modo che al sesto
(se il num di
tessera e' composto di 6 caratteri) carattere immesso (sia da tastiera che
da lettore) la editbox si chiuda e parta la query.
Questo posso farlo solo se il numero tessera e' di lunghezza fissa quindi
non
posso usare l'idSocio che e' un contatore a lunghezza variabile 1..10 ecc...
Ciao!

Grazie a tutti,
  mi avete illuminato!!
Ciao