** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Recorrer un recordset con acciones diversas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoRecorrer un recordset con acciones diversas

 Responder Responder
Autor
Mensaje
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Tema: Recorrer un recordset con acciones diversas
    Enviado: 02/Agosto/2020 a las 14:09
En Formulario tengo unos campos de selección:
número de libro
Titulo
Autor

y recorrer el recordset, como sigue:

    If RS.RecordCount > 0 Then
        RS.MoveLast    'esto lo hago porque el recordcount no siempre me da el número correcto
        FINDRECORDCOUNT = RS.RecordCount
        RS.MoveFirst
        DoCmd.SetWarnings False

        Do While Not RS.EOF 
            NumLibro = Nz(RS("NumeroDeLibro"), 0)
            TitLibro = Nz(RS("TituloDeLibro"), "")
            Autor = Nz(RS("Autor"), "")

EN ESTE PUNTO QUIERO ELEGIR ENTRE:
    • IR AL SIGUIENTE REGISTRO, MEDIANTE CLICK EN UN BOTON
    • IR AL REGISTRO ANTERIOR, MEDIANTE CLICK EN UN BOTON
    • SELECCIONAR ESTE REGISTRO PARA REALIZAR ACCIONES CON ÉL (IMPRIMIR FICHA, MODIFICAR DATOS, ENVIARME UN E-MAIL, ...)
    • TERMINAR EL BUCLE
        
        Loop

El problema lo tengo en que si capturo el click  de los botones, por ejemplo mediante un stop, salgo del bucle y no sé como retornar al siguiente (o anterior) registro. No hay problema sobre las acciones específicas a realizar en cada caso.

Voy un poco perdido y agradeceré cualquier ayuda


 
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 03/Agosto/2020 a las 10:55
Hola Marcelo y bienvenido al foro,

Las preguntas que se me ocurren son

- ¿Dónde se ejecuta ese código?
- ¿Porque recorres un Recordset?
- Esa asignación que haces, ¿es a variable o a control?


Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 03/Agosto/2020 a las 18:54
Hola Xavi,

Ese código lo ejecuto en un formulario. Tengo unas variables de selección (tipo de libro, código de libro, título de libro, ...). Al salir del último de los parámetros de selección es donde  hago una consulta sql, en la que puedo obtener como resultado un registro, ninguno, o varios. Ahí es donde inicio el bucle.

El Recordset lo recorro porque quiero poder realizar acciones (pasar al siguiente registro, pasar al registro anterior, ir al último, ir al primero; y en el registro actual imprimir, llamar a otro formulario, enviar  un comunicado, ...) en cada uno de los registros, cuando hay más de uno. Si solo es uno no hay problema porque cedo el control a otro control, valga la redundancia.

En cuanto a la última pregunta, no tengo claro qué es. En función del botón que "clique" quiero realizar una cosa u otra. Si no tengo una pausa el sistema recorre todos los registros. Si mando el control a un botón (confirmar el registro actual o ir al siguiente si lo hay, por ejemplo) ya no puedo retornar al bucle de lectura. Los datos de cada iteración de lectura los envío a variables. No se si es eso lo que perguntas.

Ya me dices.

Saludos,
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 03/Agosto/2020 a las 19:02
Me parece que, o yo me pierdo algo, o tu no has entendido el tema de los Recordsets.

Lo que "parece" que quieres hacer es filtrar los registros de un ¿formulario? de modo que puedas interactuar con ellos.

Si es eso, lo que necesitas es asignar la propiedad RecordSource al ¿formulario? ¿subformulario? de modo que solo muestre los registros coincidentes y ya podrás desplazarte por ellos, editarlos, etc.

Si no es eso, entonces vuelve a explicar desde el principio que es lo que tienes y lo que quieres hacer (pero con otras palabras)

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 03/Agosto/2020 a las 21:20
A ver si logro explicarme (es lo que tiene ser novato en esto, aficionado y autodidacta):

Ejemplo práctico:

Tras introducir unos parámetros de búsqueda en un formulario (Autor like %REVERTE%, por ejemplo) hago una consulta SQL y recupero 8 títulos, 3 de Javier Reverte y 5 de Arturo Perez-Reverte. Hasta ahí ningún problema. Los encuentro todos. Si utilizo un msgbox en el bucle (una pausa a la espera de una acción del  usuario) los voy viendo de uno en uno. Sigue siendo correcto.

Puedo utilizar la propiedad RecordSource para el formulario (utilizando la consulta SQL anterior), con lo cual puede ser una solución sencilla, y quizás eficaz (la he utilizado otras veces y puede que esta vez me haya ido por los cerros de Úbeda). Pero lo que quería era "capturarpor código " el control del flujo del programa en el bucle, para decidir qué acciones tomar, y después (salvo que la opción sea terminar las iteraciones) de haberla tomado ir al siguiente ciclo del bucle.

