Recorrer un recordset con acciones diversas |
Responder |
Autor | |
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
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:
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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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
|
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
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,
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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 |
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
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? |
|
emiliove
Administrador Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5694 |
Enviado: 03/Agosto/2020 a las 22:39 |
Siempre puedes poner un Exit en donde estes: Exit Do Saludos.
|
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
Enviado: 04/Agosto/2020 a las 11:58 |
¿Y puedo volver al bucle en el punto donde he salido con un exit?
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
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 |
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
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
|
|
guarracuco
Moderador Unido: 24/Abril/2004 Localización: EEUU Estado: Sin conexión Puntos: 3239 |
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.
|
|
thrall
Nuevo Unido: 04/Agosto/2020 Localización: mexico Estado: Sin conexión Puntos: 21 |
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 |
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
Enviado: 07/Agosto/2020 a las 18:25 |
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
|
|
Marcelo
Nuevo Unido: 02/Agosto/2020 Localización: Valencia Estado: Sin conexión Puntos: 13 |
Enviado: 07/Agosto/2020 a las 18:30 |
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
|
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |