Newsgroup: it.comp.lang.visual-basic
Titolo: ADO - Metodo UPDATE  solo in parte

Scusatemi se torno sempre sul discorso recordset ma molte cose mi sono 
ancora oscure, complice la mia ignoranza con ADO.
Non sempre la volontà e lo studio riescono a togliere tutti i dubbi e non 
sempre le spiegazioni dei manuali sono comprensibili, quindi mi rivolgo a 
voi GURU della materia.
NB
Spero che la formattazione non si vada a far friggere e che il codice sia 
leggibile. ( Ho cercato di mettere dei punti di riferimento con delle 
lettere per aiutarvi a capire il mio ragionamento)
[VB6 sp5 -  ADO - Access]
Come al solito cercherò di farmi capire ( spero di non essere prolisso) e lo 
farò in modo schematico
COSA VOGLIO FARE
A)    Prendo dal DB un recordset con la data in esame
B)    Creare un recordset con una struttura uguale alla tabella presente nel 
DB Access
C)    Mettere questo recordset dentro un ciclo FOR EACH NEXT dove popolo il
        recordset con dei vaori che prendo da una Classe di Insieme
D)    Fare una serie di verifiche
E)    Scrivere i dati dentro il DB ( se soddisfano alcune verifiche)
IL CODICE CHE HO SCRITTO
A) --------------------------------------
'STRINGA PER PRELEVARE IL RECORDSET DEL GIORNO IN ESAME
strSQL = "SELECT * FROM Tratte WHERE Giorno =" & "#" & 
Format(Giornata.Giorno, "mm/dd/yy") & "#"
'RECORDSET PRESENTE NEL DATABASE
rsOldTratta.Open strSQL, cn, adOpenDynamic, adLockOptimistic
B) --------------------------------------
'RECORDSET NUOVO
Set rsTratta = New ADODB.Recordset
'IMPOSTO IL CURSOR-LOCATION A USECLIENT PER APRIRLO NEL MODO CHE SEGUE
rsTratta.CursorLocation = adUseClient
'APRO UN RECORDSET VUOTO CON LA STRUTTURA DELLA TABELLA TRATTE MA VUOTO CON
'LA CLAUSOLA WHERE 1=0
rsTratta.Open "SELECT * FROM Tratte WHERE 1=0", cn, adOpenDynamic, 
adLockOptimistic
'CHIUDO LA CONNESSIONE PERCHE' DEVO POPOLARE IL RECORDSET CHE ORA E' VUOTO
 rsTratta.ActiveConnection = Nothing
C) --------------------------------------
' POPOLA IL RECORDSET NUOVO PRENDENDO I DATI DALLA CLASSE
For Each Tratta In Giornata.Tratte
   rs_AggiungiTratta rsGiornata, rsTratta, Tratta
Next
Debug.Print "RsTratta " & rsTratta.RecordCount
Debug.Print "RsOldTratta " & rsOldTratta.RecordCount
'RIAPRO LA CONNESSIONE AL DATABASE
rsTratta.ActiveConnection = cn
'IMPOSTO IL CURSORE DI RIGA ALL'INIZIO
rsTratta.MoveFirst
Do While Not rsTratta.EOF
D) --------------------------------------
    If Not rsOldTratta.EOF Then
         rs_VerificaUguaglianzaTratte rsTratta, rsOldTratta
    Else
E) ---------------------------------------
         rsTratta.Update
    End If
    rsTratta.MoveNext
Loop
PROBLEMI
All'uscita del ciclo (C)  verifico con il DebugPrint che rsTratta sia stato 
popolato e fin qui tutto okay
poi però quando arrivo a fare l'update (E) nel database mi trovo solo 
l'ultimo record che il ciclo ha
inserito dentro il recordset
PERCHE?
Ho provato a non chiudere la connessione e il recordset viene scritto tutto.
Io sono obbligato a chiudere la connessione perchè se no ad ogni AddNew di 
rsTratta mi si aggiorna il database prima delle
verifiche. Ho provato ad usare un adLockBatchOptimistic  ( Lockype di 
rsTratta) ma non mi fa aggiungere piu di tot record
Spero di non aver scritto eresie e vi chiedo un istradamento nel capire dove 
sbaglio
Stefano

 PERCHE?
ogni volta che lasci un record senza salvare (Update) perdi le modifiche
-- 
ciao, hal


Hal ma io, uscito dal ciclo, con il Debug.Print vedo il RecordCount = 4
quindi il recordset è popolato bene e mi aspetto un UPDATE di tutti e
4 i record ma non avviene.
Se quello che dici tu è vero io dovrei avere un RecordCount = 1 ma
cosi non è.
Non è che sbaglio nelle proprietà di .OPEN ?

 ha scritto nel messaggio 
