Newsgroup: it.comp.lang.visual-basic
Titolo: ADO e Lock a livello di record

Salve a tutti , ho un problema di questo genere:
2 computer in rete lavorano con un database Access2000 con connessione ADO,
entrambi fanno delle ricevute, queste ricevute sono numerate in modo
progressivo.
Il numero dell'ultima ricevuta fatta è in una tabella di un solo record.
Il funzionamento logico dovrebbe essere questo:
A) Computer 1 blocca il record della ricevuta
B) Legge l'ultimo numero
C) Aggiunge 1
D) Passa ad una stampa Crystal il paramentro del nuovo numero e stampa la
ricevuta
E) Esegue altre operazioni di aggiornamento su altre tabelle
F) Scrive nella tabella a singolo record l'ultimo numero
G) Sblocca la tabella
L'altro computer aspetta sino a che il record non è sbloccato, e poi esegue
la stessa procedura.
Dopo aver letto tutti gli articoli su MSDN e sui news ed aver provato i vari
adLockPessimistc e i vari cursori sono riuscito a far funzionare il
programma intercettando alcuni errori che genera, ma è una soluzione
sinceramente poco elegante e poco funzionale.
Ora quello che vi chiedo è : mai possibile che rispetto ad un Clipper Summer
87 (Dico Summer 87) siamo tornati così indietro per una semplice
programmazione in rete?
Oppure sono io che sono un pò tardo e non ho trovato la soluzione giusta.
Qualcuno di voi ha affrontato problemi simili?
Grazie in anticipo.

a) perché non fai "leggi numero" - "scrivi numero +1", così riduci il tempo
di attesa?
b) ado dovrebbe avere beginTrans() come metodo dell'oggetto Connection,
cercalo nell'help;
c) credo che puoi usare la sintassi "simil-sql-server" con access2000:
"begin tran q; set nocount on; update tabella set tuonumero=tuonumero+1; set
nocount off; select tuonumero from tuatabella; commit tran q"; ho qualche
dubbio per set nocount (prova nel caso a toglierlo per vedere se restituisce
il select, credo di sì); in questo modo riduci il tempo di attesa al minimo
(usa la sintassi come sopra con l'oggetto Command di Ado)

 il select, credo di sě); in questo modo riduci il tempo di attesa al


Aggiornamento degli incassi
Non ho mai usato Clipper Summer 87, ma dal basso della mia esperienza
mi sembra che questo sia un problema ricorrente a prescindere dal
database usato.
Per quanto riguarda il progressivo penso che sia necessario generarlo
nel momento in cui si ha l'effettiva necessità. Di solito si usa una
tabella contenente il progressivo raggiunto da altre tabelle, es.
{RICEVUTE , 1026}
{MOVMAGA , 3000}
etc.
Questo ti evita di andare a leggere la tabella delle ricevute per
sapere a quale progressivo sei arrivato.
Poi, non mi sembra che sia possibile impedire la lettura di una
tabella. Per risolvere problemi dovuti ad aggiornamenti concorrenti
esistono tecniche diverse in cui entrano in gioco i lock, le
transazioni come tu stesso hai confermato.
--
Good Coding.
--

Moreno Andreini wrote:
non siamo tornati indietro...
Occhio che quello che fa il motoreDB è una cosa
Quello che fa ADO un altra!(anche se ado non si inventa nulla che il motore
db non consenta!)
Nel senso...puoi lasciare la concorrenza al "buon cuore" del DB
oppure fartene carico tu!
Se vuoi fartene carico tu....le soluzioni sono a "tuo carico"!
Optimistic ...Batch Optimistic e gestisci l'errore...casomai con uno strato
3tier!
Pessimistic? No grazie!
Il meno possibile! si mangia memoria risorse etc etc peggio di un
coccodrillo!
Al momento dell'update un optimistic si accorge di conflitti....tu LI devi
intervenire per risolvere il conflitto (ad esempio facendo rileggere il
progressivo e sostituendolo nel recordset da introdurre!)
Saluti
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 Il Wodkino Nazionale č a : 
www.martek.it


> Se vuoi fartene carico tu....le soluzioni sono a "tuo carico"!
Ciao, in vb4 e poi in vb5 + dao visto che i lock avvengono per pagina. 
Nella ditta in cui lavoravo, abbiamo utilizzato un semaforo, cioè un 
record in una tabella specifica che indicava che un dato record di una 
data tabella (utilizzano come riferimento nome tabella , chiave unica 
della tabella) era in uso e non modificabile. Naturalmente si deve anche 
prevedere una possibilità di sbloccare la situazione. Nella tabella era 
previsto anche un codice che indicava la fase di 'lavorazione' in modo da 
prevedere delle procedure di recupero della situazione precedente o 
portata a termine della funzione.
Ciao 
Giorgio Silvio