Seleccionar registro desde otro formulario |
Responder |
Autor | |
Jolkas40
Nuevo Unido: 17/Junio/2019 Localización: San Sebastián Estado: Sin conexión Puntos: 14 |
Tema: Seleccionar registro desde otro formulario Enviado: 16/Septiembre/2022 a las 21:49 |
Hola a todos:
Lo primero de todo, tengo poca experiencia en Access. Anticipo esto, porque es posible que mis expresiones en el planteamiento que hago a continuacion no sean del todo acertadas. Tengo una aplicacion con mas de 2000 registros. La Tabla tiene como Clave prioncipal un campo llamado NumeroRegistro que es Autonumerico ademas. claro esta, de los datos personales de cada socio. La aplicación se abre inicialmente en el Formulario2 donde estan todos los datos de cada uno de los socios. Tengo un boton (Comando50) en ese Formulario2 que me permite escribir el primer apellido y esto me lleva al Formulario3. Private Sub Comando50_Click() DoCmd.OpenForm ("Formulario3") End Sub El Formulario3 muestra en filas, tres columnas: Nombre, Apellido1 y Apellido2 Y vinculado al Apellido1 tiene este macro incrustado: Al hacer click: Private Sub comando7_click() Dim sFiltro As String Dim entrada As String entrada = InputBox("Escribe el apellido", " Búsqueda") sFiltro = "Apellido1 LIKE'*" & entrada & "*'" Form_Formulario3.Filter = sFiltro Form_Formulario3.FilterOn = True End Sub De esta manera, consigo que me muestre en el Formulario3 la lista de socios que tienen solamente el mismo Apellido1 Y al hacer doble click en el Apelllido1, que tiene esta macro incrustada: Private Sub Nombre_DblClick(Cancel As Integer) Dim nPuntero As Integer On Error Resume Next nPuntero = NumeroRegistro DoCmd.Close DoCmd.OpenForm "Formulario2" DoCmd.GoToRecord acDataForm, "Formulario2", acGoTo, nPuntero End Sub pretendia que me muestre en el Formulario2 el registro sobre el que hago el doble click. Y aqui es donde esta el problema que no consigo resolver. Me abre, eso sí el Formulario2 pero no con el registro que he seleccionado con el doble click en el Formlulario3. El problema, hasta donde he podido analizar, está en la utilizacion del campo NumeroRegistro (que es autonuimérico) que lo "capturo" en el Formulario 3 en la variable nPuntero. Y ocurre que cuando me abre el Formulario2 ( DoCmd.GoToRecord acDataForm, "Formulario2", acGoTo, nPuntero) lo que cme hace es abrir el registro que tiene el "CurrentRecord" igual al nPuntero, pero obviamente no siempre tienen por que coincidir el Autonumerico del NumeroRegistro con su número de registro... ya que hay fichas que han sido suprimidas... etc. etc. Estoy dando vueltas y vueltas al tema con resultados nulos... Alguna ayuda? Gracias anticipadas. Jolkas40 |
|
Saludos Cordiales.
Jolkas |
|
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: 18/Septiembre/2022 a las 11:03 |
Hola,
Opción 1: abrir el Formulario2 FILTRADO a ese registro (y sin ver ningún otro) El OpeneForm dispone de algunos argumentos más aparte del nombre del formulario que se desea abrir. Uno de ellos es el WhereCondition dónde puedes escribir la condición. En tu caso: DoCmd.OpenForm "Formulario2",,,"NumRegistro = " & Me!NumRegistro Opción 2: abrir el Formulario2 POSICIONADO en ese registro (pudiendo navegar al resto de registros) En ese caso yo utilizaría el último argumento del OpenForm llamado OpenArgs dónde puedes pasar lo que tu quieras... en este caso el NumRegistro DoCmd.OpenForm "Formulario2",,,,,, Me!NumRegistro En el evento Open del Formulario2 tratas si viene algo en el OpenArgs (If Me.OpenArgs <> "" Then...) y posicionas en consecuencia. Un saludo
|
|
Jolkas40
Nuevo Unido: 17/Junio/2019 Localización: San Sebastián Estado: Sin conexión Puntos: 14 |
Enviado: 18/Septiembre/2022 a las 15:47 |
Muchas garacias, amigo Xavi por tu aportacion.
La he probado la opcion 1... pues el tema no termina de encauzarse como quisiera... DoCmd.OpenForm "Formulario2",,,"NumRegistro = " & Me!NumRegistro y ha quedado así: -------------------------------------------------------------------------------------- Private Sub Nombre_DblClick(Cancel As Integer) Dim nPuntero As Integer On Error Resume Next nPuntero = NumeroRegistro DoCmd.Close DoCmd.OpenForm "Formulario2", , , "NumRegistro = " & Me!NumeroRegistro DoCmd.GoToRecord acDataForm, "Formulario2", acGoTo, nPuntero End Sub --------------------------------------------------------------------------------------- Con la opción "NumRegistro = " & Me!NumeroRegistro Me parece que lo que lee es el valor del NumeroRegistro que es la clave autonumerica que no coincide con el lugar que ocupa cada registro en la tabla. Por ejemplo, si en un momento determinado he suprimido dos registros por estar duplicados, su NumeroRegistro no cambia, pero sí ha cambiado el puesto que ocupan en la Tabla, que en este supuesto el NumeroRegistro puede ser 845 pero el puesto que ocupa en la table es 843 por motivo de esos dos registros eliminados. Estoy peleando por conseguir que en esa macro, nPuntero no lea el NumeroRegistro sino el CurrenRecord pero no lo consigo y no se siqueira si es posible, o no acierto por problema de sintaxis que debo utilizar en el Macro. ------------------------------------------------------- Quizas, debo cambiar todo el planteamiento, porque en resumen, lo que necesito, es: 1.- Seleccionar un registro y para ello echo mano al Formulario3 (me fltra un solo registro) 2.- De ese formulario3 con el unico registro seleccionado, quiero pasar al Formulario2 y que me muestre ese mismo registro. -------------------------------------------------------- La razón por la que lo hago así, es porque el Formulario3 tiene solamente los campos Nombre, Apellido1 y Apellido2. En cambio en el Formulario2, puedo ver todos los campos, y eso me sirve para estar seguro de que es el registro que me interesa, ya que hay varios registros con el primer apellido igual.... incluso con el primero y el segundo igual, caso de que sean hermanos... Desde mi puto de vista, repito, lo que necesito se resolveria si fuera posible en la macro que he incluido, que la variable nPuntero capturara no el NumeroRegistro (autonumerico de la clave principal) sino el lugar que ocupa realmente en la tabla, porque esta linea de la macro, lleva invariablemente al lugar que ocupa el registro, no al registro que tenga ese número como NumeroRegistro DoCmd.GoToRecord acDataForm, "Formulario2", acGoTo, nPuntero En fin. Muchas gracias de nuevo amigo Xavi. Tu respuesta en el Foro, me ha animado un montón... Seuire peleando por aprender. Saludos cordiales. Kolkas40 |
|
Saludos Cordiales.
Jolkas |
|
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: 19/Septiembre/2022 a las 09:24 |
Hola,
Lo complicas en exceso. Centrémonos en la opción 1. Premisas - Cada registro se identifica inequívocamente por el valor del campo NumeroRegistro - Ambos formularios (origen y destino) contienen ese campo - El formulario destino tiene un origen del registro que permitiría ver cualquier registro de la tabla. Analicemos tu código Declaramos variable nPuntero y le asignas el valor del campo NumeroRegistro. Ese valor no tiene porque coincidir con su *posición* dentro del conjunto porque, como ya apuntas tu, pueden existir huecos. DoCmd.Close --> aquí cierras algo. Al no especificar se supone el objeto activo. Para evitar efectos indeseados, es conveniente indicar qué objeto cierras y que nombre tiene --> DoCmd.Close acForm, Me.Name DoCmd.OpenForm.... --> Aqui es dónde abres el otro formulario filtrado al valor que quieres obtener DoCmd.GoToRecord... --> Aquí te mueves al puntero... ¿para qué si en la instrucción anterior ya estamos en el registro? Resumiendo tu código: todas las líneas fuera excepto el OpenForm
Apuntas la posibilidad de tomar el CurrentRecord. También se podría hacer siempre y cuando: - Ambos formularios muestren la misma colección de registros - Ambos formularios tengan la misma ordenación En ese caso puedes obtener el nPuntero con Me.CurrentRecord, abrir el formulario sin filtro y desplazarte con GoToRecord Si acaso dejamos la opción 2 para otro momento. Un saludo |
|
Jolkas40
Nuevo Unido: 17/Junio/2019 Localización: San Sebastián Estado: Sin conexión Puntos: 14 |
Enviado: 19/Septiembre/2022 a las 16:09 |
Hola Xavi:
Increible... Pero cierto. Muchas... muchas... muchas gracias. Ha quedado así: -------------------------------------------------------------------------------- Private Sub Nombre_DblClick(Cancel As Integer) DoCmd.OpenForm "Formulario2", , , "NumeroRegistro = " & Me!NumeroRegistro DoCmd.Close acForm, "Formulario3" End Sub --------------------------------------------------------------------------------- Y hace lo que yo buscaba. Muchas gracias por describirme tan bien lo que sobraba y lo que debia quedar. Pasaran de 100 las pruebas que he venido haciendo, sin ninguna duda, añadiendo, quitando y cambiando cosas... sin conseguir lo que quería. Creo que han sido siempre, "palos de ciego", por no llegar a entender el alcance de cada instrucción, o el alcance de cada parámetro... He copiado pistas de un monton de paginas de Internet... sin "acertar" porque evidentemente los palos de ciego no llevan a ninguna parte. Me dices: "Si acaso dejamos la opción 2 para otro momento." Mejor... la dejamos. Necesito asimilar la nueva situación con el "problema" resuelto. En fin. No tengo más palabras que GRACIAS AMIGO Xavi. Saludos cordiales Jolkas40 |
|
Saludos Cordiales.
Jolkas |
|
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 |