asp classic - for - VBScript solución de cortocircuito condicional
vbscript if (9)
IF anidados (solo ligeramente menos detallado):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
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 le permitirá salirse con la suya:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
... porque si Rs ("myField") es nulo, se obtiene un error en la segunda condición, comparando null con 0. Así que generalmente 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?
Ojalá hubiera, mi amigo, TernaryOp es tu única esperanza.
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 = " "
else
ReplaceNull = s
end if
end function
Siempre utilicé sentencias 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.
Tal vez no sea la mejor manera, pero sin duda funciona ... Además, si está en vb6 o .net, puede tener diferentes métodos que también funcionen correctamente.
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
Dos opciones vienen a la mente:
1) use len()
o lenb()
para descubrir si hay datos en la variable:
if not lenb(rs("myField"))=0 then...
2) usa una función que devuelve un valor booleano:
if not isNothing(rs("myField")) then...
donde isNothing()
es una función como esta:
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
O tal vez tengo el final equivocado de la pregunta. ¿ iIf()
decir algo como iIf()
en VB? Esto funciona para mí:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
donde returnIf()
es una función así:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
Si lo escribe como dos instrucciones IF
línea, puede lograr un cortocircuito:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
Pero tu acción then
debe aparecer en la misma línea también. Si necesita varias declaraciones 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"))
Es posible que solo pueda usar Else
para capturar valores 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.