Newsgroup: it.comp.appl.access
Titolo: [?] Decidere quanti record estrarre, AIUTO

Ciao a tutti !!
Sono in un casino dal quale non riesco a uscire..
Dunque ho un programma che inserisce continuamente dei dati in un database ,
3 alla volta.
Nello stesso momento, un altro programma apre lo stesso database, prende
tutti i dati ivi contenuti ed esegue delle elaborazioni su questi dati.
Siccome uno stesso campo contiene 3 valori diversi (uno per record) devo
procedere in questo modo :
Variabile_A = recordset!campo1
recordset.movenext
Variabile_B = recordset!campo1
recordset.movenext
Variabile_C = recordset!campo1
recordset.movenext
(un po' stilizzato come esempio, ma é per far capire come prendo i dati)
Ora il problema subentra quando capita... e purtroppo capita... che aprendo
il recordset non mi prende un numero di record divisibile per 3, e a volte
il "pacchetto" di record risulta di soli 2.
Ovviamente questo causa un errore di "Record non trovato...ecc...ecc.."
Adesso..
Sara' possibile verificare all'apertura di un recordset che il numero sia
divisibile per 3, e se no di scartare gli ultimi dati per renderlo
divisibile per 3 ed essere compatibile con la routine di elaborazione ?
Grazie mille per un eventuale risposta !! per me é molto importante
DaVe

, da...@hate.spam says...

Per sapere il numero di record puoi usare la proprieta' RecordCount 
dell'oggetto Recordset.
Come alternativa puoi controllare l'errore inserendo prima del movenext 
il controllo sulla proprieta' EOF (fine del recordset)
Ciao
-- 
JBad


Ciao JBad !
Grazie della risposta !
Purtroppo ho gia' provato con EOF, ma non mi risolve il problema...
supponiamo che i dati vengano estratti a 3 record alla volta :
1
2
3
1
2
3
1
2
3
e che poi per un caso,o per colpa del database che non ha ancora salvato il
terzo record, il recordset recuperi solo 2 dati :
1
2
Mi ritrovero' che al prossimo loop della routine, non ripartiro' a pescare
dal record 1 in avanti, ma dal 3 (precedente). E essendo il 3 un altro
valore, ma associato allo stesso campo.. succede che il dato viene inviato
al posto sbagliato.
Ecco perché mi serve di estrarre un numero di record divisibile per 3, cosi'
sono sicuro che ci sono sempre tutti i dati.
Grazie ancora ! cerco ancora una soluzione !
DaVe

, da...@hate.spam says...

Prova cosi'
rsMio.MoveLast
rsMio.MoveFirst
max = Int(rsMio.RecordCount / 3)
For i=1 To max
	.....
Next
Ho improvvisato comunque la sostanza dovrebbe essere questa :)
-- 
JBad

prima soluzione :
 Set dbs = CurrentDb
 Set rst = dbs.OpenRecordset("TuaTabella")
 varCiclo = Fix (rst.RecordCount/3)         ' ti dice quanti gruppi di 3 ci
sono nel recorset
for I = 1 to varCiclo
    for J = 1 to 3
        ' fai qullo che devi fare
    next J
next I
 rst.Close
 Set dbs = Nothing
essendo varCiclo multiplo di 3 il For...Next interno considera sempre 3
record nella corretta successione.
Più raffinato e più corretto sarebbe usare i metodi
BeghinTrans,CommitTrans,RollBack
dove salvi le modifiche ogni ciclo di 3 e se l'ultimo ciclo si è svolto per
un numero inferiore di records non salvi le modifiche.
Per l'esempio ti rimando alla guida in linea.
Buon lavoro
numCicli =
( 
-> Dave <- <da...@hate.spam> wrote in message 8jccht$hck$1...@bw107zhb.bluewin.ch...



 sono sicuro che ci sono sempre tutti i dati.
Sperando di aver capito bene il problema mi lancio in una soluzione.:-)
Il concetto è che dovresti conservare in memoria il punto dove si è fermato
(1, 2 o 3), in modo cha al prossimo loop possa finire di salvare l'ultimo (o
addirittura gli ultimi due) records senza confonderlo con il primo del nuovo
loop.
Per esempio aggiungi una variabile condivisibile a livello di modulo
"AndoSta" in modo che se esci dalla routine, il db potrà sempre riprendere
da dove ha lasciato:
Do
For AndoSta=1 to 3
   Campo= recordset!campo1
   Select Case AndoSta
      case 1
        Variabile_A = Campo
      case 2
        Variabile_B = Campo
      case 3
        Variabile_C = Campo
   End Select
Next AndoSta
recordset.movenext
Loop
Poi con vari test puoi uscire dal loop e dal For (Exit For) per fare altre
cose.
In questo modo, il db prenderà sempre e soltanto il prossimo record come
quello corrispondente al ciclo, perché finché non ha trovato i 3 (con For)
continuerà il ciclo, e quando ha finito con i 3, ricomincia un nuovo ciclo,
in modo semplice e naturale!
Per finire, se vuoi evitare l'apesantimento del Select Case, invece di
chiamare le variabili Variabile_A, B e C, sarebbe meglio definire una
matrice Variabile (1 to 3) per esempio, così scriveresti una volta sola
Variabile (AndoSta)= recordset!campo1
Ciao
Thierry