Access - Hacer uso de varios recordsets simultaneamente

   
Vista:

Hacer uso de varios recordsets simultaneamente

Publicado por nsut (28 intervenciones) el 26/09/2017 22:03:12
Buenas,

¿Se puede abrir y recorrer un recordset (vamos a llamarlo mirecordset_2) dentro de un bucle donde se está recorriendo otro recordset (vamos a llamarlo mirecordset)?

Pongo el código por si ayuda a plantear la duda:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim conexiondeclarada As New ADODB.Connection
Set conexiondeclarada = CurrentProject.Connection
 
Dim mirecordset As New ADODB.Recordset
Dim mirecordset_2 As New ADODB.Recordset
 
parametro = Me.nombredetexbox.Value
mirecordset.Open "SELECT campo1, campo2 FROM tablaejemplo WHERE [campo3] = '" & parametro & "' ", conexiondeclarada
 
Do Until mirecordset.EOF
    Debug.Print mirecordset!campo1
 
    Do Until mirecordset_2.EOF
        mirecordset_2.Open "SELECT campo1, campo2 FROM tablaejemplo WHERE [campo3] = '" & parametro & "' ", conexiondeclarada
        Debug.Print mirecordset_2!campo1
        mirecordset_2.MoveNext
    Loop
 
    mirecordset.MoveNext
Loop

El error que me aparece al ejecutar el código es el siguiente: "La operación no está permitida si el objeto está abierto"

Si todas las líneas referentes al mirecordset_2 las emplazo fuera del bucle del recordset mirecordset, funcona.

Muchas gracias por vuestra ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de jorge

Hacer uso de varios recordsets simultaneamente

Publicado por jorge (244 intervenciones) el 26/09/2017 22:32:51
no faltara cerar el recordset y liberar memoria.

mirecordset.Close
Set mirecordset= Nothing
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por nsut (28 intervenciones) el 26/09/2017 23:13:13
Hola! Gracias por tu aportación.

Aun así, no me interesaría del todo lo que propones.

En el mensaje anterior he puesto un código de prueba donde se ejecuta la misma intrucción sql...pero la idea es que, tomando los valores que voy recorriendo del recordset del bucle exterior (uno a uno), ejecutar una serie de líneas de código (dependientes del valor tomado en el bucle exterior) haciendo uso del recordset del bucle interior.

Dicho de otra manera...SI cierro "mirecordset", que es el recordset que se recorre en el bucle exterior, me quedo sin la posibilidad de recorrer "mirecordset_2" en el bucle interior haciendo uso de los valores (uno a uno) tomados en "mirecordset"...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por Anonimo (942 intervenciones) el 27/09/2017 03:14:55
Este orden carece de lógica:
1
2
3
4
......
Do Until mirecordset_2.EOF
 mirecordset_2.Open "SELECT campo1, campo2 FROM tablaejemplo WHERE [campo3] = '" & parametro & "' ", conexiondeclarada
....

La primera línea intenta verificar datos de un recordset al que no se le asigno origen ¿¿??
La segunda asigna origen de datos (o lo intenta) a un recordset que esta abierto, de momento sin origen de datos y (como esta en un bucle que no finalizo) esta siendo utilizado.

La opción lógica seria:
1º) asignar el origen de datos
2º) ya con datos, recorrerlo hasta su final

(nota: aunque por defecto los recordset tengan tendencia a comenzar al inicio del conjunto de datos, no le haría daño y evitaría suspicacias si se le ordena ir al inicio)

En la siguiente vuelta de 'mirecordset ' (se presupone que cambiara el dato referente para el recordset_2) reasignaría un nuevo origen de datos a mirecordset_2 y ejecutaría su particular ciclo

Este ciclo que engloba al cambio de origen y su particular ciclo se repetiría mientas existan registros en 'mirecordset '
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por nsut (28 intervenciones) el 27/09/2017 08:24:33
Tienes razón. Mirecordset2.Open debe estar arriba del Do Until mirecordset2.EOF.

Además, tenía que cerrar antes de abrir mirecordset2. De todas formas, Hay alguna forma de cambiar el origen de datos de mirecordset2 sin tener que andar abriendo y cerrando?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por Anonimo (942 intervenciones) el 27/09/2017 09:58:38
Cerrar un recordset es algo conveniente además de aconsejable cuando se finaliza el trabajo que lo creo y se desea liberar los recursos que utilizo (el espacio en la memoria de trabajo)

