** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Seleccionar registro desde otro formulario
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSeleccionar registro desde otro formulario

 Responder Responder
Autor
Mensaje
Jolkas40 Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 17/Junio/2019
Localización: San Sebastián
Estado: Sin conexión
Puntos: 14
Enlace directo a este mensaje 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
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: 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
Xavi, un minyó de Terrassa

Mi web
Arriba
Jolkas40 Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 17/Junio/2019
Localización: San Sebastián
Estado: Sin conexión
Puntos: 14
Enlace directo a este mensaje 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
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: 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
Private Sub Nombre_DblClick(Cancel As Integer)
  DoCmd.OpenForm "Formulario2", , , "NumeroRegistro = " & Me!NumeroRegistro
End Sub

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

Xavi, un minyó de Terrassa

Mi web
Arriba
Jolkas40 Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 17/Junio/2019
Localización: San Sebastián
Estado: Sin conexión
Puntos: 14
Enlace directo a este mensaje 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
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable