sql >> Databasteknik >  >> RDS >> Access

IIf()-funktionen kontra IIf()-satsen

IIf() funktionen och IIf() uttalande är fundamentalt olika djur.

Tyvärr är de nästan omöjliga att skilja från varandra. Och ändå är det viktigt att kunna göra det. Varför?

Eftersom denna IIf() funktion är ett körtidsfel som väntar på att hända:

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

Medan detta IIf() påstående returnerar säkert ett värde även om Attempts = 0 :

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

Så, kan du se skillnaden mellan de två?

Berätta för dem

Om du inte kan se skillnaden mellan de två exemplen ovan beror det på att det inte finns någon skillnad.

IIf() funktion ser identisk ut med IIf() uttalande.

Skillnaden ligger i hur – eller mer exakt, var – de utvärderas.

  • IIf funktionen är medlem i VBA.Interactions standardbibliotek.
  • IIf uttalandet utvärderas av Jet/ACE-databasmotorns Expression Service (acees.dll).

Jag skrev om skillnaderna mellan kod och uttryck här:

Uttryck kontra kod När är kod inte kod? När det är ett uttryck. Vad är skillnaden och vem bryr sig egentligen? Låt oss utforska. Inte längre inställd Mike Wolfe

Den grundläggande skillnaden mellan IIf()-funktionen och IIf()-satsen

Tre ord:kortslutningsutvärdering.

  • IIf uttalandet har det.
  • IIf funktionen inte.

Vad är kortslutningsutvärdering?

Vid kortslutningsutvärdering utvärderar koden endast de uttryck som behövs för att bestämma resultatet.

IIf-satsen och IIf-funktionen har båda tre argument:

  • expr: ett booleskt tillstånd
  • truepart: resultatet att returnera om expr är sant
  • falsepart: resultatet att returnera om expr är falskt

Med IIf-satsen utvärderas endast två av dessa argument någonsin:expr och–beroende på resultatet av expr– antingen den sanna delen ELLER falsepart .

Med IIf-funktionen MÅSTE alla tre argumenten utvärderas innan de ens skickas till funktionen.

Varför det spelar roll

Låt oss gå tillbaka till den ursprungliga exempelkoden:

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

Vad händer om värdet av Försök är noll?

IIf påstående

  • expr utvärderar till Sant.
  • Den sanna delen utvärderas till 0 .
  • Satsen returnerar 0 .

IIf funktion

  • expr utvärderas till Sant.
  • Den sanna delen utvärderas till 0 .
  • Den falska delen utvärderas till #ERROR#:Division med noll

funktionen version returnerar ett fel eftersom den var tvungen att utvärdera både truepart och falsepart uttryck.

Var är IIf Behandlas som ett uttalande?

IIf utvärderas som ett påstående på följande platser:

  • Frågor
  • Formulär/Rapport/Kontrollegenskaper (t.ex. en TextBox ControlSource)
  • Funktionen Access Application.Eval()

För mer information – inklusive hur du definitivt testar om IIf behandlas som ett påstående eller en funktion – läs min artikel om skillnaderna mellan uttryck och kod:Uttryck vs. kod .

Externa referenser

IIf-funktion (Visual Basic för applikationer)Office VBA-referensämneMicrosoft Docso365devx
  1. Vad är skillnaden mellan funktionerna RANK() och DENSE_RANK() i oracle?

  2. Hur man designar ett geografiskt distribuerat MariaDB-kluster

  3. Försöker distribuera Oracle-ADF-applikationen till Tomcat 7

  4. Det gick inte att skapa den begärda tjänsten [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]