news:1139616016.2...@g44g2000cwa.googlegroups.com...


Non ho capito questo suggerimento in quanto le righe vengono create 
correttamente
nel recordset.
A livello logico non capisco per quale motivo non funziona l'UPDATE... 
ahhhhhhhh
Io per verificare che i record siano stati inseriti correttamente dentro al 
recordset ho scritto questo ciclo
all'uscita del ciclo FOR EACH NEXT ( parte C del codice)
      Do While Not rsTratta.EOF
        For x = 1 To rsTratta.Fields.Count - 1
          Debug.Print rsTratta.Fields(x)
        Next
        rsTratta.MoveNext
      Loop
e nel DEBUG vedo tutte e 4 le righe con i campi popolati.
Ora perň mi viene un dubbio.
Allinterno del ciclo FOR EACH NEXT ( parte C del codice) ho inserito una Sub 
( rs_AggiungiTratta)  che per l'appunto
popola il recordset ma io qui tralascio il CAMPO ZERO ossia tralascio la 
chiave primaria e inizio a popolare dal field(1), perchč nella mia
testolina mi sono detto che tanto viene scritta da ACCESS ( o ADO) visto che 
ho impostato questo campo
come chiave univoca gestita dal sistema.
Se qui non č l'errore e se io con questo ciclo aggiunto per il DEBUG vedo 
che tutti i record sono presenti
perchč non funge?
Lo so che spesso mi date le motivazioni e le soluzioni ai miei problemi che 
io non vedo ma io qui mi sono trovato 2 risposte totalmente diverse
e per di piu non ho capito l'aiuto di Ctenzia.
Mi aiutate a capire please?
Stefano 

Forse se facciamo cosi forse riesco ad arrivare all'errore
Ho semplificato il codice perchè il problema è sui punti A e B
Se io CHIUDO e APRO la connessione UPDATE non funziona
Se io non CHIUDO la connessione UPDATE funziona
Quindi mi viene spontaneo pensare che riapro la connessione in modo errato.
NB
cn = Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data 
Source=C:\Programmi\Microsoft Visual 
Studio\Progetti\Import_Turno\Archivio.mdb;Mode=Share Deny None;Extended 
Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet 
OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database 
Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk 
Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System 
Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale 
on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet 
OLEDB:SFP=False
-------------------------------------------------------------------------------------------------------------------------
If Giornata.Tratte.Count > 0 Then
      Set rsOldTratta = New ADODB.Recordset
      strSQL = "SELECT * FROM Tratte WHERE Giorno =" & "#" & 
Format(Giornata.Giorno, "mm/dd/yy") & "#"
      rsOldTratta.Open strSQL, cn, adOpenDynamic, adLockOptimistic
      Set rsTratta = New ADODB.Recordset
      rsTratta.CursorLocation = adUseClient
      rsTratta.Open "SELECT * FROM Tratte WHERE 1=0", cn, adOpenDynamic, 
adLockOptimistic
      rsTratta.ActiveConnection = Nothing  <------------ [A]
[codice]
      rsTratta.ActiveConnection = cn <------------ [B]
      rsTratta.Update
End If

       rsTratta.Update
ah... un recordset disconnesso, mi era sfuggito il particolare.
dovresti usare UpdateBatch.
tuttavia, se potessi fare delle INSERT sql come diceva Cteniza
ti leveresti da un sacco di problemi.
-- 
ciao, hal


Mi potresti/ste dirmi come con un esempio? Io questo suggerimento non
lo capisco.
L'istruzione SQL INSERT la dovrei usare quando apro il recordset
rsTratta che poi scollego?

 rsTratta che poi scollego?
Inserisci una query di inserimento.
Dim cm As ADODB.Command
set cm = New ADODB.Command
cm.ActiveConnection = myConnection
cm.CommandText = "INSERT INTO myTable (campo1, campo2) FIELDS (?, ?)"
Dim prm As ADODB.Parameter
'Questo lo devi ripetere per ogni parametro
 Set prm = New ADODB.Parameter
 prm.Type = adDate 'metti il tipo giusto
 prm.Direction = adParamInput
 cm.Parameters.Append prm
 Set prm = New ADODB.Parameter
 prm.Type = adLong 'metti il tipo giusto
 prm.Direction = adParamInput
 cm.Parameters.Append prm
'ti consiglio di farti una sub che "appende" i parametri
...
Poi dentro il tuo ciclo:
For Each Tratta In Giornata.Tratte
   cm.Parameters("Campo1").Value =
   cm.Parameters("Campo2").Value =
   cm.Execute
Next
