Imprimir página | Cerrar ventana

Evento notinlist da dos respuestas diferentes

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84649
Fecha de impresión: 28/Marzo/2024 a las 14:55


Tema: Evento notinlist da dos respuestas diferentes
Publicado por: Valenciajar
Asunto: Evento notinlist da dos respuestas diferentes
Fecha de publicación: 17/Agosto/2019 a las 15:50
Hola. Tengo una consulta. En un formulario tengo un cuadro combinado con evento notinlist programado.
Si entro en el cuadro combinado y en la primera acción introduzco un elemento que no está en la lista, me responde conforme a lo programado.
Si por el contrario, consulto algún elemento que sí está en la lista y luego regreso al cuadro combinado e introduzco un elemento que no esté, Access me responde en este caso con la respuesta estándar (su elemento no está en la lista, introduzca un elemento de la lista...) en vez de conforme al código que yo he programado.
Uso un único formulario para todo (selección y edición), cuyos datos tienen origen en una tabla.
El código es el siguiente:
Private Sub SeleccionarDesignación_BeforeUpdate(Cancel As Integer)
    If IsNull([SeleccionarDesignación]) Then
        MsgBox "Debe seleccionar una designación."
        Cancel = True
    End If
End Sub
Private Sub SeleccionarDesignación_AfterUpdate()
    '  Buscar el registro de la designaci?n seleccionada en el cuadro combinado SeleccionarDesignación.
    '  Activar los controles de la sección Detalle.
    '  Ir al cuadro APELLIDO1.
    DoCmd.ApplyFilter , "NUMEROA = Forms!Designaciones!SeleccionarDesignación"
    OcultarControles Me, acDetail, True
    Me.SeleccionarDesignación.Undo
    Me!APELLIDO1.SetFocus
    Me.NUMEROA.Visible = False
    Me.NUMEROL.Visible = False
    Me.ACTIVADO.Visible = False
    Me.PERSONADO.Visible = False
    Me.F_PERSONADO.Visible = False
    Me.DatosLetrado.Enabled = True
    If Me.ACTIVADO = True Then
       Me.GenerarFicha.Enabled = False
       Me.AbrirFicha.Enabled = True
    End If
    If Me.PERSONADO = True Then
       Me.Personación.Enabled = False
    End If
    Me!APELLIDO1.SetFocus
   
End Sub
Private Sub SeleccionarDesignación_NotInList(DatosNuevos As String, Respuesta As Integer)
' Permitir al usuario agregar una designación nueva, escribiendo el nombre del cliente
' en el cuadro combinado SeleccionarDesignación.
    Dim miDb As Database, miTabla As Recordset
    Dim entDesignaNuevo As Integer, cadTítulo As String
    Dim entMensajeDiálogo As Integer, cadMensaje As String
    Const conColorBlanco = 16777215
    Const conNormal = 1
   
    ' Comprobar que el usuario ya ha seleccionado una desinación.
    If IsNull(SeleccionarDesignación) Then
        ' Mostrar un cuadro de mensaje preguntando al usuario si desea agregar una designación nueva.
        cadT?tulo = "La designación no está en la lista"
        cadMensaje = "?Desea agregar una designación nueva?"
        entMensajeDi?logo = vbYesNo + vbExclamation
        entDesignaNuevo = MsgBox(cadMensaje, entMensajeDiálogo, cadTítulo)
        If entDesignaNuevo = vbYes Then
            ' Si el usuario desea dar de alta una designación quitar el texto que introdujo el usuario
            ' en el cuadro combinado y asignarlo al control Apellido1.
            ' Continuar sin mostrar el mensaje de error predeterminado
            Me!SeleccionarDesignación.Undo
            APELLIDO1.Enabled = True
            APELLIDO1 = DatosNuevos
           
            ' Generar el número de Asunto (Designación) desde el Contador y asignarlo
            Set miDb = CurrentDb
            Set miTabla = miDb.OpenRecordset("CONTADOR", dbOpenDynaset)
            miTabla.Edit
            miTabla!NUMEROA = miTabla!NUMEROA + 1
            miTabla.Update
            Me!NUMEROA = miTabla!NUMEROA
            miTabla.Close
           
            ' Generar un registro en la tabla CLIENTE para recoger los datos de dirección y teléfono
            Set miTabla = miDb.OpenRecordset("CLIENTE", dbOpenDynaset)
            miTabla.AddNew
            miTabla!NUMEROA = Me!NUMEROA
            miTabla.Update
            miTabla.Close
           
            ' Activar controles para la edición
            OcultarControles Me, acDetail, True
            Me.APELLIDO1.SetFocus
            Me.NUMEROA.Visible = False
            Me.NUMEROL.Visible = False
            Me.ACTIVADO.Visible = False
            Me.PERSONADO.Visible = False
            Me.F_PERSONADO.Visible = False
            Me.DatosLetrado.Enabled = True
            Me.GenerarFicha.Enabled = True
            Me.Personación.Enabled = True
            Me.SeleccionarDesignaciónEtiqueta_.Visible = False
            Me.SeleccionarDesignación.Visible = False
            Respuesta = acDataErrAdded
            MsgBox "Introduzca los datos de la nueva designación"
        Else
            ' En caso contrario continuar sin mostrar el error predeterminado
            Me!SeleccionarDesignación.Undo
            Respuesta = acDataErrContinue
        End If
    End If
