Mas de una expresión en Access, campo sale en blanco

Les comento que estoy creando una BD en Access ya que la planilla en Excel usada creció demasiado y me he partido ya 3 semanas la cabeza con esta formula, a lo mejor es una estupidez pero ya no se que hacer, debo aclarar que soy autodidacta y no desarrollador help!

Tengo una tabla “ctasXcobrar”, en ella tengo el campo “fecha de vencimiento” el cual debo restar con la fecha actual, y dependiendo de la cantidad de días es el mensaje que debe aparecer en el campo “ESTADO”; tengo un campo calculado llamado“Días”  =DifFecha("d"; Fecha();[Vencimiento])

ejemplo:

Si [Días]<0; “Enviar mail o contacto telefónico por cobranza”

Si [Días]>=0 Y <5;” Estar atento o consular si está incluida en nómina de pago”

Si [Días]>5 ;“Sin acción”

Si [Días]>6 ;“vencida”

Si coloco una sola expresión en el campo funciona, si agrego 2 también, ya con la tercera el campo me aparece en blanco o me arroja -1

Con esta fórmula corta funciona:

=SiInm([Dias]>=0;"Enviar" Y ([Dias]<5;"Estar atento";"Sin acción"))

Con esta no sale nada:

=SiInm([Dias]>=0;"Enviar ..." Y DifFecha("d";[vencimiento];Ahora())<5;"Estar atento ...");SiInm([Dias]<0;"Enviar mail..." Y DifFecha("d";[vencimiento];Ahora())>5;"Sin Accion")

La ultima prueba saque un ejemplo similar en el sitio de Microsoft, solo que el ejemplo era con = y lo modifique y quedo así:

=SiInm([Dias]<0;"menor que 0";SiInm([Dias]>=0;"mayor o igual 0" Y ([Dias]<5;"menor a 5";"Incluir nomina";SiInm([Dias]>5;"mayor a 5";"NO HACER NADA"))))

Con esta también me queda el campo en blanco o -1 y ademas no arroja ningún error.

Cualquier ayuda se agradece

2 Respuestas

Respuesta
2

Cristian trate en lo posible utilizar una función algo como: Dice que Dias es un campo calculado, en este ejemplo es ndias=DifFecha("d"; Fecha();[Vencimiento])

Function mensaje(ndias As Integer) As String
'mensaje = IIf(ndias < 0, "Enviar email", IIf(ndias >= 0 And ndias < 5, "Estar Atento", IIf(ndias >= 5 And ndias <= 6, "Sin acción", "Vencida")))
 Select Case ndias
      Case Is < 0
        mensaje = "Envair email"
      Case 0 To 4
        mensaje = "Estar Atento"
      Case 5 To 6
        mensaje = "Sin Acción"
      Case Else
        mensaje = "Vencida"
 End Select
End Function

Ejemplos de llamada desde la ventana de inmediato

¿
? Mensaje(-2)
Enviar email
? Mensaje(2)
Estar Atento
? Mensaje(5)
Sin Acción
? Mensaje(8)
Vencida

Ahora si no entiende la función siga la sintaxis de esta instrucción.

IIf(ndias < 0, "Enviar email", IIf(ndias >= 0 And ndias < 5, "Estar Atento", IIf(ndias >= 5 And ndias <= 6, "Sin acción", "Vencida")))

¡Gracias! 

Muchas gracias, como es un campo en el formulario, me sirvió perfecto la ultima solución y veo que Yo estaba anidando mal las expresiones.

de nuevo gracias por la ayuda.

adjunto imagen del resultado como formulario y como hoja de datos, agregue que si el campo esta en blanco revisen la fecha de vencimiento y funciona sin problemas:

Respuesta
1

Hay muchas formas de condicionar en base a un dato, lo mas clásico (cuando se trata de evaluar un único dato) y permite añadir mas condiciones según se cumpla la primera es la función Select Case,

Pero hay muchas mas por ejemplo en la original que has planteado, un simple Si .. (IF) se haría así:

IF [Días] < 0 Then Me.Estado = “Enviar mail o contacto telefónico por cobranza”
IF [Días] Between 0 And 4 Then Me.Estado =” Estar atento o consular si está incluida en nómina de pago”
IF [Días] = 5 Or IF [Días] = 6 Then Me.Estado = “Sin acción”
IF [Días] > 6  Then Me.Estado = “vencida”

En cada comparación he aplicado un método diferente (para que aprecies las diferentes posibilidades) y como se ejecutan cada uno en una línea independiente no se necesita el End IF.

Al respecto de IIF solo un comentario, es una funcion que hace exactamente lo mismo que un clasico:

IF A = B Then
MsgBox "Son iguales"
Else
MsgBox "Son diferentes"
End IF
IIF (Condicion, Si_se_cumple, No_se_cumple)

Y se puede sustituir cada una de las respuestas por una nueva condición y encadenar varias consecutivas.

IIF (Condicion_1,  IIF(Condicion_2, Si_se_cumple_2, No_se_cumple_2) , IIF(Condicion_3, Si_se_cumple_3, No_se_cumple_3) )

Hay otras opciones como Switch que selecciona en base al dato entre pares o Choose que en base al valor selecciona una de las opciones, un ejemplo de Switch:

Switch(expresión-1, valor-1[, expresión-2, valor-2 … [, expresión-n,valor-n]])
'Aplicado en la práctica:
Me.Estado = Switch ([Días] <0,  “Enviar mail o contacto telefónico por cobranza”, [Días] Between 0 And 4, ” Estar atento o consular si está incluida en nómina de pago”, [Días] = 5 Or IF [Días] = 6, “Sin acción”, [Días] >6,  “vencida”)

Un comentario, independiente de el método de aprendizaje: si escribes una línea de código o cualquier acción que haga lo que se necesita: se es programador, tan programador como el que (con más tiempo) escriba cinco mil líneas de código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas