Newsgroup: it.comp.lang.visual-basic
Titolo: problema con ADODC, il db non si aggiorna

Ho un problema con un database...
sto impazzendo, credevo di risolverlo in un secondo, invece, ogni
tanto mi da' un errore, che non riesco a capire.
Non sono un esperto di db e di sql, ma pensavo di riuscire a farlo,
visto che il lavoro che devo fare e' molto elementare.
Mi sono creato un database .mdb, abbastanza semplice, con una sola
tabella.
Una routine, alcune volte al giorno, lo aggiorna, ricevendo i dati
dall'esterno.
In un giorno possono essere aggiunti al massimo 10/20 records.
Una routine timer, ogni x secondi, controlla se ci sono state
variazioni e in caso di nuovi inserimenti, fa determinate operazioni e
quando ha finito scrive in un flag "done" che quel record e' stato
processato.
Il mio problema e' che a volte il flag "done" non viene scritto (o
viene scritto e poi "cancellato") e quindi il programma fa
l'operazione due volte.
Questo avviene solo ogni tanto, non tutte le operazioni, quindi mi e'
difficile risolvere il problema.
Ho messo nel form un oggetto ADODC
Apro il db con queste righe
    dbase.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data
Source=UdpOrder.mdb;"
    dbase.RecordSource = "SELECT * FROM fromUdp  WHERE data = #" &
Format(Date, "mm/dd/yyyy") & "#" & ";" '" ORDER BY data ASC, ora ASC
;"
    dbase.Refresh
in modo da lavorare solo con i dati di oggi
Aggiungo un record (perche' non finisce in coda agli altri???)
sql = "insert into FromUdp (data, ora, ticker, qta, op, prstop, prlmt,
sys, done) " & "VALUES ('" & Date & "','" & Time() & "', '" & ticker &
"', '" & mqta & "','" & mOp & "' ,  '" & mPrStop & "','" & mprlmt &
"', '" & mSys & "',FALSE);"
Set conn = CreateObject("ADODB.CONNECTION")
conn.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=UdpOrder.mdb;"
conn.Execute sql
conn.Close
dbase.Refresh
poi faccio la routine
dbase.Recordset.MoveFirst
Do While Not dbase.Recordset.EOF
	If dbase.Recordset.EOF Then Exit Do
If dbase.Recordset.Fields("done") = False then
	[....] fa le operazioni
	dbase.Recordset.Fields("Done").Value = True
	dbase.Recordset.Update
End If
dbase.Recordset.Move 1 '(next)
Loop
Ma, a volte, un'operazione viene fatta due volte. Il field "done"
evidentemente non viene scritto correttamente, anche se la routine
passa correttamente per quel punto
Dov'e' l'errore???
Grazie a tutti
S.

 Dov'e' l'errore???
E' possibile che quel "[....] fa le operazioni" sposti il record corrente?


Forse ho capito il problema...
la funzione timer ha un flag globale, che permette di lasciar finire
l'operazione in corso, prima di ciclare nuovamente
Il cattivo posizionamente di questo flag POTEREBBE essere la causa di
un'ulteriore passaggio su
dbase.Recordset.MoveFirst
nel momento in cui il timer cicla ancora.
verifichero' nei prossimi giorni.
In ogni caso, mille grazie per gli utili consigli e per il tempo che
mi hai dedicato!
Ciao!!!!
S.

 Che cosa intendi?
Non conosco i controlli Data, ma è probabile che Recordset sia una proprietà
del controllo, automaticamente composto quando gli si assegna il
recordsource. In tal caso ok.


 Ho un problema con un database...
CUT
Respira ...OMMMMM!
ok partiamo
una tabella....
un consiglio visto che siamo a fare didattica per tutto il NG...
fatti una tabella temporanea...dove butti i nuovi dati...tutto quello che
c'è li dentro va processato...se non c'è nulla...non c'è nulla da processare
(è utile se un domani aumentano i dati da processare....e ti permette di
fare a meno di quel flag odioso)
Altro consiglio...butta via ADOdatacontrol...è lento!
inoltre non ti permette di capire come funzionano i recordset etc etc
come si fa allora?
beh 2 o 3 funzioni
una idea la trovi qui (mi raccomando adattala e sperimenta nuove soluzioni
dedicate)
http://www.it-lang-vb.com/wodka/default.asp?cosa=area13&nome=Articoli
un altro consiglio
io preferisco farmi una serie di query di aggiornamento,inserimento, etc etc
(logicamente se i dati non sono un centinaio di campi) e
poi farli eseguire da un bel COMMAND...
se vieni dal mondo db3 foxpro...sarà una cosa che già sai fare!
a questo punto che diventa il tuo programma?
Questo
DING evento del timer che scatena il controllo
a) apri recordset con la query "Select * From tabellaTemporanea"
b) Check recordset
b1) Recordset BOF nessun dato da processare END
b2) Recodset <>BOF ci son dati!
d)
 Recordset.movefirst
do
        ESEGUI LE TUE OPERAZIONI (query)
    recordset.movenext
