Uso del Dlookup en access

Tengo un formulario basado en una tabla llamada T_datos, y un boton que al hacer click me tiene que buscar en la tabla T_Datos_Rev los campos: ncurso_r y ano_r, si ya existe me da un msj sino mensaje que se debe registrar.

El problema que siempre me dice que tengo que registrar nunca que ya esta registrada.

Espero puedan ayudarme y desde ya muchas gracias.

Private Sub REGISTRAR_Click()
Dim vncurso_r As String, vano_r As String

Dim vCompruebo As Variant
vncurso_r = Me.Texto19
vano_r = Nz(Me.ano_r.Value, "")
vCompruebo = DLookup("[ano_r]", "T_Datos_Rev", "ncurso_r=" & vncurso_r & "")
If vCompruebo = vncurso_r And vano_r Then
MsgBox "REVÁLIDA YA REGISTRADA", vbInformation, "AVISO"
Else
MsgBox "DEBE REGISTRAR LA REVÁLIDA", vbInformation, "AVISO"
End IfEnd Sub

Respuesta
1

El problema de tu código lo tienes en tu construcción del IF:

If vCompruebo = vncurso_r And vano_r Then

Si lo que quieres es comparar vCompruebo con la unión (encadenación) de vnCurso y vano_r, lo correcto es ponerlo así:

If vCompruebo = vncurso_r & vano_r Then

Si usas AND lo conviertes en un doble criterio a cumplir:

Que vCompruebo sea igual a vnCurso

y que vano_r sea igual a True

Y por eso siempre te dice que nunca está registrada, porque la doble condición no se cumple nunca (ni se cumplirá...)

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

Hola, gracias por tu pronta respuesta, probé pero no me funciono, me dice siempre que hay que registrarla.

Dim vncurso_r As String, vano_r As String
Dim vCompruebo As Variant
    vncurso_r = Me.Texto19
    vano_r = Me.ano_r
  vCompruebo = DLookup("[ano_r]", "T_Datos_Rev", "ncurso_r=" & vncurso_r & "")
    If vCompruebo = vncurso_r & vano_r Then
   MsgBox "REVÁLIDA YA REGISTRADA", vbInformation, "AVISO

Else
       MsgBox "DEBE REGISTRAR LA REVÁLIDA", vbInformation, "AVISO"

¿Y así:  If vCompruebo = (vncurso_r & vano_r) Then?

Prueba también:

Dim vncurso_r As String
Dim vano_r As String
Dim vCompruebo As Variant
Dim vCompruebo2 As String
vncurso_r = Me.Texto19
vano_r = Me.ano_r
vCompruebo = DLookup("[ano_r]", "T_Datos_Rev", "ncurso_r=" & vncurso_r & "")
vCompruebo2 = vncurso_r & vano_r
Msgbox "vCompruebo=" & vCompruebo & vbCrLf & vbCrLf & "vCompruebo2=" & vCompruebo2
If vCompruebo = vCompruebo2  Then
...

Si te sigue sin funcionar, comprueba que los valores que le estás asignando la las variables son los correctos, con MsgBox, o en la ventana inmediato. Por ejemplo:

Dim vncurso_r As String
Dim vano_r As String
Dim vCompruebo As Variant
Dim vCompruebo2 As String
vncurso_r = Me.Texto19
vano_r = Me.ano_r
vCompruebo = DLookup("[ano_r]", "T_Datos_Rev", "ncurso_r=" & vncurso_r & "")
vCompruebo2 = vncurso_r & vano_r
Msgbox "vCompruebo=" & vCompruebo & vbCrLf & vbCrLf & "vCompruebo2=" & vCompruebo2
If vCompruebo = vCompruebo2  Then
...

Te mostrará un mensaje con los dos valores que vas a comparar, ahora contenidos en las dos variables. Si los valores que ves en el mensaje son iguales, el problema va a estar en que una variable es de tipo Variant y la otra de Texto, y en caso de que ambas sean números, no es lo mismo comparar, por ejemplo 2 (como número) con "2" (como texto). Solución: declarar vCompruebo como Texto o transformarla a texto en el propio if o antes:

If Cstr(vCompruebo) = vCompruebo2  Then

Fíjate bien en los valores que tienes y toman las variables:

Texto19=3134 (es un número)

vncurso_r="3134" (es un texto)

ano_r=2018 (número)

vano_r="2018" (texto)

vCompruebo=2020 (número otra vez)

