Newsgroup: it.comp.lang.visual-basic
Titolo: [?] numerazione progressiva

salve a tutti,
vi spiego brevemente cosa dovrei fare.
Ho la necessità di avere una numerazione progressiva senza numeri vuoti per
la gestione dei ddt/fatture.
Quindi avevo pensato di mettere una tabella con i campi NrDDT, NrFatt, etc
etc e qaundo l'utente sceglie di creare un nuovo ddt x esempio, legge il
numero presente nel campo Nrddt della tabella Registrazioni, lo incrementa
di 1 e crea il documento.
Ma mi sorge un dubbio: ma se l'utente decide di annullare l'operazione e
rilasciare il numero e nel frattempo un altro utente sta creando un altro
ddt con il numero gia incrementato, succede che mi ritrovo un numero vuoto.
Come posso fare? Premesso che la numerazione deve essere ordinata
cronologicamente....
grazie
ciao

 ddt con il numero gia incrementato, succede che mi ritrovo un numero
vuoto.
Il problema è un grande classico dei gestionali.
Siccome l'utilizzo di contatori automatici è fortemente sconsigliato dalla
stessa MS, che ha riconosciuto alcuni bug con possibile perdita del
conteggio, gestisco manualmente la cosa.
La soluzione che adotto è la seguente:
- Il client individua il numero più alto fra quelli presenti, chiamiamolo
Ultimo_Numero
- Il client prepara il record da inserire, senza assegnare il numero
progressivo
- Il client apre una transaction
- Il client esegue l'insert del record, facendo assegnare dal DB un ID
univoco al record, in un campo apposito, ma non un numero progressivo,
lasciando quindi a NULL il campo "Numero"
- Il client esegue un command in cui fa l'update del record, modificando il
campo numero con il numero più elevato ritornato da una subquery, che per
aumentare la velocità valuta solo record con numero uguale o maggiore a
Ultimo_Numero
- Il client legge il numero assegnato con una semplice query, usando come
chiave di identificazione l'ID univoco assegnato inizialmente.
- Il client esegue il CommitTrans
Se per qualche motivo la procedura non ha funzionato, il client esegue il
RollBackTrans e ritenta. Se il client è 'morto' a metà operazione (manca la
luce...), la transazione viene uccisa dal server automaticamente.
Per sicurezza, comunque, ogni sera gira una Stored Procedure che individua
eventuali record con "Numero"=Null, e li elimina.
Ciao
Alberto

 eventuali record con "Numero"=Null, e li elimina.
scusa ma in che modo?
grazie 1000
ciao

 scusa ma in che modo?
In che modo cosa?
Il RollBackTrans è un metodo di Adodb.Connection, e direi che pensare di
fare un gestionale senza le Transaction è una mezza pazzia. Se non sai usare
le transazioni ti consiglio di fermarti un attimo, studiare la cosa e
ripartire.
Se invece chiedevi come eseguire una SP, diciamo che se hai un sistema DB
server, basta schedularla, se usi DB su file, tipo Access, basta creare un
servizio che esegua le operazioni periodiche di pulizia, ecc...
Ciao
Alberto

 servizio che esegua le operazioni periodiche di pulizia, ecc...
uso sql srv e sp
grazie 1000
ciao

 complesso senza usare SP e transazioni
Se si riesce a sviluppare tutto con operazioni atomiche, può anche andare.
Tuttavia, in 'un gestionale complesso' è quasi certo che da qualche parte
occorra una transazione.
O meglio, il software funziona benissimo anche senza, finchè un giorno si
stacca la spina di un client a metà di una operazione......
Alberto