La función If no realiza la condición

Tengo una base y necesito que se envié una alerta cuando un campo esta vacío, y si esta vacío entonces su cuenten los días entre un campo fecha y la fecha del sistema y si es mayor a la condición entonces se genera la alerta, pero no logro que funcione, el código es el siguiente:

If IsNull("[Recibido de cp]") = True Then      '(donde Recibido de cp es un campo de la tabla procesos)

If DCount("*", "procesos", "[Enviado a cp]=date()+[Enviado a cp]") >= 5 Then   
MsgBox "Tienes expedientes con mucho tiempo en CP", vbOKOnly, "Revisalo"
' End If
End If

1 respuesta

Respuesta
3

Si en el Isnull le pasas un valor entre comillas, le estás pasando una cadena de texto, y por, no es un nulo y la condición no se cumple.

Si quieres validar un campo, ponlo así:

If IsNull([Recibido de cp])  Then

Tampoco te hace falta poner el =True

Hoooo, muchas gracias, y sobre la segunda condición que me puedes decir??

Pues que la condición nunca se cumplirá, porque el valor del campo nunca será igual a la fecha actual más el valor del campo...

Tendrás que plantear mejor el criterio del DCount()

Por ejemplo, si quieres avisar de que hay expedientes que se enviaron hace más de 15 días, podrías hacer:

If  DCount("*", "procesos", "[Enviado a cp]<" & Date-15) >0 Then   

¡Gracias!, tienes razón!, gracias por tu ayuda!

Mas molestia, me marco error 2645 en el IsNull, crees que sea por que no le menciono la tabla?, y si es así como es la sintaxis pues ya lo puse con corchetes y punto y comillas y me marca error, por cierto lo estoy haciendo en la cargada de un formulario!!

Ya suponía que lo hacías en un formulario. Comprueba que el control se llama efectivamente así. Y si lo tienes bien, dime cual es la descripción del error, porque de memoria no los sé todos...

No tienes que indicar tabla alguna, ni ponerle comillas ni nada extraño, la sintaxis es correcta, siempre que ese sea al nombre del control en el formulario.

Gracias, dice que no encuentra el campo 'I' al que hace referencia la expresión, y al depurar marca el renglón If IsNull([Recibido de cp]) Then

Pues si te dice que no encuentra el campo, es que tu control no se llama así. Mira las propiedades del cuadro de texto, pestaña otras, nombre, y ese es el que tienes que usar. Si lleva espacios en blanco, ponlo entre corchetes.

Y aunque este no es el problema, también puedes ponerlo así :

If IsNull(Me.[nombre del control]) Then

¡Gracias! , el campo es tipo fecha, supongo que debe ser el problema, creare un campo si/no y lo pondré en la condición espero sea la solución

Que el campo sea fecha, texto o numérico no es el problema para que te de el error 2645. Ese error es que no encuentra lo que estás llamando "Recibido de cp" en el formulario donde ejecutas el código, y la explicación para eso es que no hay nada que se llame así.

Aquí tienes un ejemplo para que veas que la sintaxis funciona perfectamente con cualquier tipo de campo y cómo si pones un nombre que no existe, te da el error 2656:

 http://www.filebig.net/files/kxiEuhUN23 

¡Gracias!, si funciona, seguiré buscando el origen del problema.

Si me haces llegar una copia de tu Bd, sin datos o con alguno inventado, solo con el formulario en cuestión y las tablas/ consultas necesarias para que funcione, no tengo inconveniente en echarle un ojo a ver si lo encuentro.

Claro que si, hay va, Gracias, es en proceso de compra!!

https://drive.google.com/open?id=1gYsm3PWwCs7Z82RUXJDL_l6cFFEAZi4T 

A ver... ¿Por que tienes en el código esto: If IsNull(Me.[control]) Then? Como no tienes ningún control (cuadro de texto o de otro tipo) que se llame "control", por eso te da error.

¿Cuál es el cuadro de texto (el control) del formulario "Para proceso" que quieres verificar si es o no nulo?. Ese es precisamente el nombre que has de poner dentro del IsNull, y ha de ser uno de los siguientes: NUMERO DE OFICIO, AREA SOLICITANTE, FECHA DE CAPTURA, TIPO PROCESO, COMPRADOR, OBSERVACIONES o Texto19. Cualquier otra cosa que le pongas al IsNull te dará error o no te funcionará

si esta , en la tabla procesos esta el campo y en el formulario al lado derecho esta una casilla con la etiqueta Recibido de cp, esta al entrar a propiedades-otras-nombre se llama control y es el campo que cree cuando te dije que era tipo fecha y por eso lo hice.

Pues no, no está en "Para proceso", digas lo que digas, jejeje

La única casilla que se llama "control" está en el subformulario "Proceso compra", y como el código lo ejecutas en el formulario principal ("Para proceso"), ahí tienes el error.

Para solucionarlo, pon:

If IsNull(Me.Proceso_compra.Form.[control]) Then

Y a partir de aquí, empiezan otros problemas:

1º/ IsNull no es la mejor forma de validar una casilla de tipo Si/NO, pues o está marcada (Valor True o -1) o no lo está (Valor False o 0). Mejor sería que usases:

If Me.Proceso_compra.Form.[control]=0 Then

o

If Me.Proceso_compra.Form.[control]=False Then

2º/ En mi ordenador, la segunda condición me da problemas por el formato de las fechas, lo mejor, para evitar problemas, es que fuerces el mismo formato en ambos lados de la igualdad, así te aseguras de que las fechas siempre se interpretan correctamente y no unas a la "americana" y otras a la "española":

If DCount("*", "procesos", "Format([Enviado a cp], 'dd/mm/yyyy')<" & Format(DateAdd("d", -5, Date), "dd/mm/yyyy")) > 0 Then

Mi estimado tienes toda la razón!!!, muchas gracias, de echo cambie la instrucción por que me faltaba validar un dato, quedo así:

If Not IsNull(Me.Proceso_compra.Form.[Enviado a cp]) Then
     If Me.Proceso_compra.Form.[control] = 0 Then
           If DCount("*", "procesos", "Format([Enviado a cp],'dd/mm/yyyy')<" & Format(DateAdd("d",

          -3,Date), "dd/mm/yyyy")) > 0 Then
         MsgBox "Tienes expedientes con mucho tiempo en Control Presupuestal", vbOKOnly,               

        "Revisalo"
        End If
    End If
End If

ahora casi funciona, por que hay un problema, en el dcount manda el mensaje aunque le capture la fecha de hoy, algo falla en la condición, según yo al usar en ejemplo la fecha de hoy quedaría

10/01/2019 < 7/01/2019, por lo que no debería contar ningún registro, pero aún así muestra el mensaje.

Como las fechas son muy "tiquismiquis", te propongo otra solución que te debiera funcionar perfectamente:

If DCount("*", "procesos", "Abs(DateDiff('d',[Enviado a cp], Date()))>3") > 0 Then

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas