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

Problemas con subformulario y consulta de list_box

 Responder Responder
Autor
Mensaje
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Problemas con subformulario y consulta de list_box
    Enviado: 03/Diciembre/2018 a las 11:03
Buenos días!!!
Lo primero, gracias aunque solo sea por leerme para tratar de ayudar.

Les pongo en situación:

Tengo un formulario con un subformulario en su interior. (emula un sistema de facturación, con lo cual el subformulario muestra las líneas de factura)

En el formulario principal tb he insertado un list_box.

Mi intención es que en dicho list_box se cargue cierta información en función del artículo que haya ingresado en la línea de facturación. Para ello, en Lin_articulo_enter hago lo siguiente:

sql = "Select ..... where tabla.articulo = " & me!Lin_articulo
Set rst = dbs.OpenRecordset(sql, dbOpenSnapshot)

If rst.RecordCount <> 0 Then
  Me.Parent!LST_info.RowSource = sql
End If


Es sencillo, en base al valor del campo LIN_articulo, el list_box se cargará con una información u otra.

El problema me viene que cada vez que salta el evento "Lin_articulo_enter" me situa el cursor en la primera línea del subformulario.

Había pensado almacenar la última posición del cursor y fijar el cursor a esa posición, pero me parece una chapuza y ni siquiera estoy seguro de que funcionara.

Insisto, gracias!!!!!

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 03/Diciembre/2018 a las 18:38
¿No tendrás algo más de código que se ejecute, ya sea en el subformulario, en el list box, o en ese lin_articulo?

Si no, también puedes usar la propiedad AbsolutePosition del Recordset del subformulario para saber en qué registro estás:

- https://docs.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/recordset-absoluteposition-property-dao
Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 08:22
Bueno, gracias por la respuesta. Te muestro todo el código:

Public Sub precios_anteriores(cliente As Integer, articulo As Integer)
    Dim sql As String
    Dim dbs As dao.Database
    Dim rst As dao.Recordset
    
    'Vaciamos el list_box
    [Forms]![F_documentos].LST_precios.RowSource = ""
    
    If Not (cliente = 0 Or articulo = 0) Then
        'Obtenemos la conexión.
        Set dbs = CurrentDb
        'Definimos la consulta que desamos
        sql = "SELECT T_Documentos.DOC_fecha, T_LINEAS.LIN_precio, T_LINEAS.LIN_calibre, " & _
               "T_PROVEEDORES.PRO_Apodo, T_Documentos.DOC_cliente, T_LINEAS.LIN_articulo " & _
               "FROM T_PROVEEDORES INNER JOIN (T_Documentos INNER JOIN T_LINEAS ON " & _
               "T_Documentos.DOC_id = T_LINEAS.LIN_documento) ON T_PROVEEDORES.PRO_ID " & _
               "= T_LINEAS.LIN_proveedor " & _
               "WHERE (((T_Documentos.DOC_cliente) = " & cliente & ") And" & _
               "((T_LINEAS.LIN_articulo) = " & articulo & "))" & _
               "ORDER BY T_Documentos.DOC_fecha DESC;"
        Set rst = dbs.OpenRecordset(sql, dbOpenSnapshot)
        'Rellenamos la list_box
        If rst.RecordCount <> 0 Then
               [Forms]![F_documentos].LST_precios.RowSource = sql
        End If
    End If
    'Me.Parent!LST_precios.Requery
End sub

Este es el código de mi función.
El problema me viene cuando asigno el origen a el list_box. Digamos que yo creo que access accede a este objeto para asignarle el valor que yo le asigno y al "volver" se sitúa en el subformulario en el primer registro.

Alguna idea para asignar el .RowSource del list_box??????????????

Gracias.

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 04/Diciembre/2018 a las 19:31
He hecho una pequeña prueba con un DCount, lista en formulario principal y código en subformulario. No me ha enviado el cursor al primer registro del subformulario:

Private Sub finAlquiler_AfterUpdate()
    Dim strFiltro As String
   
    strFiltro = "Format([tblAlquileres].[finAlquiler],""yyyymm"")=""" & Format(Me.finAlquiler, "yyyymm") & """"
   
    If Nz(DCount("*", "tblAlquileres", strFiltro), 0) > 0 Then
        Me.Parent.lista9.RowSource = "SELECT [tblAlquileres].[idCasa], [tblAlquileres].[iniAlquiler], [tblAlquileres].[finAlquiler] FROM [tblAlquileres]" & _
            "WHERE " & strFiltro
    Else
        Me.Parent.lista9.RowSource = ""
    End If
End Sub
Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Diciembre/2018 a las 10:49
He "reproducido" tu ejemplo y efectivamente funciona como a yo desearía... así que tengo que localiza qué he hecho mal....

Gracias por tu tiempo.

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 05/Diciembre/2018 a las 18:45
Revisa código en la lista, eventos que se puedan producir al cambiar el origen de la lista, …

También puedes colocar puntos de interrupción y ver la pila de llamadas para ver qué está ocurriendo.
Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Diciembre/2018 a las 10:16
Estas son las cosas que se me escapan....

Realicé tu ejemplo tal cual y efectivamente access responde como yo deseo....

Acudo a mi caso.... y no.

He puesto puntos de parada, he ejecutado paso a paso, he revisado los eventos de la lista (no tiene ni eventos ni código asociado) y nada, cuando ejecuto el rowsource (bien sea para asignarle datos, o para vaciarlo me sitúa el foco en la primera línea del subformulario. E insisto, lo he ejecutado paso a paso, comparado las propiedades de la lista una a una y nada....


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Diciembre/2018 a las 11:23
Una pregunta: tú usas un método público para cargar la lista: ¿cuándo y desde dónde lo llamas?
Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Diciembre/2018 a las 12:12
Una duda que me surge...

He ejecutado "paso a paso" (F8) mi procedimiento y lo único que veo, es que después de ejecutar la última línea  (.rowsource) me sitúa en la primera línea del subformulario.

He probado a insertar un debug.print de la variable del código del artículo y sorpresa la mía es que me imprime 3 veces esas variables. Digamos que si accedo a la tercera línea de mi subformulario me imprime una vez la variable del artículo y luego otras 2 veces la variable del artículo de la primera línea.

No tengo nada de código en el subformulario. Ya no sé que hacer!!!!


Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Diciembre/2018 a las 12:35
Publicado originalmente por pitxiku pitxiku escribió:

Una pregunta: tú usas un método público para cargar la lista: ¿cuándo y desde dónde lo llamas?

He hecho mil pruebas. En el campo "clave_producto" al recibir el foco he puesto el código para que me salte.

Al principio tenía un procedimiento público al que se llamaba desde el _got_focus del campo para que lo ejectura. Por miedo a tener problemas con los forms y esas cosas moví el código al _got_focus, pero ni por esas.


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Diciembre/2018 a las 13:11
Si quieres, puedes subir una copia de tu base de datos e indicar aquí un enlace de descarga, para echarle un vistazo.

Eso sí, recuerda eliminar/modificar los datos confidenciales, personales, ...
Arriba
waxpoo Ver desplegable
Nuevo
Nuevo


Unido: 07/Marzo/2018
Localización: Burgos
Estado: Sin conexión
Puntos: 20
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita waxpoo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Diciembre/2018 a las 07:42
http://www.frutaselvalenciano.es/download/programa.rar

Aquí dejo el enlace a la base datos.

El rar contiene 2 ficheros, son exactamente iguales, salvo que a uno de ellos he dejado comentado todo el código que creo que no tiene utilidad para este caso.

Gracias!!!!

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 759
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pitxiku Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 9 horas 45 minutos a las 17:15
He echado un vistazo y sí, el comportamiento es muy extraño. Pero si se recrea con una pareja formulario/subformulario nuevos, el comportamiento vuelve a ser el deseado. Aquí tienes lo que he hecho, es tu base de datos con un formulario nuevo, frmDocumentos, con su subformulario fsubDocumentos. 

- https://1drv.ms/u/s!AsYMk9OS3HACh0yGrDH_KXYCDy22

Más o menos son parecidos a lo tuyo, pero no se cambia el registro activo al entrar en el artículo.

Ahora mis consideraciones, consejos, o como quieras llamarlos:

- En opciones, base de datos actual, tienes marcada la casilla "Compactar al cerrar". Desmárcala y sé tú quien le diga a Access cuándo hay que compactar la base de datos. Con esta casilla activada, Access intenta compactar la base de datos cada vez que la cierra, lo que no es necesario y es muy peligroso. De hecho, es posible que el malfuncionamiento del formulario sea debido a esto de compactar siempre. Imagina que alguien cierra Access, Access empieza a compactar la base de datos y como ese alguien ve que tarda, cierra Access por las bravas. Resultado: base de datos dañada y pérdida del trabajo. Es mejor que te acostumbres a compactar cuando veas que la base de datos ha engordado mucho, o cuando parezca que se ralentiza. Y sobre todo, copias de seguridad: cada poco tiempo cuando estás diseñando y creando los objetos, y cada día/semana/x tiempo cuando estás introduciendo datos.

- En el formulario, sólo actualizas la lista de precios cuando entras en el cuadro combinado del artículo. También puede ser interesante que se actualice la lista de precios cuando modifiques el artículo, o cuando selecciones un registro sin necesidad de entrar exactamente en ese control.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable