Access
 sql >> Base de Dados >  >> RDS >> Access

A Função IIf() vs. A Instrução IIf()


O IIf() função e a função IIf() afirmação são animais fundamentalmente diferentes.

Infelizmente, eles são quase impossíveis de distinguir. E, no entanto, é importante ser capaz de fazê-lo. Por quê?

Porque esta função IIf() é um erro de tempo de execução esperando para acontecer:
IIf(Attempts = 0, 0, Successes / Attempts)

Enquanto esta instrução IIf() retornará com segurança um valor mesmo se Attempts = 0 :
IIf(Attempts = 0, 0, Successes / Attempts)

Então, você consegue identificar a diferença entre os dois?

Diferenciando-os


Se você não consegue identificar a diferença entre as duas amostras acima, é porque não há diferença.

O IIf() função parece idêntico ao IIf() declaração.

A diferença está em como – ou mais precisamente, onde– eles são avaliados.
  • A função IIf é membro da biblioteca padrão VBA.Interaction.
  • A declaração do IIf é avaliado pelo serviço de expressão do mecanismo de banco de dados Jet/ACE (acees.dll).

Eu escrevi sobre as diferenças entre código e expressões aqui:
Expressões vs. CódigoQuando código não é código? Quando é uma expressão. Qual é a diferença e quem realmente se importa? Vamos explorar. Não é mais definidoMike Wolfe

A diferença fundamental entre a função IIf() e a instrução IIf()


Três palavras:avaliação de curto-circuito.
  • A declaração do IIf tem.
  • A função IIf não.

O que é avaliação de curto-circuito?


Na avaliação de curto-circuito, o código avalia apenas as expressões necessárias para determinar o resultado.

A instrução IIf e a função IIf recebem três argumentos:
  • expr: uma condição booleana
  • truepart: o resultado a ser retornado se expr é Verdadeiro
  • parte falsa: o resultado a ser retornado se expr é falso

Com a instrução IIf, apenas dois desses argumentos são avaliados:o expr e–dependendo do resultado da expr– ou a truepart OU a parte falsa .

Com a função IIf, todos os três argumentos DEVEM ser avaliados antes mesmo de serem passados ​​para a função.

Por que é importante


Vamos voltar ao código de exemplo original:
IIf(Attempts = 0, 0, Successes / Attempts)

O que acontece se o valor de Tentativas é zero?

IIf declaração

  • A exp avalia como Verdadeiro.
  • A truepart avalia para 0 .
  • A instrução retorna 0 .

IIf função

  • A expr avalia como Verdadeiro.
  • A truepart avalia para 0 .
  • A parte falsa avalia como #ERROR#:Divisão por zero

A função version retorna um erro porque foi forçado a avaliar tanto a truepart e a falsepart expressões.

Onde está IIf Tratada como uma declaração?


SE é avaliado como uma declaração nos seguintes locais:
  • Consultas
  • Propriedades de formulário/relatório/controle (por exemplo, um TextBox ControlSource)
  • A função Access Application.Eval()

Para obter mais detalhes, incluindo como testar definitivamente se IIf está sendo tratado como uma instrução ou função – leia meu artigo sobre as diferenças entre expressões e código:Expressões vs. Código .

Referências externas

Função IIf (Visual Basic for Applications)Tópico de referência do Office VBAMicrosoft Docso365devx