Question

J'ai une grande application ASP classique que je dois maintenir, et je me retrouve à plusieurs reprises contrecarré par le manque de capacité d'évaluation des courts-circuits.Par exemple, VBScript ne vous permettra pas de vous en sortir :

if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...

...car si Rs("myField") est nul, vous obtenez une erreur dans la deuxième condition, comparant null à 0.Je finirai donc généralement par faire ceci à la place :

dim myField
if isNull(Rs("myField")) then 
    myField = 0
else
    myField = Rs("myField")
end if

if myField <> 0 then
...

Évidemment, la verbosité est assez épouvantable.En regardant autour de cette grande base de code, la meilleure solution de contournement que j'ai trouvée est d'utiliser une fonction écrite par le programmeur d'origine, appelée TernaryOp, qui greffe essentiellement une fonctionnalité de type opérateur ternaire, mais je suis toujours coincé avec une variable temporaire qui ne le ferait pas. être nécessaire dans un langage plus complet.Existe-t-il une meilleure façon ?Une manière super secrète de faire en sorte que le court-circuit existe réellement dans VBScript ?

Était-ce utile?

La solution

Ce n'est peut-être pas la meilleure solution, mais cela fonctionne certainement...De plus, si vous êtes en vb6 ou .net, vous pouvez également avoir différentes méthodes qui sont converties en type approprié.

if cint( getVal( rs("blah"), "" ) )<> 0 then
  'do something
end if


function getVal( v, replacementVal )
  if v is nothing then
    getVal = replacementVal
  else
    getVal = v
  end if
end function

Autres conseils

FI imbriqués (à peine moins verbeux) :

if not isNull(Rs("myField")) Then
   if Rs("myField") <> 0 then

J'ai toujours utilisé les instructions Select Case pour court-circuiter la logique en VB.Quelque chose comme..

Select Case True

Case isNull(Rs("myField"))

    myField = 0

Case (Rs("myField") <> 0)

    myField = Rs("myField")

Case Else

    myField = -1        

End Select

Ma syntaxe est peut-être erronée, cela fait un moment.Si le premier cas apparaît, tout le reste est ignoré.

Ou peut-être que je me suis trompé de question.Vouliez-vous dire quelque chose comme iIf() en VB ?Cela fonctionne pour moi :

myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))

returnIf() est une fonction comme ceci :

function returnIf(uExpression, uTrue, uFalse)
    if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function

Si vous l'écrivez en deux en ligne IF déclarations, vous pouvez réaliser un court-circuit :

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...

Mais votre then l'action doit également apparaître sur la même ligne.Si vous avez besoin de plusieurs déclarations après then, vous pouvez les séparer avec : ou déplacez votre code vers un sous-programme que vous pouvez appeler.Par exemple:

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2

Ou

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))

S'il y en avait, mon ami - TernaryOp est votre seul espoir.

Ouais, ce n'est pas la meilleure solution mais ce que nous utilisons ressemble à ceci

function ReplaceNull(s)
    if IsNull(s) or s = "" then
        ReplaceNull = "&nbsp;"
    else
        ReplaceNull = s
    end if
end function

Deux options me viennent à l'esprit :

1) utiliser len() ou lenb() pour découvrir s'il y a des données dans la variable :

if not lenb(rs("myField"))=0 then...

2) utilisez une fonction qui renvoie un booléen :

if not isNothing(rs("myField")) then...

isNothing() est une fonction comme ceci :

function isNothing(vInput)
    isNothing = false : vInput = trim(vInput)
    if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if 
end function

Vous pourrez peut-être simplement utiliser Else pour attraper les valeurs nulles, "" s, etc.

If UCase(Rs("myField")) = "THING" then
  'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
  'Do Other Stuff
else
  'Invalid data, such as a NULL, "", etc.
  'Throw an error, do nothing, or default action
End If

J'ai testé cela dans mon code et cela fonctionne actuellement.Cependant, cela ne convient peut-être pas à la situation de tout le monde.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top