XLT IF Statement

Homepage Clovertech Forums Cloverleaf XLT IF Statement

  • Creator
    Topic
  • #116114
    Stewart
    Participant

    I need the if statement to test on multiple items.  What are the correct characters to use to group the || statement together?  In most cases this is accomplished with parentheses ( if((a==x || a == z) &&  b==z) {} )

    IF

    (0).MSH(0).#4(0) eq =AHBEC  ||  0(0).MSH(0).#4(0)  eq =IHSUM &&  2(0).1(0).1(0).0(0).OBX(0).#3(0).[0] =THEID

     

Viewing 7 reply threads
  • Author
    Replies
    • #116115
      Keith McLeod
      Participant

      You may want to consider a table value to a variable and then test the variable.

      ABC –> SEND

      DEF –> SEND

      Default –> KILL

      Use something like @msh4_test

      If @msh4_test eq =SEND

      Do something….

    • #116116
      Paul Bishop
      Participant

      Parenthesis are correct.  For a translate, it would be:

      if {($a eq =x || $a eq =y) && $b eq =z} {do something}

      In a TCL script, it would be:

      if {($a eq “x” || $a eq “y”) && $b eq “z”} {do something}

      Paul Bishop
      Carle Foundation Hospital
      Urbana, IL

    • #116117
      Anonymous
      Inactive

      lots of ways to accomplish this, but to use the xlt IF statement, try this:

      ( 0(0).MSH(0).#4(0) eq =AHBEC || 0(0).MSH(0).#4(0) eq =IHSUM ) && ( 2(0).1(0).1(0).0(0).OBX(0).#3(0).[0] =THEID )

      (The second set of parens is optional.)

    • #116118
      Stewart
      Participant

      I couldn’t get any of these to work correctly.  I broke it down into 2 separate if statements.

    • #116127
      Anonymous
      Inactive

      fyi, I think you were missing the leading “0” in your original post:

      0(0).MSH(0).#4(0)

    • #116131
      Vince Angulo
      Participant

      I’m pretty sure I always end up nesting the AND clause under the OR condition.

      In Welch’s Tcl manual there are two full pages on grouping.  Normally, programming 101 says AND precedes OR, but precedence is over-ridden by parens () — however I’ve found that’s not always the case in Tcl (or how it’s implemented in Cloverleaf).

      Glad you got it working even if it wasn’t as elegant as you would’ve liked.

    • #116133
      Charlie Bursell
      Participant

      “however I’ve found that’s not always the case in Tcl (or how it’s implemented in Cloverleaf).”

      Can you be more specific?  Tcl as implemented in Cloverleaf uses the same precedence rules as Tcl anywhere.  Also, to the best of my knowledge Tcl uses the same precedence rules as most languages.  I cannot think of one that is different.

      https://www.tutorialspoint.com/tcl-tk/tcl_operators_precedence.htm

      Operator precedence determines the grouping of terms in an expression. This affects how an expression is evaluated. Certain operators have higher precedence than others; for example, the multiplication operator has higher precedence than the addition operator.

      <b>For example</b> : x = 7 + 3 * 2; here, x is assigned 13, not 20 because operator * has higher precedence than +, so it first gets multiplied with 3 * 2 and then adds into 7.

      Here, operators with the highest precedence appear at the top of the table, those with the lowest appear at the bottom. Within an expression, higher precedence operators will be evaluated first.

      Category Operator Associativity
      Unary + – Right to left
      Multiplicative * / % Left to right
      Additive + – Left to right
      Shift << >> Left to right
      Relational < <= > >= Left to right
      Equality == != Left to right
      Bitwise AND & Left to right
      Bitwise XOR ^ Left to right
      Bitwise OR | Left to right
      Logical AND && Left to right
      Logical OR || Left to right
      Ternary ?: Right to left

      Example

      Try the following example to understand the operator precedence available in Tcl language −

      <pre class=”prettyprint notranslate prettyprinted”>#!/usr/bin/tclsh

      set a 20
      set b 10
      set c 15
      set d 5

      set e [expr [expr $a + $b] * $c / $d ] ;# ( 30 * 15 ) / 5
      puts
      “Value of (a + b) * c / d is : $e\n”

      set e [expr [expr [expr $a + $b] * $c] / $d] ;# (30 * 15 ) / 5]
      puts
      “Value of ((a + b) * c) / d is : $e\n”

      set e [expr [expr $a + $b] * [expr $c / $d] ] ;# (30) * (15/5)
      puts
      “Value of (a + b) * (c / d) is : $e\n”

      set e [expr $a + [expr $b * $c ] / $d ] ;# 20 + (150/5)
      puts
      “Value of a + (b * c) / d is : $e\n”</pre>
      When you compile and execute the above program, it produces the following result −
      <pre class=”result notranslate”>Value of (a + b) * c / d is : 90

      Value of ((a + b) * c) / d is : 90

      Value of (a + b) * (c / d) is : 90

      Value of a + (b * c) / d is : 50</pre>

    • #116137
      Vince Angulo
      Participant

      Thanks Charlie – I have to agree with everything in your post as it applies to arithmetic operators.  My challenge had been, like Stewart’s original post, with logical operators in an IF statement.  I’ve gotten in the habit of separating the ANDs and ORs into separate IFs, that I don’t have a recent example.  Of course, could’ve been my inexperience with the translate tool as well…

      • This reply was modified 4 years, 6 months ago by Vince Angulo.
Viewing 7 reply threads
  • You must be logged in to reply to this topic.

Forum Statistics

Registered Users
5,129
Forums
28
Topics
9,301
Replies
34,448
Topic Tags
288
Empty Topic Tags
10