Puede que me esté complicando más de la cuenta, pero con esta forma quería, para esta ocasión y futuras, que el programa fuera más versátil.

¿Hay forma de capturar el control en el bucle, es decir, salir de él y volver a entrar?




Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
Enlace directo a este mensaje Enviado: 03/Agosto/2020 a las 22:39
Siempre puedes poner un Exit en donde estes:
Exit Do
Exit For
Exit Function
Exit Property
Exit Sub

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/exit-statement

Saludos.
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 04/Agosto/2020 a las 11:58
¿Y puedo volver al bucle en el punto donde he salido con un exit?
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 04/Agosto/2020 a las 12:33
Creo que, en ese caso, mejor utilizar subrutinas: GoSub.. Return. De esa forma no "llenas" el código en el bucle. En pseudocodigo:

Do
 Si esto se cumple GoSub Accion1
 Si lo otro se cumple GoSub Accion2
Loop

Salida

Accion1:
  acciones
  Return

Accion2:
  aciones
  Return

Xavi, un minyó de Terrassa

Mi web
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 04/Agosto/2020 a las 13:57
Efectivamente, esa era la idea.
La cosa es como pausar la ejecución hasta que haga click en uno de varios botones (anterior, siguiente, seleccionar). Si hago click ya he salido del bucle do ... loop.

Pero por lo que veo hay algo (o mucho) que no estoy haciendo bien. Quizá debería hacer la selección (esta sí con una instrucción SQL, para recuperar únicamente la clave principal), guardar los valores en una matriz temporal, y recorrer esa matriz utilizando variables y en cada caso hacer la lectura del registro completo, con lo que sí dominaría el flujo del programa.

Creo que mi idea inicial iba por mal camino o estaba utilizando las herramientas equivocadas o de modo equivocado.

Experimentaré y si tengo alguna duda lanzaré una nueva pregunta.

Gracias por todo
Arriba
guarracuco Ver desplegable
Moderador
Moderador


Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3239
Enlace directo a este mensaje Enviado: 06/Agosto/2020 a las 22:13
llenando un cuadro de lista con los resultados obtenidos, sin origen de registro, liberas el recordset, ya que no debes detener la ejecución. Una de esas columnas( oculta) contiene el id, y un proceso alhacerclick, carga elntecordset seleccionado, bien en otro formulario o en un reporte.
Arriba
thrall Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 04/Agosto/2020
Localización: mexico
Estado: Sin conexión
Puntos: 21
Enlace directo a este mensaje Enviado: 06/Agosto/2020 a las 23:47
Tal vez lo que requieras es hacer uso de los métodos para moverse dentro del Recordset.

Cada uno de ellos lo pones en un botón y en el evento click pones el método que le corresponda, ya sea primero, anterior, siguiente o último.



Después de poner el método correspondiente debes asignar el valor de cada campo a la variable para que entonces tenga el valor del registro actual.

Yo quitaría el loop que tienes, pues te hará recorrer todo el recordset desde el registro 1 hasta el n y quedarás solo con el último registro.

Saludos.


Editado por thrall - 06/Agosto/2020 a las 23:47
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Agosto/2020 a las 18:25
Publicado originalmente por guarracuco guarracuco escribió:

llenando un cuadro de lista con los resultados obtenidos, sin origen de registro, liberas el recordset, ya que no debes detener la ejecución. Una de esas columnas( oculta) contiene el id, y un proceso alhacerclick, carga elntecordset seleccionado, bien en otro formulario o en un reporte.

Sí, es esto lo que quería, pero pensaba que lo podía hacer como parte del bucle de lectura, pero es, efectivamente, mejor cargar los datos en otro control y desde ahí, sí, operar.

Gracias por la respuesta
Arriba
Marcelo Ver desplegable
Nuevo
Nuevo


Unido: 02/Agosto/2020
Localización: Valencia
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Agosto/2020 a las 18:30
Publicado originalmente por thrall thrall escribió:

Tal vez lo que requieras es hacer uso de los métodos para moverse dentro del Recordset.

Cada uno de ellos lo pones en un botón y en el evento click pones el método que le corresponda, ya sea primero, anterior, siguiente o último.



Después de poner el método correspondiente debes asignar el valor de cada campo a la variable para que entonces tenga el valor del registro actual.

Yo quitaría el loop que tienes, pues te hará recorrer todo el recordset desde el registro 1 hasta el n y quedarás solo con el último registro.

Saludos.

Esta es también una opción que veré, aunque quizás para lo que quiero, la opción que proponía Xavi es la más sencilla, y la de Guarracuco igualmente eficaz.

Gracias
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable