Hola martin - quitar registro de un recordset

Hago una selección de registros con un control ado... Que por ejemplo me devuelve 10 registros... Y necesito poder sacar algunos de esos registros del RECORDSET, sin borrarlos de la base de datos y sin volver a hacer la selección...
No se si me explico..
No quiero borrarlos de la base. Solamente quiero sacarlos del recordset... Y como tengo que hacerlo muchas veces. No me resulta conveniente volver a hacer el select escluyendo esos registros...
¿Hay alguna forma?
Respuesta
1
A ver, te paso un código, la prueba la he hecho con una tabla que tiene 3 campos, COL1, COL2 y MARCADO, este campo marcado sería el que tienes que crear, que acepte valores NULL.
Fíjate que declaro lngNum, UpBound y LowBound y la linea Randomize Timer, para generar nºs aleatorios.
Por el final está el bucle que obtiene un nº aleatorio, que coge el registro correspondiente a ese nº, y chequea el campo MARCADO, si no es NULL vuelve a buscar(cuando no es null se supone que ya se ha utilizado), si es NULL, le grabo un "SI" para marcarlo como usado y salgo del bucle.
Private Sub Form_Load()
Dim strSQL As String
Dim conn As New Connection
Dim rsOrders As New Recordset
Dim x As Integer, blnNuevo As Boolean
'Para generar nºs aleatorios
Dim lngNum As Long, UpBound As Long, LowBound As Long
UpBound = 100: LowBound = 1
Randomize Timer
'En el .open pego la connectionstring del control ado. Aquí he conectado a una bd sqlserver.
conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=patatan;Data Source=127.0.0.1"
strSQL = "SELECT * FROM Table_1"
rsOrders.CursorLocation = adUseClient
'Aquí abro el recordset.
rsOrders.Open strSQL, conn, adOpenDynamic, adLockPessimistic
UpBound = rsOrders.RecordCount
LowBound = 1
lngNum = (UpBound - LowBound + 1) * Rnd + LowBound
'Con las 3 lineas de arriba he generado un nº aleatorio entre 1 y el total de registros.
'Ahora me sitúo en el elegido aleatoriamente y compruebo si está marcado
'hago el bucle hasta situarme en uno no marcado.
'Cuando me sitúo en uno grabo el SI para dejarlo como marcado.
Do While blnNuevo = False
rsOrders.Move lngNum
If IsNull(rsOrders.Fields(2)) Then
blnNuevo = True
rsOrders.Fields(2) = "SI"
End If
Loop
rsOrders.Close
conn.Close
Set conn = Nothing
End Sub
Muchísimas gracias una excelente respuesta...
No me gusta mucho eso que haces pero vamos... tu verás porqué lo haces. Para eso puedes usar un truco que supongo que funcionará aunque... olvídate de usar el control ado, tienes que crear la conexión por código. Yo el control ado lo uso para que me genere la cadena de conexión, copio el contenido de la propiedad connectionstring y borro el control.
Private Sub Form_Load()
Dim strSQL As String
Dim conn As New Connection
Dim rsOrders As New Recordset
Dim x As Integer
'En el .open pego la connectionstring del control ado. Aquí he conectado a una bd sqlserver.
conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=patatan;Data Source=127.0.0.1"
strSQL = "SELECT * FROM Table_1"
rsOrders.CursorLocation = adUseClient
'Aquí abro el recordset.
rsOrders.Open strSQL, conn, adOpenDynamic, adLockPessimistic
'Comienzo la transacción.
conn.BeginTrans
'Aquí por ejemplo borro el primer registro.
For x = 1 To rsOrders.RecordCount
If x = 1 Then
rsOrders.Delete
End If
Next
'He terminado, si quisiera guardar los cambios tendría que hacer un conn.CommitTrans
'Hago un RollbackTrans que lo deja todo como estaba.
conn.RollbackTrans
rsOrders.Close
conn.Close
Set conn = Nothing
End Sub
Creo que está claro, trabajas con el recordset, borras lo que quieres y haces un rollback para dejarlo todo como estaba.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas