Función Dbúsq en access con varios criterios basado en una consulta

Tengo la necesidad de poner en un campo de un formulario la información de un campo que esta basado en una consulta, la consulta se llama C_Datos con los siguientes campos:

CIF - FacturaX - Fechas

Y necesito el campo llamado Fechas con dos condiciones ( los campos CIF y Facturas son texto)

Yo he puesto

Dim strPDF As String

If DCount("*", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'") > 0 Then
strPDF = DLookup("Fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'")

Me.X_Fecha = strPDF

Else

Msgbox "no existe registro"

End if

pero me da error y al depurar se marca la línea en amarillo(strPDF = DLookup("Fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'")strPDF = DLookup("Fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'")), por favor me podéis decir que estoy haciendo mal.

2 Respuestas

Respuesta
1

La línea que da error: deduzco que esta duplicada

La variable strPDF es de texto, el dato que se espera obtener de la función DLookup es una fecha (en formato Access, pero una fecha).

No veo la necesidad de esa variable que se podía declarar como Variant (o sin tipo para que por defecto asuma que es Variant) y así soportar cualquier tipo de dato (incluso un Null).

La cuestión es que si mediante la función DCount se deduce si el dato a localizar existe o no existe y el dato obtenido se utilizara para un cuadro de texto (que se presume es de tipo Fecha):

¿Por qué no se le asigna directamente y punto final?

IF DCount("*", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'") <> 0 Then

ME.X_Fecha = DLookup("Fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'")
Else
MsgBox "no existe registro"
End IF

Gracias Enrique por tu ayuda, pero me sigue dando error, el evento lo tengo puesto en un formulario continuo al activar el registro

Private Sub Form_Current()
If DCount("*", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'") > 0 Then
Me.X_Fecha = DLookup("fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) & "' and FACTURAx='" & Me.NumFactura & "'")
Else
MsgBox "no existe registro"
End If

End sub

Obtienes un error, pero no indicas cual ...

Una fecha (en VBA) solo se puede asignar a un objeto de tipo fecha, si se utiliza una Variant (es la variable mas cara en recursos porque se comporta como un Camaleón) la variable admitirá el dato y pudiera ser que se la traduzca como otro tipo de dato (posiblemente texto, por eso de ser 'camaleónica').

¿Qué tipo de dato (X_Fecha) es el original en la tabla C_Datos?, hay que partir de ese punto: conocer el tipo en el origen y también en el destino (el valor que se le pasa no es lo importante, con la excepción de que sea un NULL).

Un detalle a tener en cuenta:

Si el evento Current nos lleva a un nuevo registro (según se indica en la segunda respuesta), es normal que no funcione, un registro 'nuevo' se inicia con los campos sin valor asignado (a no se rque se le adjudiquen valores por defecto)

Asumiendo que el valor del combo lo pueda obtener, el valor en 'Me. NumFactura' deberá ser un NULL y eso es un conflicto sin solución.

Solo se puede ejecutar ese código cuando se pueda garantizar que los datos referentes ( 'Me. PROVEED' y 'Me. NumFactura' ) tengan un valor correcto.

Respuesta
1

Le propongo este código

 Dim strFecha As Variant
 strFecha = Nz(DLookup("Fechas", "C_Datos", "CIF='" & Me.PROVEED.Column(0) And "FACTURAx='" & Me.NumFactura & "'")) = 0
If strFecha = 0 Then
  MsgBox "no existe registro"
Else
 Me.X_Fecha = strFecha
End If

Gracia por tu respuesta Eduardo, pero me sigue dando error

Esta mal antes del AND falta &

Parece que estoy equivocado si puede envíeme su base de datos a [email protected] favor en el asunto anotar la consulta.

¡Gracias! ¡Gracias! Solucionado, perdón el error era que el campo Fechas era Fecha sin S

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas