Newsgroup: it.comp.lang.visual-basic
Titolo: rimuovere record da recordset

buon giorno a tutti,
domanda strana, oggi.
Le premesse sono, VB6, ADO e SQLserver 2000.
Apro un recordset e tramite una select lo popolo di alcuni record che 
soddisfano una clausola Where.
E' possibile manipolare questo recordset per eliminare dallo stesso alcuni 
record?
Mi spiego.. con il metodo MioRecord.Delete, in effetti sto effettivamente 
cancellando un record dal database.
Io vorrei poter rimuovere un record dal recordset che ho in memoria, ma 
senza eliminarlo fisicamente dal database.
Per fare cio', al momento sto procedendo nell'unica maniera che mi viene in 
mente, cioe' clonare il recordset iniziale, disconnettere il recordset clone 
dalla base dati, eliminare quello che voglio togliere, ed infine riclonare 
il recordset elaborato in quello iniziale.
C'e' un modo per fare di meglio e piu' velocemente?
Ciao e grazie... Maurizio

 C'e' un modo per fare di meglio e piu' velocemente?
Crea direttamente un recordset disconnesso e lavora su quello.
Devi aprirlo AdUseClient, AdOpenStatic e poi settare
Rs.ActiveConnection=Nothing una volta aperto.
Anche se poi volendo puoi riagganciare la connessione e salvare le
modifiche.
Se non ti serve, io per sicurezza scriverei una routine che dato un
Recordset ne crea uno non agganciato ad alcuna base di dati, una cosa del
genere:
Public Function Rs2RsRam(RsSource As ADODB.Recordset, AncheDati As Boolean)
As ADODB.Recordset
'routine che mi copia un recordset e i dati (se AncheDati=true) 
'in una struttura identica ma disconnessa
Dim CAMPO As ADODB.Field
Dim Tipo As Integer
Set Rs2RsRam = New ADODB.Recordset
For Each CAMPO In RsSource.Fields
  If CAMPO.Type = 131 Then 'per problema con tipo
    Tipo = adCurrency
  Else
    Tipo = CAMPO.Type
  End If
  Rs2RsRam.Fields.Append CAMPO.Name, Tipo, CAMPO.DefinedSize,
adFldIsNullable
Next
Rs2RsRam.Open
If AncheDati Then
  RsSource.MoveFirst
  Do Until RsSource.EOF
    Rs2RsRam.AddNew
    For Each CAMPO In RsSource.Fields
      Rs2RsRam.Fields(CAMPO.Name).Value = CAMPO.Value
    Next
    Rs2RsRam.Update
    RsSource.MoveNext
  Loop
End If
If Not RsSource.EOF Or Not RsSource.BOF Then RsSource.MoveFirst
'For Each Campo In Rs2RsRam.Fields
'  Debug.Print Campo.Name; Campo.Type, Campo.DefinedSize
'Next
End Function

 record?
[CUT]
Ciao,
il recordset deve avere, innanzitutto, i cursori lato client.
fai la select,
disconnetti il recorset ponendo a nothing l'active connection,
fai il delete del record.
vado a memoria, non ho provato.
ciao
stefano

 vado a memoria, non ho provato.
Si, in ogni caso c'è da dire che se uno per sbaglio riattacca la connection
(e credo debba fare un update), si ritrovi il DB rovinato.
Io preferisco la routine che ho postato, quella sicuramente non sa cosa sia
la connessione al DB :) Magari è più lenta se ci sono molti record, ma per
come la uso non ho problemi, anche perchè se tiro su i record in locale,
difficilmente sono molte righe.

 Rs.ActiveConnection=Nothing una volta aperto.
....
si, infatti ho fatto proprio questo, ma il problema era che se poi devo 
ripristinare la connessione, mi sarei trovato comunque i dati cancellati.
non avevo pensato a creare un "clone" che si costruisce da solo, come la 
funzione che hai scritto tu.
In effetti, per quello che mi serve ora, mi e' bastato semplicemente 
disconnettere il recordset, farci quello che mi serviva, e buttarlo via; io 
mi ponevo il problema (meglio essere previdenti) di affrontare l'esigenza di 
riconnettere il db.
Grazie per l'input.
Ciao... Maurizio 

 fai il delete del record.
...
Si si, per le mie esigenze di ora, faccio esattamente questo, e funziona 
benissimo (ottima memoria, complimenti), ma come scrivevo anche ad Andrea, 
mi ponevo il problema di gestire una eventuale riconnessione.
Grazie... Maurizio 

 difficilmente sono molte righe.
Domanda,
ma se setti a nothing la connessione, a quel punto non è lo stesso che 
partire da un recset disconnesso?
Forse mi sfugge qualcosa.
ciao
stefano

 Forse mi sfugge qualcosa.
Mi pare che se poi fai Set Rs=Adocn dovrebbe aggiornare le tabelle, o
comunque dopo un update.
Finche lo sai ed è in una routine ristretta va bene, se ci mettono le mani
altri ed è un recset "globale", preferisco evitare :)

Mizio ha scritto:

Ciao,
dal libro di Balena:
"Disconnessione del Recordset:
In sostanza ADO permette di creare Recordset su cui potete eseguire 
tutti i comandi che desiderate -fra cui eliminazioni, inserimenti e 
aggiornamenti- senza influenzare in modo immediato le righe originali 
del database. Potete persino disconnettere il Recordset dal database 
impostando la sua proprietą ActiveConnection a Nothing e 
facoltativamente chiudere l'oggetto Connection che l'accompagna. Quando 
infine siete pronti a confermare gli aggiornamenti al database, vi basta 
ricollegare il Recodset ed eseguire il comando UpdateBatch; oppure 
potete ricorrere al metodo CancelBatch per annullare le modifiche in 
sospeso."
Bisogna verificare se il cancelupdate evita l'aggiornamento del database 
lasciando il recset modificato oppure lo ripristina anche alla 
situazione precedente.
ciao
stefano

 altri ed è un recset "globale", preferisco evitare :)
Ciao Andrea,
come ho scritto a Mizio, nel libro di Balena c'è scritto che puoi fare 
l'updatebatch per aggiornare oppure il cancelupdate per non confermare 
ma in questo caso non so se il recset venga riportato allo stato 
ante-modifiche.
ciao
stefano

"Andrea [Work]" <nos...@invalid.invalid> ha scritto nel messaggio 
news:1ol40tne8aajn.1...@40tude.net...

Su un recordset "client" se non ricordo male, quando chiami Update aggiorni 
il recordset, chiami UpdateBatch per aggiornare il DB.
Ciao