until recordset.EOF
e)
Adesso hai aggiornato tutto cosa rimane da fare?
Cancellare la tabella temporanea!
una bella query di cancellazione!!!
f) end procedura aggiornamento
ATTENZIONE:
obiezione che mi sento di fare....
SE durante l'elaborazione (che per 10 rec è veloce ma per 100,1000,10000???)
introducono nuovi dati temporanei???
allora devi trasformare......la d)
 Recordset.movefirst
do
        ESEGUI LE TUE OPERAZIONI (query)
        CANCELLA QUESTO RECORD
    recordset.movenext
until recordset.EOF
ora  chiudi il recordset
nuova select e scopri se ci sono nuovi record...se ci sono...ripeti la
procedura!
se sono molti record....o se vuoi sicurezza di aggiornamento....
metti tutto sotto una transaction !!!
Enjoy!
by man!
p.s. per Lupo
Lupo tu smanetti con grossi db + di me.....(è difficile che trovi situazioni
che nel mentre elaboro inserisco dati nella tabella che sto elaborando..io
li fo passare da query mai su tutta la tabella!!..però tanto per sapere...)
Ho consigliato di rifare la query per vedere se ci sono nuovi inserimenti
nel mentre che elabora....
se mettevo il cursore dinamico era superfluo ma sprecava risorse in modo
pazzesco...oltre che forse a incriccare tutto al primo inserimento
concorrente.
Static sicuramente no...
MA..
Un keyset si accorge di nuovi inserimenti nel recordset mentre elabora...è
vero o dico una fregnaccia???
Saluti lupo!
-- 
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

 until recordset.EOF
...qui non c'č un errore logico..infatti cancello ma non sposto il current
record
 Recodset.Delete...
http://www.soft-land.org/documenti/adomod_res.html#delete

 Saluti lupo!
A te.

 No, non me lo sognerei mai.
Chiarisco: Mi fermo a recuperare il recordset più fresco, ma non lo aggiorno
più in fase di elaborazione dello stesso.
Aggiungo:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/
pg_ado_cursors_6.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/
pg_ado_cursors_5.asp

 Dov'e' l'errore???
Non devi usare un DataControl per fare quel tipo di elaborazioni.
Credo che te lo abbiano già dettoin tanti.
Usa un recordser ADO semplice.
Il problema è che con il DataControl Crei un recordset che vive
per la durata del programma, generando anche problemi di
concorrenza (a cui sono dovuti probabilmente i mancati aggiornamenti)
Saluti.


Anzi meglio ancora, usa direttamente un comando SQL sull'oggetto connectio
se puoi.
Saluti.

Mille grazie a Lupo, Wodka e Gabriele.
Grazie dei preziosi consigli.
Adesso studiero' accuratamente quello che mi avete scritto e cerchero'
di riscrivere il tutto in modo piu' corretto.
Nel frattempo mi stavo domandando...
Visto che io seleziono i record della giornata... 
dbase.RecordSource = "SELECT * FROM fromUdp  WHERE data = #" &
Format(Date, "mm/dd/yyyy") & "# ORDER BY data, ora"
poi faccio un ciclo cercando tutti i record con il flag su falso,
elaboro il record e metto il flag a true.
a questo punto sarebbe corretto rifare un 
dbase.RecordSource = "SELECT * FROM fromUdp  WHERE data = #" &
Format(Date, "mm/dd/yyyy") & "# ORDER BY data, ora"
con un altro parametro 
Where done=false ???
Grazie ancora a tutti
S.

 Format(Date, "mm/dd/yyyy") & "# AND DONE=0 ORDER BY data, ora"
Usa =0 per False e <>0 per True. Vivrai meglio.

 "Wodka40°\(win2k\)" <marco_1...@martek.it_TOGLI_QUI> wrote:
mi hai mandato pure la mail!!!!
perň io non riesco a mandartela
....
pffff....
ti butto giů un po di codice che funziona......
e poi ti faccio vedere gli errori.....
ma solo perchč Natale si avvicina!
:-P
-- 
Il Wodkino Nazionale č a : 
www.martek.it


 :-P
sempre nel solito posto
http://www.it-lang-vb.com/wodka/default.asp?cosa=area13&nome=Articoli
c'č lo zip (23k) con l'esempio funzionante e un bel po di commenti nel
codice
buon lavoro!
:-)


Wodka40°(win2k) wrote:
mi raccomando...sarebbe carino che mi informassi di aver quanto meno letto e
lanciato il progettino
!!!
:-)

"Wodka40°\(win2k\)" <marco_1...@martek.it_TOGLI_QUI> wrote:

	 W O W !
l'ho lanciato.... eccome, se l'ho lanciato!
G R A Z I E !!!!
me lo studiero' con cura nei prossimi giorni....
per il momento ho letto tutto il listato e ho imparato di piu' in
pochi minuti che in ore!!
Ci sono ancora diverse cose che devo capire... 
Babbo Natale esiste davvero! :-)))
Mitico Wodka! Grazie ancora.
S.