Solution de contournement de court-circuit conditionnel VBScript
-
09-06-2019 - |
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 ?
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"))
où 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 = " "
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...
où 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.