2008-09-12 6 views
14

J'ai une grosse application ASP classique que je dois maintenir, et je suis à plusieurs reprises contrariée par l'absence de capacité d'évaluation de court-circuit. Par exemple, VBScript ne vous laissera pas partir avec:Contournement de court-circuit conditionnel VBScript

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

... parce que si Rs (« myField ») est nulle, vous obtenez une erreur dans la deuxième condition, la comparaison null à 0. Je » ll finissent généralement le faire à la place:

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

if myField <> 0 then 
... 

De toute évidence, la verbosité est assez épouvantable. En regardant autour de cette grande base de code, la meilleure solution consiste à utiliser une fonction que le programmeur d'origine a écrite, appelée TernaryOp, qui se base essentiellement sur une fonctionnalité ternaire, mais je suis toujours coincé avec une variable temporaire être nécessaire dans un langage plus complet. Y a-t-il un meilleur moyen? Une façon super-secrète que le court-circuit existe vraiment dans VBScript?

Répondre

8

Peut-être pas le meilleur moyen, mais cela fonctionne certainement ... Aussi, si vous êtes en vb6 ou en .net, vous pouvez avoir différentes méthodes qui transtyper au bon type aussi.

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 
9

emboîtées FI (seulement un peu moins bavard):

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

Would qu'il y avait, mon ami - TernaryOp est votre seul espoir.

+0

Classic VB n'a pas non plus d'opération réelle ternaire, juste la fonction IIf() (immédiate si). Mais même si cela reste une fonction, les arguments de la fonction _all_ doivent être évalués avant de passer à la fonction. –

1

Oui, ce n'est pas la meilleure solution, mais ce que nous utilisons est quelque chose comme ça

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

J'ai toujours utilisé instructions Select Case à la logique de court-circuit 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 peut être désactivé, été un certain temps. Si le premier cas apparaît, tout le reste est ignoré.

0

Deux possibilités viennent à l'esprit:

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

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

2) utiliser une fonction qui renvoie une valeur booléenne:

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 
3

Ou peut-être que j'ai eu la mauvaise fin de la question. Vouliez-vous dire quelque chose comme iIf() dans 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 
2

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

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

Mais votre action then doit également apparaître sur la même ligne. Si vous avez besoin de plusieurs instructions après then, vous pouvez les séparer avec : ou déplacer 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")) 
0

Vous pourrez peut-être simplement utiliser Else pour attraper "" nulls 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 

Je l'ai testé dans mon code et ça fonctionne actuellement. Peut-être pas juste pour la situation de tout le monde cependant.