Y luego haces la comparación en el if:

¿es 2020="31342018"? Y es evidente que no son iguales, y por eso siempre te dice que tienes que registrar.

Cosas que veo "raras":

1º/ Que compares un año (el de vCompruebo) con un curso y año (vncurso_r & vano_r ), no tiene sentido, porque entiendo que es imposible que coincidan.

2º/ ¿El DLookup hace lo que realmente quieres, es decir, buscar el primer valor del campo [ano_r] de la tabla cuyo curso coincida con el del cuadro de texto Texto19?

Ten en cuenta que DLookup siempre te devuelve el valor del primer registro que encuentra en la tabla que coincida con el criterio. Igual necesitas otra función de dominio como DLast (que devuelve el último) o DMax (que devuelve el mayor valor)

3º/ Yo suelo usar para hacer este tipo de comprobaciones lo mismo que te indica Icue (y como ya te dió la solución, simplemente te expliqué el motivo del error de tu código), es decir la función DCount.

Ahora bien: ¿Quieres comprobar únicamente si tienes registros de ese año de Texto19, o bien quieres ver si hay registros de ese año y curso?

En el primer caso, tu código sería (siendo lo más breve):

Private Sub REGISTRAR_Click()
If DCount("*", "T_Datos_Rev", "ncurso_r=" & Me.Texto19)>0 Then
   MsgBox "REVÁLIDA YA REGISTRADA", vbInformation, "AVISO"
Else
   MsgBox "DEBE REGISTRAR LA REVÁLIDA", vbInformation, "AVISO"
End If
End Sub

y en el segundo:

Private Sub REGISTRAR_Click()
If DCount("*", "T_Datos_Rev", "ncurso_r=" & Me.Texto19 & " AND ano_r=" & Me.ano_r)>0 Then
MsgBox "REVÁLIDA YA REGISTRADA", vbInformation, "AVISO"
Else
MsgBox "DEBE REGISTRAR LA REVÁLIDA", vbInformation, "AVISO"
End If
End Sub

En ambos casos suponiendo que en la tabla tanto ncurso_r como ano_r los has definido como número.

Hola muchas gracias por tu respuesta, me anduvo a la perfección, necesitaba comprobar si hay registros de ese año y curso. No me había dado cuenta que estaba comparando un campo de texto con número. Gracias y abrazo.

Caso cerrado

No dejes de valorar la respuesta si te sirvió.

2 respuestas más de otros expertos

Respuesta
2

Usa la función Dcount

If dcount("*","t_datos_rev","n_curso_r=" & me.vncurso & "")>=1 then

msgbox"Ese registro ya existe",vbokonly,"¡ Es que no te enteras"

else

Msgbox"Ese registro no existe, deberás darlo de alta", vbokonly,"Otra vez será"

Docmd.openform...

end if

Estoy suponiendo que los datos que aparecen en el control vncurso, son numéricos.

Hola, gracias por tu pronta respuesta, probé pero no me funciono, me dice siempre que ya está registrada.

Dim vncurso_r As String, vano_r As String
Dim vCompruebo As Variant
        vncurso_r = Me.Texto19
        vano_r = Me.ano_r
        vCompruebo = DLookup("[ano_r]", "T_Datos_Rev", "ncurso_r=" & vncurso_r & "")
  If DCount("*", "t_datos_rev", "ncurso_r=" & Me.Texto19 & "") >= 1 Then
        MsgBox "REVÁLIDA YA REGISTRADA", vbInformation, "AVISO"
   Else
       MsgBox "DEBE REGISTRAR LA REVÁLIDA", vbInformation, "AVISO"

Vamos por partes, si vas a usar el valor de un cuadro de texto, ¿para qué definir una variable que va a ser igual? Supongamos que tengo una tabla Clientes

Tengo un formulario independiente en el que le pongo un cuadro de texto(aunque sería más cómodo un combinado) y un botón(que no sería necesario porque la instrucción se podría poner en el evento Después de actualizar del cuadro de texto Pais) Escribo Alemaniay pulso el botón

Si por el contrario escribo Ucrania

2º  Al pulsar Aceptar

El código es

En el DCount puedes poner hasta 99 condiciones And ó OR, por ejemplo

dcount("*","clientes","pais='" & me.pais & "' and Pelo=""rubio"" and nacido=""Berlin"" or nacido=""Colonia""")

Respuesta
1

En la variable vcompruebo ya se ve como tomo otro valor..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas