** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - buscador en subformulario
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradobuscador en subformulario

 Responder Responder
Autor
Mensaje
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Tema: buscador en subformulario
    Enviado: 24/Febrero/2020 a las 11:04
Buenos días, a ver si me podéis ayudar con esto.

Tengo un formulario padre y un subformulario asociado (el campo clave es el número de pedido).

He creado un campo de búsqueda en el formulario padre para buscar palabras (más concretamente en el campo "PRODUCTO") en los registros del subformulario hijo.

Me gustaría que este campo de búsqueda me llevara a los registros que contengan la palabra que busco, no sólo al primero, si no que pulsando el botón de búsqueda me lleve del 1º registro que contiene la palabra, al 2º, al 3º, así sucesivamente pulsando el botón de búsqueda hasta el último que contenga la palabra.

En internet he encontrado este código que indico a continuación, pero no sé si conseguiría lo que busco, ni cómo implementarlo, supongo que tendría que asociado al evento "al hacer click" en el botón asociado al campo de búsqueda. Al hacerlo como indico, el error que me aparece un error de variable no definida y al ejecutar el depurador de código, me resalta "PRODUCTO"

Dim MiReg As Object
Set MiReg = SubRegistros.Form.RecordsetClone
MiReg.FindFirst "PRODUCTO=" & PRODUCTO & ""
If Not MiReg.NoMatch Then
SubRegistros.SetFocus
SubRegistros.Form.Bookmark = MiReg.Bookmark
End If

Un saludo y gracias de antemano
Arriba
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 24/Febrero/2020 a las 12:20
Como aclaración adicional importante, cada registro del formulario padre corresponde a un pedido con sus características (por ejemplo, pedido nº1 de cliente A) y el subformulario hijo mostraría los productos asociados a ese pedido con sus respectivas cantidades. El siguiiente registro del formulario padre mostraría el pedido nº2 con sus respectivos productos y cantidades, y así sucesivamente.

Lo que intento es que con el campo de búsqueda (que he localizado en el encabezado del formulario padre) pueda localizar los productos de los distintos pedidos de la base de datos y el cursor se posicione dentro del campo "producto" del subformulario, concretamente en el registro que contenga la palabra que he buscado y, además, se mueva al registro de formulario padre del pedido que contenga el producto.


Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 24/Febrero/2020 a las 14:22
Hola!

Creo que es problema de comillas:-

Dim MiReg As Object
Set MiReg = SubRegistros.Form.RecordsetClone
MiReg.FindFirst "PRODUCTO='" & PRODUCTO & "'"
If Not MiReg.NoMatch Then
SubRegistros.SetFocus
SubRegistros.Form.Bookmark = MiReg.Bookmark
End If

Tamien puedes utilizar el operador "Like", Sería:-

Dim MiReg As Object
Set MiReg = SubRegistros.Form.RecordsetClone
MiReg.FindFirst "PRODUCTO Like '*" & PRODUCTO & "'*"
If Not MiReg.NoMatch Then
SubRegistros.SetFocus
SubRegistros.Form.Bookmark = MiReg.Bookmark
End If

Un Saludo.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 25/Febrero/2020 a las 09:03

Buenos días a todos.

Con todos mis respetos hacia lo que encontramos por internet (que he usado multitud veces yo mismo y que me ha valido), creo que lo que hay que hacer es entender el funcionamiento de los formularios/subformularios.

Punto 1: Las relaciones (lo habitual es de uno a varios, padre/hijos)

Habitualmente el padre (formulario) está relacionado con el hijo (subformulario), de tal forma que cuando cambio el origen del padre, me salen todos los hijos relacionados. Como sabemos el formulario tan solo presentará un solo registro cada vez (en este caso con la clave producto) y saldrán todos los registros en el subformulario –que haya relacionados- (no otros).

Vale, si está así montado, que es lo lógico y habitual, pasamos al:

Punto 2: Para entender el razonamiento

Creemos un cuadro combinado en el formulario para que nos busque un registro en el formulario, deberá buscarse el nombre del producto.

‘Como este por ejemplo:

Private Sub Cuadro_combinado12_AfterUpdate()

    ' Buscar el registro que coincida con el control.

    Dim rs As Object

    Set rs = Me.Recordset.Clone

    rs.FindFirst "[PRODUCTO] = '" & Me![Cuadro combinado12] & "'"

    If Not rs.EOF Then Me.Bookmark = rs.Bookmark