End Sub

Gracias por cualquier opinión. Un saludo



Respuestas:
Publicado por: mounir
Fecha de publicación: 17/Agosto/2019 a las 19:53
Hola!

En su día contesté a un usuario con algo muy parecido.

Te dejo el enlace:

https://1drv.ms/u/s!AuMSWvAoJzBwiEjUxZwr7Trjuxm7?e=NNZ66j" rel="nofollow - https://1drv.ms/u/s!AuMSWvAoJzBwiEjUxZwr7Trjuxm7?e=NNZ66j

El formulario se llama "Muestras"

Espero que te sirva.

-------------
Un Saludo.


Publicado por: Valenciajar
Fecha de publicación: 18/Agosto/2019 a las 23:05
Gracias mounir.

He intentado replicar tu código pero no me ha funcionado. Seguramente algo he escrito mal. Lo volveré a intentar.
No obstante me gustaría que me comentaras de mi código, dónde ves que puede surgir el problema.
Básicamente lo que me pasa es que si consulto directamente un registro que NO está en la lista, el programa actúa con mi evento NotInList sin problema.
Pero si previamente consulto otro registro que sí está y a continuación uno que no está, el programa responde con la respuesta estándar de Access para el evento NotInList y ya no hace caso a mi código.
No sé si depende del refresco del formulario o de la consulta o al uso de filtros en vez de marcadores...

Agradeceré tu opinión.


Publicado por: mounir
Fecha de publicación: 18/Agosto/2019 a las 23:26
Hola!

La verdad no encuentro el motivo en tu código.

Yo lo que haría es lo siguiente:

Primero aseguro que funcione correctamente el evento "Al no estar en la lista".
Segundo añado el evento "Antes de actualizar". Cuando funcionan los dos correctamente añado el evento "Después de Actualizar"

-------------
Un Saludo.


Publicado por: Valenciajar
Fecha de publicación: 19/Agosto/2019 a las 00:09
Gracias de nuevo.
Voy a probar lo que me propones y te cuento.


Publicado por: Valenciajar
Fecha de publicación: 29/Agosto/2019 a las 14:55
Hola Mounir, no he dado señales de vida, porgue estoy peleando con la "gracieta" de Microsoft y su actualización de Windows que ha dejado secas la mayoría de mis líneas de código.
No consigo una solución y Microsoft sólo me ha recomendado paciencia y esperar.


Publicado por: mounir
Fecha de publicación: 29/Agosto/2019 a las 16:56
Hola!

Cuelga una copia de tu base de datos sin registros sensibles para echarla una vistazo.

-------------
Un Saludo.


Publicado por: Valenciajar
Fecha de publicación: 29/Agosto/2019 a las 21:56
Hola Mounir
https://1drv.ms/u/s!AsD_WfNmDyJqhxRDrhu5-LpeGwCn?e=Ptor8P
Aquí la encuentras.
Ahora tengo dos problemas. El planteado del evento y que el VBA ha dejado de funcionar en determinadas compilaciones de Windows 10 desde la última actualización. Curiosamente unas funciones parecen funcionar y otras simplemente no reaccionan. Pero lo dicho, esto último según Microsoft se resolverá con una nueva actualización.

Gracias



Publicado por: mounir
Fecha de publicación: 30/Agosto/2019 a las 00:59
Hola!

Simplemente quita estas dos líneas

If IsNull(SeleccionarDesignación) Then

End If


-------------
Un Saludo.


Publicado por: Valenciajar
Fecha de publicación: 30/Agosto/2019 a las 12:28
Hola Mounir. He probado tu propuesta.
Sin embargo no me ha funcionado.
Observa:
Opción 1: Busco directamente un registro que no está en la BD. Me responde correctamente con la respuesta NotinList programada:



En cambio,
Opción 2: Busco registros que sí están en la BD. A continuación, sin cerrar el formulario, busco un registro que NO está en la BD. La respuesta pasa a ser:



Además, una vez entro en este bucle y si no selecciono un elemento de la lista, no me deja cerrar o, en todo caso me salta este otro error:



Gracias.


Publicado por: mounir
Fecha de publicación: 30/Agosto/2019 a las 18:52
Hola!

la solución es como te comenté antes:

>>>> Formulario Designación

Deberías controlar la introducción de datos con Add.New en vez de actualizar ya que lo que hace es actualizar y no añadir Nombres.

-------------
Un Saludo.


Publicado por: Valenciajar
Fecha de publicación: 17/Septiembre/2019 a las 14:08
Gracias Mounir.
Efectivamente la solución estaba en retirar el if.
Al final tuve que reescribir esa parte del código para que generara correctamente y permitiera editar de inmediato los nuevos registros con addnew.
Muchas gracias por tu soporte.
Podemos cerrar el hilo.



Imprimir página | Cerrar ventana