Newsgroup: it.comp.appl.access
Titolo: Procedura sequenziale e lock SQL. Help...nn ho soluzioni...

Ciao a tutti. Ho un baco che non riesco  a risolvere.....
Provo a descrivere in pseudocodice:
MODULO:
funzione Controlla
SQL1=SELECT * FROM Tab1
imposto recordset1
Inizio ciclo 
rst.edit
..
..
rst.update
if qualcosa
SQL2=SELECT * FROM Tab2
set recordset2(SQL2,dbOpenSnapshot, dbReadOnly)
if recordset2 non č vuoto
recordset2.close
UPDATE Tab2
else
INSERT Tab2
end if
recordset1.close
fine ciclo
If qualcos'altro
SQL2=SELECT * FROM Tab2
set recordset2(SQL2,dbOpenSnapshot, dbReadOnly)
If recordset2 non č vuoto
recordset2.close
UPDATE Tab2
else
INSERT Tab2
end if
End funzione
MASCHERA:
DBEngine.begintrans
call Controlla
call AltraFunzione
DBEngine.Comittrans
alla seconda impostazione del recordset2 (sempre in solalettura) va tutto in
timeout (problema di lock su tab2). Se toglo la transazione funziona tutto. In
ambiente MDB funziona tutto, ma sono su sql express
Centra il fatto che Access puň aprire piů connessioni contemporaneamente e
indipendenti per questioni prestazionali (a tradimento e senza poter
controllare nulla)?
Nn posso usare query pass (almeno io non son riuscito) perchč č una procedura
sequenziale....per forza ADO (che controlla completamente le connessioni)?
Grazie
-- 

 
Fammi capire. Le select su tab2 sono proprio cosi' o sono addomesticate?
C'e' qulcosa che mi sfugge nella logica.
Inoltre, se non ho capito male, se il recordset1 contiene un milione di 
record potresti fare un milione di select su tab2? E fino a un milione 
di UPDATE+INSERT (o una INSERT ed il resto UPDATE)? Questa e' la parte 
di logica che non ho capito. If qualcosa e' oscuro if qualcos'altro e' 
poco importante.

 end if
Cioe' se il recordset non e' vuoto lo chiudi e fai
l' update sulla tabella  dove insiste lo stesso recordset
che chiudi ? Complimenti : "lineare" come logica :D
Secondo me dovresti riscriverlo da capo.
(parere mio).
una cosa del tipo :
do while not rc_main.eof
     if <condizione>
          rc_sub.movefirst
          rc_sub.FIND rc_main.kiave
          ' o col seek , e' molto piu' veloce !
          ' visto che stai in access ...
          if rc_sub.eof then rc_sub.addnew
          ' scrive i dati
           rc_sub.update
      endif
      rc_main.movenext
loop
Ti andra' almeno 10 volte piu' veloce. Come minimo.
E' molto piu' lineare e manutenibile.
E si puo' fare di meglio ! Ma ci devo pensare ...
Si tratta di ORDINARE previamente i 2 recordset
e scorrerli secondo l' ordine.
Famme sape'.


[cut]
Si la query è addomensticata (niente *!!!!!). Quuando va, è tutto istantaneo
(i record da processare sono al massimo una ventina) 
Cerco di spiegarmi meglio....fermo restante che se riesco a riscrivere
quest'accrocco è solo meglio!!!!!
Si tratta di caricare della merce e sapere se è stata ordinata o meno.
La struttura è questa: se è ordinata, evado la prenotazione (cambio lo stato
con rst.Edit....update) e proseguo (per tutte le eventuali prenotazioni). Se
non è ordinata, devo aggiornare la tabella giacenza (che è separata). Quindi
devo prima cercare SE il record esiste (e quindi lo aggiorno) oppura no
(allora lo inserisco). La seconda select (uguale alla prima) serve perchè
potrei ricevere + copie di quelle richieste (e magari ordinate). Quindi dopo
tutto il ciclo, SE mi avanza ancora qualcosa, procedura giacenze.
Mi rendo conto che è un misto procedurale e SQL, ma di meglio non son riuscito
a fare, ne sono riuscito ad ottimizzarla maggiormente (ma forse è che ci sono
sopra da troppo e sono un po' annebbiato :)  )
Per quanto riguarda il seek, nn sono convinto che sia più veloce dell'SQL (che
va a finire sul server), ma ora mi informo, nn l'ho mai usato, quindi nn dico
nulla...
Cmq adesso mi guardo la procedura suggerita e vedo di capirla
Se serve vi incollo il codice vero
E intanto grazie....
--