switch for example classic asp asp-classic vbscript

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 = "&nbsp;" 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.