sql >> Base de Datos >  >> RDS >> Access

La función IIf() frente a la instrucción IIf()

El IIf() función y el IIf() son animales fundamentalmente diferentes.

Desafortunadamente, son casi imposibles de diferenciar. Y, sin embargo, es importante poder hacerlo. ¿Por qué?

Porque esta función IIf() es un error de tiempo de ejecución esperando a suceder:

IIf(Attempts = 0, 0, Successes / Attempts)

Si bien esta declaración IIf() devolverá un valor de forma segura incluso si Attempts = 0 :

IIf(Attempts = 0, 0, Successes / Attempts)

Entonces, ¿puedes encontrar la diferencia entre los dos?

Distinguirlos

Si no puede detectar la diferencia entre las dos muestras anteriores, es porque no hay diferencia.

El IIf() función se ve idéntico al IIf() declaración.

La diferencia está en cómo, o más precisamente, dónde ellos son evaluados.

  • La función IIf es miembro de la biblioteca estándar VBA.Interaction.
  • La declaración IIf es evaluado por el servicio de expresión del motor de base de datos Jet/ACE (acees.dll).

Escribí sobre las diferencias entre el código y las expresiones aquí:

Expresiones vs. Código¿Cuándo el código no es código? Cuando es una expresión. ¿Cuál es la diferencia y a quién le importa realmente? Vamos a explorar. Ya no apareceMike Wolfe

La diferencia fundamental entre la función IIf() y la declaración IIf()

Tres palabras:evaluación de cortocircuito.

  • La declaración IIf lo tiene
  • La función IIf no.

¿Qué es la Evaluación de Cortocircuito?

En la evaluación de cortocircuito, el código evalúa solo aquellas expresiones necesarias para determinar el resultado.

Tanto la declaración IIf como la función IIf toman tres argumentos:

  • expr: una condición booleana
  • parte verdadera: el resultado a devolver si expr es cierto
  • parte falsa: el resultado a devolver si expr es falso

Con la declaración IIf, solo se evalúan dos de esos argumentos:el expr y–dependiendo del resultado de la expr– ya sea el truepart O la parte falsa .

Con la función IIf, los tres argumentos DEBEN evaluarse incluso antes de pasar a la función.

Por que es importante

Volvamos al código de ejemplo original:

IIf(Attempts = 0, 0, Successes / Attempts)

¿Qué sucede si el valor de Intentos es cero?

IIf declaración

  • La expr se evalúa como Verdadero.
  • La parte real evalúa a 0 .
  • La sentencia devuelve 0 .

función de IIf

  • La expr se evalúa como Verdadero.
  • La parte real evalúa a 0 .
  • La parte falsa se evalúa como #ERROR#:División por cero

La función versión devuelve un error porque se vio obligado a evaluar tanto la truepart y la parte falsa expresiones.

Dónde está si ¿Se trata como una declaración?

Si se evalúa como una declaración en los siguientes lugares:

  • Consultas
  • Propiedades de formulario/informe/control (por ejemplo, un ControlSource de cuadro de texto)
  • La función Access Application.Eval()

Para obtener más detalles, incluido cómo probar definitivamente si IIf se trata como una instrucción o una función:lea mi artículo sobre las diferencias entre expresiones y código:Expresiones frente a código .

Referencias externas

Función IIf (Visual Basic para aplicaciones)Tema de referencia de Office VBAMicrosoft Docso365devx