2008-09-12 12 views
14

Mam dużą klasyczną aplikację ASP, którą muszę utrzymywać i wielokrotnie udowadniałem, że nie daję sobie rady dzięki brakowi możliwości oceny zwarć. Np VBScript nie pozwolę ci uciec:Sposób obejścia warunku zwarciowego VBScript

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

... bo jeśli Rs („myField”) jest pusty, pojawi się błąd w drugim stanie, porównując wartość null do 0. Więc ja” Zwykle kończy się to zamiast tego:

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

if myField <> 0 then 
... 

Oczywiście, gadatliwość jest dość przerażająca. Rozglądając się po tej dużej bazie kodu, najlepszym rozwiązaniem, jakie znalazłem, jest użycie funkcji napisanej przez oryginalnego programistę, zwanej TernaryOp, która zasadniczo przeszczepia się w potrójnej funkcji podobnej do operatora, ale nadal utknąłem przy użyciu zmiennej tymczasowej, która nie konieczne w bardziej w pełni funkcjonalnym języku. Czy istnieje lepszy sposób? Jakiś super-tajny sposób, w jaki naprawdę istnieje zwarcie w VBScript?

Odpowiedz

8

Być może nie jest to najlepszy sposób, ale na pewno działa ... Również, jeśli jesteś w wersji vb6 lub .net, możesz mieć różne metody odlewania do odpowiedniego typu.

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 
9

zagnieżdżone FI (tylko nieznacznie mniej gadatliwy):

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

Byłoby to było, przyjacielu - TernaryOp jest jedyną nadzieją.

+0

Klasyczny VB nie ma prawdziwego potrójnego op, tylko funkcja IIf() (natychmiastowe jeśli). Ale nawet to jest nadal funkcją, więc _liczne argumenty funkcji muszą zostać ocenione przed przejściem do funkcji. –

1

Tak to nie jest najlepsze rozwiązanie, ale czego używamy jest coś takiego

function ReplaceNull(s) 
    if IsNull(s) or s = "" then 
     ReplaceNull = "&nbsp;" 
    else 
     ReplaceNull = s 
    end if 
end function 
4

zawsze używane SELECT sprawę do krótkiej logiki obwodu w VB. Coś jak ..

Select Case True 

Case isNull(Rs("myField")) 

    myField = 0 

Case (Rs("myField") <> 0) 

    myField = Rs("myField") 

Case Else 

    myField = -1   

End Select 

Moja składnia może być wyłączona, od jakiegoś czasu. Jeśli pojawi się pierwszy przypadek, wszystko inne zostanie zignorowane.

0

dwie opcje przychodzą na myśl:

1) stosowanie len() lub lenb() aby dowiedzieć się, czy istnieje jakiekolwiek dane w zmiennej:

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

2) Za pomocą funkcji, która zwraca wartość logiczną:

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

gdzie isNothing() jest funkcją tak:

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 
3

A może mam zły koniec pytania. Czy miałeś na myśli coś takiego jak iIf() w VB?Działa to dla mnie:

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

gdzie returnIf() jest funkcją tak:

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

Jeśli piszesz je jako dwa inline IF wypowiedzi, można osiągnąć zwarcia:

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

Ale twoja akcja then musi również pojawić się w tym samym wierszu. Jeśli potrzebujesz wielu instrukcji po then, możesz je rozdzielić za pomocą : lub przenieść swój kod do podprogramu, do którego możesz zadzwonić. Na przykład:

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2 

Albo

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

Możesz być w stanie po prostu użyć Else złapać null "" s itp

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 

Przetestowałem to w moim kod i obecnie działa. Może nie być jednak w porządku dla sytuacji wszystkich.