End Sub

Siempre lo va a encontrar (… si existe claro…) y lo que hará ese cuadro combinado es directamente colocar en el formulario el registro correspondiente.

Punto 3: Código escrito por el programador.

Ninguno, todo se resuelve con, primero, el asistente para confeccionar el formulario/subformulario y , segundo, el cuadro combinado confeccionado de nuevo con el asistente.

Punto 4: Pero queremos pasar por todos los registros que lleven “la palabra que busco”, tal vez buscamos tornillos y hay: tornillos del 7, tornillos de tuerca, tornillo de rosca, destornilladores, etc…. Y tan solo hemos escrito torni.

Evidentemente, no se podrá cumplir ese apartado con el asistente  del cuadro combinado que hemos confeccionado, ya que tan solo nos presentará un registro (habrá ido a ese registro concreto que coincide con la búsqueda), el que tenemos en pantalla, tampoco habrá modificado el resto de registros, ya que podrás ir avanzando al siguiente o al anterior (en caso de existir varios).

Punto 5: Volvemos ahora al cuadro combinado y ponemos esta modificación

Private Sub Cuadro_combinado12_AfterUpdate()

    ' Buscar el registro que coincida con el control.

    Dim rs As Object

    Set rs = Me.Recordset.Clone

    rs.FindFirst "[PRODUCTO] Like '*" & Me![Cuadro combinado12] & "*'"

    If Not rs.EOF Then Me.Bookmark = rs.Bookmark

End Sub

Ahora ya va directamente al primer registro que coincida con “cualquier trozo o palabra que hayas buscado. Pero tan solo habrá ido a ese registro, los otros (anteriores/posteriores) seguirán existiendo.

Bueno, ya que sabemos hacer esto, sabremos hacer también….

Punto 6: El filtro para que tengamos tan solo los registros que nos interesa ver

Private Sub Cuadro_combinado12_AfterUpdate()

    ' Buscar y dejar tan solo los registros que contengan dentro del nombre producto, la palabra escrita en el control.

    Me.Filter = "[PRODUCTO] Like '*" & Me![Cuadro combinado12] & "*'"

    Me.FilterOn = True

End Sub

Creo que está suficientemente explicado, y con esto sabremos construir más cosas, es decir, no tan solo acceder a internet, “buscar/copiar/pegar/preguntar si no anda”. Es decir, igual que empezamos todos, poco a poco.

El asistente nos asiste y enseña muchísimas cosas.

Saludos.


P.D.: Veo que me falta como poder trasladarme de un registro a otro (ya que ha filtrado todos los que quiero). Fácil, bajo, si están los botones de los registros, puedo ir pasando de uno a otro. O también puedo crear mis propios botones en el formulario (siguiente/anterior).



Editado por VIMIPAS - 25/Febrero/2020 a las 09:08
Gracias
Arriba
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 25/Febrero/2020 a las 12:31
Buenos días,

Muchas gracias por las aclaraciones a ambos,

Con respecto a lo que indicaba Mounir

Corrijo las comillas e introduzco el LIKE asi (pongo mis comentarios para intentar comprender el código):

Sub encontrar_rtro_Click()
Dim MiReg As Object
'Defino variabe MiReg como objeto
Set MiReg = PEDIDOSPRODUCTOS.Form.RecordsetClone
'Establezco mi variable dicendo lo que es (un clonado del conjunto de registros del subformulario)
MiReg.FindFirst "PRODUCTOS Like '*" & PRODUCTO & "'*"
'Establezco una acción encontrar primera palabra con producto
If Not MiReg.NoMatch Then
'Si la encuentro entonces
PEDIDOSPRODUCTOS.SetFocus
'Foco en pedidosproductos formulario
PEDIDOSPRODUCTOS.Form.Bookmark = MiReg.Bookmark
'marcador en el formulario pedidos proeductos igual a mireg marcador
End If
End Sub

Pero obtengo el siguiente error:

-Run time error 3707
Syntax error (missing operator) in expression en línea MiReg.Findfirst...

Entiendo que en la línea del like "PRODUCTOS" like corresponde al campo del subformulario (o recordset) donde quiero buscar y la parte '*" & PRODUCTO & "'*" corresponde al campo de búsqueda llamado PRODUCTO. No sé si al poner directamente "PRODUCTOS" sin poner Me!nombreobjetosubformulario... podría dar problemas.

