Purpose With if you can make script commands dependent on conditions. For example, on the current GUI-Status or on whether certain fields exist in the SAP screen.

Example

if Q[Status=ADD1] or Q[Status=UPD1]  
 
 Image (1,50) (10,90) "imgupd.gif"  
else  
  
Image (1,50) (10,90) "imgdis.gif"  
endif  

If the GUI Status is ADD1 or UPD1, the image file "imgupd.gif" will appear, otherwise "imgdis.gif" will appear.

Conditions What conditions are available with if ?
Firstly, you can look for the existence of screen elements by simply naming the corresponding screen element in the
if command. For example:
  • if F[Amount] means: "if there is a field Amount on the screen".
  • if I[Amount] means: "if there is an input field  Amount on the screen".
  • if P[Cancel] means: "if there is a Cancel pushbutton on the screen". 
  • if M[Change] means: "if there is a menu item Change". 
  • if M[Change=active] means: "if there is a menu item Change which is active (not disabled)". 


Secondly, you can inquire about certain status data: 

  • if Q[Status=xxxx] If the GUI-Status is xxxx
  • if Q[Language=x] If the language key is x (1 character, E=English, D=German, F=French, I=Italian,...)
  • if Q[Database=xxx] if the system (database server) id is xxx
  • if Q[Client=xxx] if the client is xxx
  • if Q[User=xxx] if the user is xxx (see Role specific user screens)
  • if Q[Role=xxx] If the role is xxx (see Role specific user screens)
  • if Q[Profile=xxx] if the profile  is xxx
  • if Q[Transaction=xxxx] If the transaction code is xxxx (N.B. only possible with SAP Rel.4 and upwards)
  • if Q[ScreenVariant=xxxx] if an SAP screen variant xxx is active (with a central GuiXT script)
  • if Q[GuiXTVersion=yyyy Qx x] if the GuiXT Version is equal to yyyy Qx x. You can use <, = or >.  See also  Tips & Tricks below.
  • if Q[Popup] if the current screen is sent as a popup screen
  • if Q[InactiveScreen] if a popup screen is sent on top of the current screen
  • if Q[StopRequest] if the user has provoked a StopRequest in an InputScript (see StatusMessage)
  • if Q[Page=xxxx] if the current page of a tabbed dialog is xxxxx (xxxxx is the text displayed on the tab)
  • if V[vname=value] if the variable vname has the value (only possible with InputAssistant)
  • if U[uname=value] if the using parameter uname has the value (only possible with InputAssistant)

Thirdly you can inquire about user options set in guixt.ini: 

Option opt1 
Option opt2 

with if Q[Option=xxxx]. For example, you could offer an option HelpDisplay. When the user activates this option in guixt.ini, you could display a help text for certain transactions, either as image file using Image or as rtf or html file using View. Each user can then decide individually whether or not to use the help text. 

You can define up to 50 different options in guixt.ini, each Option string containing up to 30 characters.

Is it possible
 to use nested
 if else
endif?

 

Are logical expressions permitted?

Yes, both are possible. Example: 
 

if not Q[Status=UPD1]  
  
Image (1,50) (10,90) "imgdis.gif"  
else  
  
if (F[Company code] or F[Business area]) and not F[Order number]  
     
Image (1,50) (10,90) "imgupd1.gif"  
  
else  
    
Image (1,50) (10,90) "imgupd2.gif"  
    
Pushbutton (Toolbar) "Cancel" "/OZC27"  
  
endif 
endif  

You can use normal brackets, "and", "or" and "not" within logical expressions. Normal rules of logic apply for priority and bracketing. 

Option -strict in variable comparison When you compare a variable with a value

   if V[vname=value]

the following rules are automatically applied:

  • The comparison is  n o t  case sensitive, i.e. "abXY" = "ABxy"
  • All values consisting of zeros only are equal, and are also equal to the empty string: "0000" = "0" = ""

 Please use the option -strict in order to compare the values without applying these rules:

if V[vname=value]  -strict  
 ...
endif  

Tips & Tricks

 

  • A field, e.g. F[Company code], cannot be specified directly in an if statement, please use a variable. Example:
    Set V[buk] "&F[Company code]"  
    if V[buk=0001]
      
    ...  
    endif
  • In order to compare two variables V[x1] and  V[x2], you have to use the value &V[x2] in "if V[x1=value]":
    if V[x1=&V[x2]]
      
    ...  
    endif
  • For details concerning  if Q[Role=xxx] and  if Q[Profile=xxx] see Role specific user screens
  • "if Q[GuiXTVersion..." is supported in  GuiXT version 2002 Q4 3 and upwards. If you want to ensure that in your script (probably the logon script) the installed GuiXT version is at least 2002 Q4 5, you can use the following coding:

    if Q[GuiXTVersion<2002 Q4 5]
      Message "Please install new GuiXT versions \nFor questions contact S. Bauer ext. 2649"  Title="Update necessary"
    endif

    But in this case no message would appear in the versions prior to 2002 Q4 3, since the condition if Q[GuiXTVersion<....] didn't yet pertain, and the indication "false" is returned.  In order to cover such cases as well, use "not ... >" with the previous GuiXT version id:

    if not Q[GuiXTVersion>2002 Q4 4]
        Message "Please install new GuiXT versions \nFor questions contact S. Bauer ext. 2649"  Title="Update necessary"
    endif
  • You should not use Screen commands within if ... endif, since this makes the script hard to understand, and sometimes the behaviour will be quite unexpected. Bad example:

    Screen S1

       Set V[x] "a"
       Enter

       if V[x=b]

         
    Screen S2
             Enter "xx"

       else

         
    Screen S2
             Enter "yy"

       endif

    Assume that we have Screen S1 and then  Screen S2. Does GuiXT now process Enter "xx" or Enter "yy"? In fact, in this example,  Enter "xx" is executed, since GuiXT looks for the next matching Screen command for Screen S2, without considering open if statements of previous screen blocks.
    Instead, please close all open "if" statements in each screen block
    :

    Screen S1

       Set V[x] "a"
       Enter

    Screen S2
       if V[x=b]
         
    Enter "xx"
       else
       
      Enter "yy"
       endif

    In some cases it makes sense to use goto/label:

    Screen S1

       Set V[x] "a"
       Enter

       if V[x=b]
          goto
    l_b
       endif


    Screen S2
       Enter "xx"
       goto l_continue


    label l_b
    Screen S2
       Enter "yy"

    label l_continue
Components GuiXT