2008-09-12 9 views
14

Tengo una gran aplicación ASP clásica que tengo que mantener, y en repetidas ocasiones me veo frustrado por la falta de capacidad de evaluación de cortocircuitos. Por ejemplo, VBScript no va a dejar pasar con:VBScript solución de cortocircuito condicional

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

... porque si Rs ("myField") es nulo, se produce un error en la segunda condición, la comparación de nula a 0. Así que' Normalmente terminará haciendo esto en su lugar:

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

if myField <> 0 then 
... 

Obviamente, la verboseness es bastante atroz. Mirando alrededor de esta gran base de código, la mejor solución que he encontrado es usar una función que el programador original escribió, llamada TernaryOp, que básicamente se injerta en una funcionalidad ternaria similar a la del operador, pero todavía estoy atascado usando una variable temporal que no ser necesario en un lenguaje más completo. ¿Hay una mejor manera? ¿Alguna manera supersecreta de que el cortocircuito realmente exista en VBScript?

Respuesta

8

Quizás no sea la mejor manera, pero ciertamente funciona ... Además, si está en vb6 o .net, puede tener diferentes métodos que también se convierten en el tipo adecuado.

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

anidadas FI (sólo un poco menos detallado):

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

Ojalá lo hubiera, mi amigo - TernaryOp es su única esperanza.

+0

Classic VB tampoco tiene una función ternaria real, solo la función IIf() (inmediata si). Pero incluso eso sigue siendo una función, por lo que todos los argumentos de función deben evaluarse antes de pasar a la función. –

1

Sí No es la mejor solución, pero lo que usamos es algo como esto

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

Siempre solía declaraciones Select Case para la lógica de cortocircuito en VB. Algo como ...

Select Case True 

Case isNull(Rs("myField")) 

    myField = 0 

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

    myField = Rs("myField") 

Case Else 

    myField = -1   

End Select 

Mi sintaxis puede estar apagada, hace tiempo. Si aparece el primer caso, todo lo demás se ignora.

0

dos opciones vienen a la mente:

1) utilizar len() o lenb() para descubrir si hay algún dato en la variable:

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

2) utiliza una función que devuelve un valor lógico:

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

donde isNothing() es una función de este modo:

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

O tal vez me equivocaron al final de la pregunta. ¿Quisiste decir algo como iIf() en VB?Esto funciona para mí:

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

donde returnIf() es una función de este modo:

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

Si se escribe como dos línea IF declaraciones, se puede lograr un cortocircuito:

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

Pero su acción then también debe aparecer en la misma línea. Si necesita varias instrucciones después de then, puede separarlas con : o mover su código a una subrutina a la que pueda llamar. Por ejemplo:

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

O

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

Es posible que pueda utilizar sólo Else para atrapar nulos "" 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 

He probado esto en mi código y actualmente está funcionando. Sin embargo, podría no ser correcto para la situación de todos.

Cuestiones relacionadas