Si se aplicase esa misma 'lógica' a una modificación en el origen de datos de un cuadro de texto de un formulario, se tendría que cerrar y volver a abrir ese formulario ¿se hace así?....

Se ha creado un entorno (dos, pero aquí se trata del 'Recordset_2') para manejar datos, se le puede cambiar su contenido cuando sea necesario (siempre que no coincida con el medio de una operación que no se pueda abortar) y es por ello que 'recomiendo' que tras el cambio de su origen de datos, se le 'refuerce' la obligación de ir al primer registro

Aun un poco mas, recomendaría que se le 'agitase' enviándolo al final y de vuelta al principio antes de trastear con el, aunque requiera verificar que el recordset tiene datos para evitar problemas (esto es valido para cualquier circunstancia, no solo en este caso).

Cuando dejen de ser útiles es cuando se cierran los recordset y se liberan los recursos que ha utilizado (también es de aplicación para cualquier otro objeto que ocupe de forma inútil espacio en la memoria de trabajo)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por nsut (28 intervenciones) el 27/09/2017 17:14:31
Me queda claro, pero no sé cambiar el origen de datos sin incluir el hecho de abrir y cerrar el recordset.

Siempre he operado de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim conexiondeclarada As New ADODB.Connection
Set conexiondeclarada = CurrentProject.Connection
 
Dim mirecordset As New ADODB.Recordset
 
mirecordset.Open instruccionSQL, conexiondeclarada 'donde intruccionSQL es una variable string que se tendría que definir
 
'Te hago caso y establezco que vaya si o si al primer registro antes de operar con el recordset
mirecordset.MoveFirst
 
'Recorro el recordset sacando en la "ventana inmediato" los registros del campo1, por hacer algo...
Do Until mirecordset.EOF
    Debug.Print mirecordset!campo1
    mirecordset.MoveNext
Loop
 
'A continuación cierro y elimino de la memoria tanto mirecordset como la conexión
mirecordset.close
mirecordset = nothing
 
conexiondeclarada.close
conexiondeclara = nothing


En caso de que ese recordset se definiera dependiendo de los valores de otro recordset (es decir, en caso de que ese recordset se recorriese dentro de otro bucle recordset externo y, a su vez, en cada iteración del bucle externo el recordset interno se modificase...)¿Con qué líneas de código podría trabajar para evitar el <mirecordset.open intruccionSQLstring, miconexion> ? Es decir, ¿Qué código me permitiría dejar abierto el recordset y simplemente cambiar el valor de sus registros, pisando los valores anteriores almacenados en memoria?

Muchas gracias por todo, de verdad. Me sirve de mucho tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Hacer uso de varios recordsets simultaneamente

Publicado por Anonimo (942 intervenciones) el 28/09/2017 09:26:38
La forma mas eficiente (porque es la natural de Access) es utilizar DAO en lugar de ADO.
Yo utilizaria ADO si los datos fueran externos a Access y ese origen de datos no permitiese trabajar directamente (como lo permite la combinacion Access <=> SQL Server).

Con DAO se puede crear un bucle dentro de otro bucle (ambos bucles son conjuntos de datos manejados mediante recordset) y se puede cambiar el origen de datos al bucle 'interno' en cada vuelta del bucle principal sin mas que asignar el nuevo origen de datos.

En sintesis seria algo asi (espero no dejarme algun paso en el tintero):

0.- Se dimensionan ambos recordset
0.- Se le adjudica origen de datos al recordset principal
0.- Se verifica que tiene contenido (si no lo tiene ==> FIN)
0.- Se le envia al final y de vuelta al inicio (el recordset carga 'todo' su contenido y ademas 'fresquito')
0.- Se inicia el bucle principal
1.- Se genera un origen de datos para el segundo recordset (se supone que utiliza referencias del registro actual del recordset principal)
1.- Se verifica si tiene contenido (si no lo tiene ==> se finaliza el paso de este bucle)
1.- Nuevamente al final y vuelta al inicio del recordset (esta vez del interno)
2.- Se inicia el bucle interno
2.- Se procesa la informacion
2.- Se va al siguiente registro del bucle interno
2.- se repiten los pasos anteriores hasta finalizar con el contenido del bucle interno
0.- se avanza al siguiente registro del bucle principal
0.- se repiten los pasos del bucle principal hasta finalizar sus registros
0.- Fin del proceso: se cierran los recordset y se liberan recursos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad