Pregunta

Tengo una gran aplicación ASP clásica que debo mantener y repetidamente me encuentro 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, obtienes un error en la segunda condición, comparando nulo con 0.Así que normalmente terminaré haciendo esto:

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

if myField <> 0 then
...

Obviamente, la verbosidad es bastante espantosa.Mirando alrededor de esta gran base de código, la mejor solución que he encontrado es usar una función que escribió el programador original, llamada TernaryOp, que básicamente incorpora una funcionalidad similar a un operador ternario, pero todavía estoy atascado usando una variable temporal que no ser necesario en un lenguaje más completo.¿Existe una mejor manera?¿Alguna forma súper secreta de que realmente existan cortocircuitos en VBScript?

¿Fue útil?

Solución

Quizás no sea la mejor manera, pero ciertamente funciona...Además, si está en vb6 o .net, también puede tener diferentes métodos que transmitan al 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

Otros consejos

IF anidados (sólo un poco menos detallados):

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

Siempre usé declaraciones Select Case para cortocircuitar la lógica 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

Es posible que mi sintaxis esté mal, ha pasado un tiempo.Si surge el primer caso, se ignora todo lo demás.

O tal vez entendí mal el final de la pregunta.¿Quiso decir algo como iIf() en VB?Esto funciona para mí:

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

dónde returnIf() es una función como esta:

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

Si lo escribes como dos en línea IF declaraciones, puede lograr un cortocircuito:

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

Pero tu then La acción también debe aparecer en la misma línea.Si necesita varias declaraciones después then, puedes separarlos con : o mueva 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"))

Si así fuera, amigo mío, 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

Se me ocurren dos opciones:

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

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

2) use una función que devuelva un valor booleano:

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

dónde 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

Es posible que puedas usar simplemente Else para capturar valores nulos, "", 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

Probé esto en mi código y actualmente está funcionando.Sin embargo, puede que no sea adecuado para la situación de todos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top