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

Tema cerradoProblema con DLookup

 Responder Responder
Autor
Mensaje
SolmarDiotozou Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 10/Octubre/2014
Localización: Perú
Estado: Sin conexión
Puntos: 47
Enlace directo a este mensaje Tema: Problema con DLookup
    Enviado: 18/Septiembre/2015 a las 07:34
Buenas noches a todos:

Tengo un problema que no logro encontrar solución, capaz porque he estado mucho tiempo trabajando y me he  bloqueado, no lo se. Tengo un formulario donde deseo validar 2 campos (nombres y apellidos) de forma tal que ni bien ambos campos estén con datos, comprobar si hay duplicados en la base de datos, es decir, si ya hay un registro para esa persona. Tengo el siguiente código:


Private Sub Texto4_LostFocus() 
    Texto118.Value = Texto4.Value & " " & Texto2.Value    'mostrar el nombre completo al inicio del formulario
    
    varNombres = Texto2.Value
    varApellidos = Texto4.Value
    If varNombres & "" <> "" And varApellidos & "" <> "" Then
        varDuplicado = DLookup("ID", "Pacientes", "nombres='" & varNombres & "' And apellidos='" & varApellidos & "'")
        MsgBox (varDuplicado)
    End If
End Sub


Puse un MsgBox simplemente para hacer un control, y se supone que debería mostrarme, si encontró siquiera un dato duplicado, el contenido del campo ID de ese registro, sin embargo me muestra el siguiente mensaje de error

Se ha producido el error '94' en tiempo de ejecución:

Uso no válido de Null

Y no encuentro la falla pues el dato ingresado corresponde a un dato ya ingresado en la base de datos, con total seguridad.


He probado esta otra variación

    

varRegistro = DLookup("id", "pacientes", "nombres LIKE '*" & Texto2.Value & "*' AND apellidos LIKE'*" & Texto4.Value & "*'")

    If IsNull(varRegistro) = True Then
        MsgBox ("No se encontró ningún registro que contenga la cadena " & Texto2.Value & " como parte del nombre del paciente.")
    Else
        MsgBox ("Ya esta resgistrado ese paciente")
    End If

Y es lo mismo, el DLookup no encuentra nada, como si no existiera los datos ingresados, sin embargo, si reemplazo "Texto2.Value" por el nombre y el otro Texto4 por el apellido y lo dejo así:

varRegistro = DLookup("id", "pacientes", "nombres LIKE '*Carlos*' AND apellidos LIKE'*Maldonado*'")

entonces si encuentra el registro. La verdad no se que pasa porque esta última variación la uso para una rutina simple de búsqueda y funciona a la perfección, pero en este caso, ni en broma funciona. Ojalá puedan ayudarme. 


¿Alguna sugerencia?

Muchas gracias por el apoyo que me brinden.

Un saludo desde Lima, Perú



Editado por SolmarDiotozou - 18/Septiembre/2015 a las 07:35
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 09:17
Se le esta intentando adjudicar un valor a un objeto que se desconoce (no se a definido) cual es su tipo, me refiero a la ¿variable?: varRegistro

Personalmente odio los nulos, asi que para ese tipo de funcionalidad utilizo con preferencia a DCount y en lugar de Like me decanto por InStr (pero para gustos: colores).

Dado que se utiliza para control a los mensajes emergentes, ¿Por qué no se le adjudica uno a cada una de las variables, para 'saber' en tiempo de diseño que valores toman? ... con eliminarlos tras finalizar con éxito esa funcionalidad, problema resuelto.
Arriba
OmniPresente Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Febrero/2009
Localización: España
Estado: Sin conexión
Puntos: 1858
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 09:25
¿Y si paras la aplicación en la sentencia del DlookUp y miras los valores de Texto2 y Texto4... tienen algo?

Saludos.
Arriba
RRoca Ver desplegable
Colaborador
Colaborador


Unido: 02/Enero/2006
Localización: España
Estado: Sin conexión
Puntos: 4817
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 09:33
Hola, para las variable donde el valor no sabes cual será es mejor dimensionarlas Dim VarRegistro as Variant, pero creo que esto ya te lo intuye F. Feijoo, un saludo.
Romain Rolland (1866-1944) escritor y ensayista frances dijo: Crear, es matar la muerte. (para mi, filosoficamente penetrante)
Arriba
SolmarDiotozou Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 10/Octubre/2014
Localización: Perú
Estado: Sin conexión
Puntos: 47
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 15:15
Muchas gracias a todos por responder. Daré más datos y me disculpo por no haberlo hecho antes. Estoy buscando crear una rutina que, en el modo ideal, ni bien estén ingresados los datos de los campos "apellidos" (Texto2) y "nombres" (Texto4), los busque en la base de datos para ver si ya están ingresados anteriormente.

Ya había utilizado antes un código similar para una simple rutina de búsqueda en la misma tabla, y resulta 100% operativa. Este es el código de esa rutina:

Private Sub Comando77_Click()   '***** BOTÓN DE BÚSQUEDA
On Error GoTo Err_Comando77_Click

    'Screen.PreviousControl.SetFocus
    'DoCmd.RunCommand acCmdFind
    
    varRegistro = DLookup("id", "pacientes", "nombres LIKE '*" & Texto110.Value & "*' OR apellidos LIKE'*" & Texto110.Value & "*'")
    If IsNull(varRegistro) = True Then
        MsgBox ("No se encontró ningún registro que contenga la cadena " & Texto110.Value & " como parte del nombre del paciente. Por favor intente otro dato para buscar.")
    Else
        varCuantos = DCount("id", "pacientes", "nombres LIKE '*" & Texto110.Value & "*' OR apellidos LIKE'*" & Texto110.Value & "*'")
        If varCuantos > 1 Then
            MsgBox ("Se han encontrado " & varCuantos & " registros que cuadran con el dato ingresado. A continuación se filtrará la base de datos para mostrar los registros encontrados.")
        Else
            'Me.RecordSource = "SELECT * FROM Pacientes WHERE Pacientes.Id=" & varRegistro
        End If
        
        Dim sFiltro As String
        sFiltro = "nombres LIKE '*" & Texto110.Value & "*' OR apellidos LIKE '*" & Texto110.Value & "*'"
        Me.Form.Filter = sFiltro
        Me.Form.FilterOn = True
        Me.Requery
        
        Texto118.Value = Texto2.Value & ", " & Texto4.Value
        
        registrosfiltro = varCuantos
        'Texto163.Value = varCuantos
        Texto165.Value = "Registro N° " & CurrentRecord & " de " & varCuantos
        
        'si sólo hay un registro deshabilitamos los botones de navegación
        If varCuantos = 1 Then
            Comando7.Enabled = False
            Comando8.Enabled = False
            Comando9.Enabled = False
            Comando10.Enabled = False
        'si hay más de un registro como resultado de la búsqueda
        Else
            Comando155.Visible = True       'botón de navegación alternativo cuando esta activo el filtro
            Comando9.Visible = False         'botón de navegación normal
        End If
        Comando157.Visible = True       'botón para restablecer filtro
        Etiqueta156.Visible = True        'mensaje de activación de filtro
    End If
    Texto110.Value = ""
    ParaPerderFoco.SetFocus

Exit_Comando77_Click:
    Exit Sub

Err_Comando77_Click:
    MsgBox Err.Description
    Resume Exit_Comando77_Click
    
End Sub


Sin embargo, aún cuando el código en negrita lo puse en un simple botón, sigue el mismo problema de no encontrar nada con la función DLookup


Private Sub Comando220_Click()
  
    varRegistro = DLookup("id", "pacientes", "nombres LIKE '*" & Texto2.Value & "*' AND apellidos LIKE'*" & Texto4.Value & "*'")
    
    If IsNull(varRegistro) = True Then
        MsgBox ("No se encontró ningún registro que contenga la cadena " & Texto2.Value & " como parte del nombre del paciente.")
    Else
        MsgBox ("Ya esta resgistrado ese paciente")
    End If
    
End Sub


Lo verdaderamente curioso es que si pongo estos MsgBox como prueba, si funciona el pasar los datos, me refiero a esto:


MsgBox ("nombres='" & varNombres & "' And apellidos='" & varApellidos & "'")


MsgBox ("nombres='" & Texto4.Value & "' And apellidos='" & Texto2.Value & "'")


en ambos casos, si me muestra los datos correctos, esto es, si "captura" los datos ingresados en los campos de texto, luego, DLookup debería de estar correctamente formado en la parte de criterio, pues el campo y tabla son los mismos que anteriormente he utilizado (en la rutina de búsqueda)

Sinceramente no tengo la más mínima idea de que puede estar fallando, pero temo que al final sea una cosa ridículamente simple que estoy pasando por alto

Ah por cierto, en la rutina de búsqueda no dimenciono las variables y sin embargo funciona bien. No obstante, dimensione la variable en la rutina del botón de prueba, y nada, el problema sigue siendo el mismo

Mil gracias por el apoyo
Arriba
SolmarDiotozou Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 10/Octubre/2014
Localización: Perú
Estado: Sin conexión
Puntos: 47
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 17:26
Tengo una GRAN VERGUENZA al escribir estas líneas, pero que sirva como ayuda a otros. ¿Saben por que no funcionaba (y no iba a funcionar jamás) ambos códigos, el inicial y el que tomé de mi rutina de búsqueda?. Bueno, sucede que el campo de texto asignado para el nombre es TEXTO4 NO TEXTO2 y claro, ¿que más podía pasar sino que no encontrara nada? En pocas palabras, buscaba el apellido en el campo nombre y el nombre en el campo apellido.

Si sólo están sonriendo al leer esto, gracias, y si alguno esta criticando ácidamente, mil disculpas por ello. Bueno, como dije, muchas horas frente a la máquina pasaron factura. Ahora que solucioné el problema con este mea culpa, me siento más tranquilo y sobre todo agradecido a todos los que se interesaron por mi problema.
Arriba
E. Feijoo Ver desplegable
Moderador
Moderador


Unido: 16/Abril/2004
Localización: España
Estado: Sin conexión
Puntos: 19948
Enlace directo a este mensaje Enviado: 18/Septiembre/2015 a las 23:18
Muchas veces se dan respuestas tontas:

Publicado originalmente por E. Feijoo E. Feijoo escribió:

.....
Dado que se utiliza para control a los mensajes emergentes, ¿Por qué no se le adjudica uno a cada una de las variables, para 'saber' en tiempo de diseño que valores toman? ...
Arriba
alexmubo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 15/Diciembre/2010
Localización: Colombia
Estado: Sin conexión
Puntos: 464
Enlace directo a este mensaje Enviado: 23/Septiembre/2015 a las 19:04
SolmarDiotozou, un profesor de mi universidad decía: "No hay preguntas tontas, sino tontos que no preguntan". Yo creo que a todos nos ha sucedido eso, pasamos horas y horas buscando el problema y la solución, y luego nos damos cuenta, que en realidad nunca hubo un problema, solo el mal planteamiento de una solución, o como en este caso, del código, pero eso nos ayuda a mejorar las cosas y adquirimos la experiencia para analizar ese punto, antes de comenzar con otras posibles causas del problema.
Dejar que todos den sus ideas es mas inteligente que pensar que uno se las sabe todas.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable