Re: Multiple IF Conditions by ekkehard
ekkehard
Fri Jul 04 03:59:59 CDT 2008
preet schrieb:
> Is there a better way to handle multiple IF Conditions like
>
> IF condition1 AND condition2 AND condition3 AND .... THEN
> code
> END IF
>
> Now suppose i have 30 to 40 conditions to test, how do i handle this
> snippet in an easier manner.
Use "Select Case False" instead of "If c1 And c2 ... Then" and
"Select Case True" instead of "If c1 Or c2 .. Then":
Dim aTests : aTests = Array( 11, 12, 2 )
Dim nTest, sContext, sResult
For Each nTest In aTests
WScript.Echo "Testing", nTest
sContext = "IF AND"
WScript.Echo " Context", sContext
If checkModulo( nTest, 2 ) _
And checkModulo( nTest, 3 ) _
And checkModulo( nTest, 4 ) _
Then
WScript.Echo " YES"
Else
WScript.Echo " NO"
End If
sContext = "SELECT FALSE (AND)"
WScript.Echo " Context", sContext
sResult = " NO"
Select Case False
Case checkModulo( nTest, 2 )
Case checkModulo( nTest, 3 )
Case checkModulo( nTest, 4 )
Case Else
sResult = " YES"
End Select
WScript.Echo sResult
sContext = "IF OR"
WScript.Echo " Context", sContext
If checkModulo( nTest, 2 ) _
Or checkModulo( nTest, 3 ) _
Or checkModulo( nTest, 4 ) _
Then
WScript.Echo " YES"
Else
WScript.Echo " NO"
End If
sContext = "SELECT TRUE (OR)"
WScript.Echo " Context", sContext
sResult = " YES"
Select Case True
Case checkModulo( nTest, 2 )
Case checkModulo( nTest, 3 )
Case checkModulo( nTest, 4 )
Case Else
sResult = " NO"
End Select
WScript.Echo sResult
Next
Function checkModulo( n1, n2 )
checkModulo = 0 = (n1 Mod n2)
WScript.Echo " checkModulo(", n1, ",", n2, ") =>", CStr( checkModulo )
End Function
output:
=== checkConditions2: ways to check conditions (2) ===
Testing 11
Context IF AND
checkModulo( 11 , 2 ) => Falsch
checkModulo( 11 , 3 ) => Falsch
checkModulo( 11 , 4 ) => Falsch
NO
Context SELECT FALSE (AND)
checkModulo( 11 , 2 ) => Falsch
NO
Context IF OR
checkModulo( 11 , 2 ) => Falsch
checkModulo( 11 , 3 ) => Falsch
checkModulo( 11 , 4 ) => Falsch
NO
Context SELECT True (OR)
checkModulo( 11 , 2 ) => Falsch
checkModulo( 11 , 3 ) => Falsch
checkModulo( 11 , 4 ) => Falsch
NO
Testing 12
Context IF AND
checkModulo( 12 , 2 ) => Wahr
checkModulo( 12 , 3 ) => Wahr
checkModulo( 12 , 4 ) => Wahr
YES
Context SELECT FALSE (AND)
checkModulo( 12 , 2 ) => Wahr
checkModulo( 12 , 3 ) => Wahr
checkModulo( 12 , 4 ) => Wahr
YES
Context IF OR
checkModulo( 12 , 2 ) => Wahr
checkModulo( 12 , 3 ) => Wahr
checkModulo( 12 , 4 ) => Wahr
YES
Context SELECT True (OR)
checkModulo( 12 , 2 ) => Wahr
YES
Testing 2
Context IF AND
checkModulo( 2 , 2 ) => Wahr
checkModulo( 2 , 3 ) => Falsch
checkModulo( 2 , 4 ) => Falsch
NO
Context SELECT FALSE (AND)
checkModulo( 2 , 2 ) => Wahr
checkModulo( 2 , 3 ) => Falsch
NO
Context IF OR
checkModulo( 2 , 2 ) => Wahr
checkModulo( 2 , 3 ) => Falsch
checkModulo( 2 , 4 ) => Falsch
YES
Context SELECT True (OR)
checkModulo( 2 , 2 ) => Wahr
YES
=== checkConditions2: 0 done (00:00:00) ==============
As you can see, this technique brings lazy evaluation of conditions
to VBScript.
Some more examples for "Select Case":
Dim aTests : aTests = Array( "lazy", "busy", "lary" )
Dim nI, nJ
For nI = 0 To UBound( aTests )
For nJ = 0 To UBound( aTests )
WScript.Echo "Is", aTests( nI ), "==", aTests( nJ )
Select Case False
Case Mid( aTests( nI ), 1, 1 ) = Mid( aTests( nJ ), 1, 1 )
WScript.Echo " 1 <>"
Case Mid( aTests( nI ), 2, 1 ) = Mid( aTests( nJ ), 2, 1 )
WScript.Echo " 2 <>"
Case Mid( aTests( nI ), 3, 1 ) = Mid( aTests( nJ ), 3, 1 )
WScript.Echo " 3 <>"
Case Else
WScript.Echo "YES"
End Select
Next
Next
WScript.Echo "----------"
For nI = 0 To UBound( aTests )
WScript.StdOut.Write aTests( nI )
Select Case True
Case Left( aTests( nI ), 1 ) <> "l"
WScript.Echo " 1 not l"
' Case Not( Mid( aTests( nI ), 3, 1 ) = "z" _
' Or Mid( aTests( nI ), 3, 1 ) = "r" )
Case 0 = InStr( "zr", Mid( aTests( nI ), 3, 1 ) )
WScript.Echo " 3 not z|r"
Case Right( aTests( nI ), 1 ) <> "y"
WScript.Echo " last not y"
Case Else
WScript.Echo " l.[zr]y"
End Select
Next
WScript.Echo "----------"
Dim sOrT : sOrT = "busy"
Dim sType
For nI = 1 To Len( sOrT )
Select Case Mid( sOrT, nI, 1 )
Case "b", "s"
sType = "consonant"
Case "a", "u"
sType = "vowel"
Case "y"
sType = "semivowel"
End Select
WScript.Echo Mid( sOrT, nI, 1 ), sType
Next
WScript.Echo "----------"
output:
=== checkConditions: ways to check conditions ====
Is lazy == lazy
YES
Is lazy == busy
1 <>
Is lazy == lary
3 <>
Is busy == lazy
1 <>
Is busy == busy
YES
Is busy == lary
1 <>
Is lary == lazy
3 <>
Is lary == busy
1 <>
Is lary == lary
YES
----------
lazy l.[zr]y
busy 1 not l
lary l.[zr]y
----------
b consonant
u vowel
s consonant
y semivowel
----------
=== checkConditions: 0 done (00:00:00) ===========