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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top