Soluzione alternativa di cortocircuito condizionale VBScript
-
09-06-2019 - |
Domanda
Ho una grande app ASP classica che devo mantenere e mi ritrovo ripetutamente ostacolato dalla mancanza di capacità di valutazione di cortocircuito.Ad esempio, VBScript non ti permetterà di farla franca con:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
...perché se Rs("myField") è null, si ottiene un errore nella seconda condizione, confrontando null con 0.Quindi in genere finirò per fare questo invece:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
Ovviamente, la verbosità è piuttosto spaventosa.Guardando intorno a questa grande base di codice, la migliore soluzione che ho trovato è usare una funzione scritta dal programmatore originale, chiamata TernaryOp, che fondamentalmente si innesta in funzionalità simili a operatori ternari, ma sono ancora bloccato a usare una variabile temporanea che non lo farebbe essere necessario in un linguaggio più completo.C'è un modo migliore?Qualche modo super segreto in cui il cortocircuito esiste davvero in VBScript?
Soluzione
Forse non è il modo migliore, ma sicuramente funziona...Inoltre, se utilizzi vb6 o .net, puoi avere diversi metodi che eseguono anche il cast del tipo corretto.
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
Altri suggerimenti
IF nidificati (solo leggermente meno dettagliati):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
Ho sempre utilizzato le istruzioni Select Case per cortocircuitare la logica in VB.Qualcosa di simile a..
Select Case True
Case isNull(Rs("myField"))
myField = 0
Case (Rs("myField") <> 0)
myField = Rs("myField")
Case Else
myField = -1
End Select
La mia sintassi potrebbe essere disattivata, è passato un po' di tempo.Se si verifica il primo caso, tutto il resto viene ignorato.
O forse ho capito male la domanda.Intendevi qualcosa del genere iIf()
in VB?Questo funziona per me:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
Dove returnIf()
è una funzione del genere:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
Se lo scrivi come due inline IF
dichiarazioni, è possibile ottenere un cortocircuito:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
Ma il tuo then
anche l'azione deve apparire sulla stessa riga.Se hai bisogno di più dichiarazioni dopo then
, puoi separarli con :
oppure sposta il tuo codice in una subroutine che puoi chiamare.Per esempio:
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"))
Se ci fosse, amico mio, TernaryOp è la tua unica speranza.
Sì, non è la soluzione migliore, ma quello che usiamo è qualcosa del genere
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
Mi vengono in mente due opzioni:
1) utilizzare len()
O lenb()
per scoprire se ci sono dati nella variabile:
if not lenb(rs("myField"))=0 then...
2) utilizzare una funzione che restituisce un valore booleano:
if not isNothing(rs("myField")) then...
Dove isNothing()
è una funzione del genere:
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
Potresti essere in grado di usare semplicemente Else
per catturare valori nulli, "", ecc.
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
L'ho testato nel mio codice e attualmente funziona.Potrebbe però non essere adatto alla situazione di tutti.