Probando lo que indica Vimipas. Empiezo paso a paso, e indico qué ocurre en el punto 2

Sustituyo el código por:

Private Sub Cuadro_combinado12_Click()
 'Abro procedimiento
    Dim rs As Object
'Defino la variable rs como objeto
    Set rs = Me.Recordset.Clone
'Asigno a la variable una función, clonar el conjunto de registros y darle entidad
    rs.FindFirst "PRODUCTOS = '" & Me![Cuadro_combinado12] & "'"
'Le digo al conjunto de registros que en el campo PRODUCTOS, encuentre el valor que selecciono en el cuadro combinado12
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
'Si encuentra registros coincidentes con el valor que selecciono del cuadro combinado, asigno un marcador para que vaya a él
End Sub

Aquí obtengo el siguiente error:

Runtime error 3070, de microsoft database engine does not recognize 'PRODUCTOS'  as a valid field or expression

También lo he sustituido por lo que indico abajo en azul, por si no estuviera bien referenciado el campo en el criterio, pero sigo obteniendo el mismo error.

rs.FindFirst "Me!PEDIDOSPRODUCTOS.FORM!PRODUCTOS = '" & Me![Cuadro_combinado12] & "'"
Lo referencio como Me! (formulario padre), pedidos productos(nombre objeto subformulario hijo y le digo que es un formulario, y "productos" como control del objeto".


Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 1258
Enlace directo a este mensaje Enviado: 25/Febrero/2020 a las 20:59
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 25/Febrero/2020 a las 22:38
Buenas noches.

Esto pones tu:

rs.FindFirst "PRODUCTOS = '" & Me![Cuadro_combinado12] & "'"

Mira lo que puse yo (basándome en tu primer mensaje):

rs.FindFirst "[PRODUCTO] Like '*" & Me![Cuadro combinado12] & "*'"

Al tuyo: 
1.- le sobra una S en PRODUCTO.
2- le faltan los dos asteriscos.
3.- El tuyo tiene un guión bajo entre cuadro y combinado12, el mio no.

Mas que nada para copiarlo literalmente tal cual lo deja el sistema al hacerlo.

¿Puedes repasar también si tu tienes un cuadro combinado 12?. 
¿Tal vez hayas copiado literalmente mi ejemplo sin crear ese cuadro?.

Ten paciencia, tan solo poco a poco avanzamos todos.

Saludos.

Gracias
Arriba
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 26/Febrero/2020 a las 02:44
Gracias de nuevo por las aclaraciones (cuando estás empezando en esto, el darte cuenta que no estás solo ayuda y anima mucho), aunque sigo sin dar con el problelma.

Main, muy útil el enlace, sé que me costará entenderl porque aún no estoy familiarizado con el código. Tembién me parece muy interesante el enlace a la página donde destripa el botón buscar por defecto de access.

Vimipas, sí, el código que he utilizado es un poco distinto a al que me indicas, pero en el subformulario hijo que estoy utilizando (que se llama "PEDIDOSPRODUCTOS"), el campo donde aparecen los productos lo he llamado "PRODUCTOS" de ahí la diferencia. He sustituído las comas por los asteriscos y añadido el like al código, sustituyendo el signo igual, el combobox lo tengo como "Cuadro_combinado12".

Creo que he comprendido la línea de código y lo que hace es buscar en el campo del subformulario, concretamente en el campo "PRODUCTOS" lo que contenga el combobox [Cuadro_combinado12] haciendo una búsqueda por aproximación.

Cuando incluyo la línea de código en el procedimiento

rs.FindFirst "[PRODUCTOS] Like '*" & Me![Cuadro_combinado12] & "*'"
 
y selecciono un producto en el combobox, obtengo el siguiente error:

"Run-time error '3070: The microsoft access database engine does not recognize 'PRODUCTOS" as a valid field name of expresion" y me marca justamente la línea que indicaba arriba.

Tengo la sensación de que como en esta línea de código que marco en azul, tras el rs.Findfirst cito directamente [PRODUCTOS] y este campo no está directamente en el formulario principal donde tengo el combobox, sino dentro de un objeto del mismo (concretamente en el subformulario hijo), quizás el editor se pierda y no lo encuentre y por eso me aparece el error en el que indica que no encuentra el campo. Me pregunto si no tendré que especificar que está dentro del formulario padre, dentro de un objeto del mismo, con una línea de código similar a ésta:

rs.FindFirst "Me!PEDIDOSPRODUCTOS.FORM!PRODUCTOS like '*" & Me![Cuadro_combinado12] & "*'"

De todos modos, he probado también con esta línea y tampoco me funciona, obtengo igualmente el error 3070.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 26/Febrero/2020 a las 20:35
Hola de nuevo.

Yo diseñe el cuadro_combinado12 con el asistente, para ponerlo en el formulario. Así lo diseñé y así lo hice constar arriba.

Todo esto por lo que tu indicas al principio, QUE ES UN FORMULARIO DONDE TIENES EL BUSCADOR.

Si es así: ¿Sí? / ¿No?

Contesta y luego seguimos.

Saludos.
Gracias
Arriba
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 27/Febrero/2020 a las 11:35
Buenos días,

Sí, he colocado el buscador+combobox arriba a la derecha, en el encabezado del formulario padre. Allí tengo todos los controles. El subformulario hijo está abajo.

Lo que querría hacer con el buscador/combobox (no sé cuál será mejor alternativa) es que al introducir el nombre de un producto, haga una búsqueda en el subformulario hijo, posicionando el cursor en el registro de la columna "productos" que contenga la palabra que hay en el buscador. Al pulsar de nuevo el botón de búsqueda, debería ir al siguiente pedido (que salte del pedido nº1 al nº3) con ese producto, etc (sería como un buscar siguiente). Hasta ahora sólo he conseguido que busque  el producto en el pedido que estoy visualizando en ese momento, pero no en otros pedidos anteriores o posteriores (cada pedido es un registro en el formulario padre con registros asociados en el subformulario hijo).

Adjunto enlace a una imagen, para que se vea cómo es el diseño.

https://www.dropbox.com/s/5l0v0n14bgv7cyt/ejemplo_formulario.png?dl=0




Editado por Yavuka - 27/Febrero/2020 a las 12:02
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6479
Enlace directo a este mensaje Enviado: 27/Febrero/2020 a las 13:09
Hola!

Para eso hay un truco, crear en en el formulario una etiqueta le llamo "lbl1", dentro escribes 1. Luego antes del código que filtre escribes:-

If Me.lbl1.Caption < 2 Then
' escribes el código que filtre.....
Me.lbl1.Caption = Me.lbl1.Caption + 1
'Situas el foco en el campo del subformulario
' aplicas DoCmd
DoCmd.GoToRecord , , acNext
End If


Creo que así funcionaría.

Un Saludo.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 27/Febrero/2020 a las 22:10
Que tal, buenas noches.

Vale, en base a lo que ahora indicas, veo que yo interpreté mal tu primer mensaje.

Siguiente pregunta (por si no aciertas con lo de mounir):

¿Que relación -entre que campos- hay entre el formulario y el subformulario?. (Es que en la imagen, no consigo ver ningún id, o algo que se parezca, en el subformulario).

Te espero.

Saludos.
Gracias
Arriba
Yavuka Ver desplegable
Nuevo
Nuevo


Unido: 17/Octubre/2019
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 27/Febrero/2020 a las 23:59
Buenas noches, gracias por las respuestas.

Voy a probar lo que sugiere Mounir y os cuento.

De todos modos adelanto que formulario padre y subformulario hijo están relacionados ambos por un campo clave del formulario padre ("pedidos") llamado "Idpedidos" y un campo (no clave) en el subformulario hijo ("pedidos productos") llamado "pedidos". Ambos campos son numéricos (IDpedidos, autonumérico) y tienen una relación de 1 a varios.
Arriba
VIMIPAS Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 06/Enero/2006
Localización: ESPAÑA
Estado: Sin conexión
Puntos: 5462
Enlace directo a este mensaje Enviado: 28/Febrero/2020 a las 20:14
Hola otra vez.

Me lo temía por enésima vez.

Tu mismo lo acabas de decir: de 1 a varios.

Es decir, lo que haya en 1 indica, por relación, por obligación, por sistema Access, que es lo que debe haber en varios.

Tan solo podrás ver en el subformuarlio(hijo) lo que diga el formulario(padre). Que para eso has echo la relación.

Tu pretendes lo contrario.... lo siento no se hacerlo dentro de lo que tienes montado padre/hijo.

El sistema explicado por mí, sí puedes aplicarlo, olvidándote de vincular con la relación del padre con el hijo. Tan sencillo como quitar la relación en la VincularCamposPrincipales con VincularCamposSecundarios.

Saludos.

Gracias
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable