SAPscript Control Commands和通常文本行一样,在文本编辑器中输入和编辑,然而,和文本行相比,有下面一些区别:
l 在格式列输入段落格式“/:”表示一个控制命令;
l 在文本行中输入命令;
l Control Commands连同其参数,最多占用一行文本行;
l 每一行只能有一个Control Commands;
l 编辑器行的格式对Control Commands没有影响。
如果Control Commands没有定义或者有语法错误,则Control Commands所在的行被作为注释处理。
当main window显示不下时,SAPscript就会自动分页。可以利用NEW-PAGE命令强制分页(只要你想)。分页命令后面的文本显示在新页上,分页命令总是会执行(如果使用了)。
NEW-PAGE结束当前页。如果分页命令NEW-PAGE不带参数,在当前form中定义的page就作为next page使用;如果form中包括多个pages,可以将其中的任何pages作为next page使用。
语法:
/: NEW-PAGE [page_name]
示例:
/: NEW-PAGE
当前页结束,接下来的文本将显示在form中指定的page上
/: NEW-PAGE S1
和上面一个例子一样,除了S1被指定为next page外
在打印文档的时候,有时候不想将一段段落打印在不同的页上,这时候就需要设置限制分页命令。为了做到这一点,SAPscript提供了PROTECT和ENDPROTECT命令对。如果当前页面上的余留空白能够用来打印一段完整的文本,则这一段文本就在当前也上打印,就好像没有PROTECT命令一样。然而,如果余留空白不能够用来打印整个文本,则PROTECT命令和NEW-PAGE具有同样的作用,这一段完整的文本将会在新的page中打印出来。
因而,PROTECT/ENDPROTECT也可以被看成是有条件的NEW-PAGE命令,条件就是当前main window中的余留空白是否能够满足PROTECT/ENDPROTECT中指定的文本。
语法:
/: PROTECT
:
:
/: ENDPROTECT
被保护的文本行封装在这两个命令之间。
注意:
l 没有PROTECT命令的ENDPROTECT命令是没有任何作用的;
l 如果漏掉了ENDPROTECT命令,SAPscript默认受保护的文档直到文本结束;
l PROTECT/ENDPROTECT不能嵌套,如果在第一个ENDPROTECT结束前,定义了第二个PROTECT,则第二个 PROTECT/ENDPROTECT被忽略;
l 如果在PROTECT/ENDPROTECT命令对中封装的文本对于单个page来说太长的话,则在这段文本之前立即执行换页命令,文本按照通常的方式打印。在文本中某一个位置换页是不可避免的。
2.2.3 下一个main window命令:NEW-WINDOW
理论上,每一page能够由99个main windows组成。每一个main window被分配一个从0到98的识别号,windows也按照这个顺序来加载。这个特征使得SAPscript可以打印labels和输出多列文本。当一个main window填满后,如果有下一个main window的话,就是用下一个main window,在这两者之间会插入一个分页。
可以使用命令NEW-WINDOW来显示的调用下一个main window,即使当前的main window没有填满。
语法:
/: NEW-WINDOW
语法:
/: DEFINE &symbol_name& = 'value'
通过这种定义获得的值在事务结束后就失去了。如果想再次打印这个文本块,必须再次给这个文本symbol赋值。DEFINE命令的一个目的就是提供将值持久赋给文本的一种方式,以便当文本模块再次调用时,值可以重复使用。
示例:
/: DEFINE &subject& = 'Your letter of 7/3/95'
分配给symbol的值最大可以有60个字符。也可以包含其他的symbol变量。
请注意下面两个例子:
第一个例子:
/: DEFINE &symbol1& = 'mail'
/: DEFINE &symbol2& = 'SAP&symbol1&'
/: DEFINE &symbol1& = 'script'
&symbol2& -> SAPscript
第二个例子:
/: DEFINE &symbol1& = 'mail'
/: DEFINE &symbol2& := 'SAP&symbol1&'
/: DEFINE &symbol1& = 'script'
&symbol2& -> SAPmail
请注意观察这两个例子中的&symbol2&以及后面的赋值symbol,可以看出,可以将一个symbol变量连同其他字符赋给另一个symbol变量,但是如果用“=” 赋值symbol,则当“=”右边的symbol变量值发生变化时,“=”左边的值相应发生变化;另外一个方面,如果用“=” 赋值symbol,则当“:=”右边的symbol变量值发生变化时,“:=”左边的值并不发生变化。
为了定义日期格式的字段,需要使用SET DATE MASK控制命令。
语法:
/: SET DATE MASK = 'date_mask'
MASK可以是下面的代码:
l DD: day (two digits)
l DDD: day name - abbreviated
l DDDD: day name - written out in full
l MM: month (two digits)
l MMM: month name – abbreviated
l MMMM: month name - written out in full
l YY: year (two digits)
l YYYY: year (four digits)
l LD: day (formatted as for the L option)
l LM: month (formatted as for the L option)
l LY: year (formatted as for the L option)
在MASK中除了上面的代码外出现的所有其它字符都被当成简单文本处理,直接拷贝到输出。
示例:
假设当前的系统日期为 March 1st 1997,则
/: SET DATE MASK = 'Foster City, MM/DD/YY'
&DATE& -> Foster City, 03/01/97 (输出)
/: SET DATE MASK = 'MMMM DD, YYYY'
&DATE& -> March 01, 1997 (输出)
日期MASK可以通过下面命令设置成缺省值:
/: SET DATE MASK = ' '
注:在SAP系统表TTDTG中储存有所有的日期MASK,可以参考。
为了定义Time格式的字段,需要使用SET TIME MASK控制命令。
语法:
/: SET TIME MASK = 'time_mask'
其中TIME MASK可以是下面的代码之一:
l HH hours (two digits)
l MM minutes (two digits)
l SS seconds (two digits)
在MASK中除了上面的代码外出现的所有其它字符都被当成简单文本处理,直接拷贝到输出。
示例:
假设当前的系统时间为 10:08:12,则,
/: SET TIME MASK = 'HH:MM'
&TIME& -> 10:08(输出)
/: SET TIME MASK = 'HH hours MM minutes'
&TIME& -> 10 hours 08 minutes(输出)
时间MASK可以通过下面命令设置成缺省值:
/: SET TIME MASK = ' '
语法:
/: SET COUNTRY country_key
其中country_key储存在系统表T005X中,可以参照这个系统表,获得要设置的country_key.
说明:
某种类型的字段其格式与Country设置有关。比如,象日期和数字字段,不同的国家有不同的表示方式。为了指定一种格式选项,就是用SET COUNTRY命令。
示例:
/: SET COUNTRY 'CAN'
/: SET COUNTRY &country_key& (可以用symbol变量类设置)
语法:
/: SET SIGN LEFT
在数字的左边显示symbol
/: SET SIGN RIGHT
在数字的右边显示symbol
2.2.9 Initializing Numbered Paragraphs:RESET
为了重置段落大纲的番号为其初始值,需要使用RESET命令,如果没有使用RESET命令,则所有段落大纲的番号就是连续的(但这可能不是你所需要的),如果在RESET命令中指定了段落大纲的名字,则段落及其子段落的番号就被重新初始化。
语法:
/: RESET paragraph_format
我们看一个例子,就明白了:
假设有这样一个段落N1,这个段落的作用是一个简单的用户交互,用户通过输入来做相应的处理:
* Proceed as follows if you want to work with the SAP R/3
system:
N1 Ensure that you have a PC
N1 Switch the PC on
N1 Click on the SAP icon using the mouse.
* You will then enter the SAP logon screen. In order to log
on here, you must carry out the following actions:
/: RESET N1
N1 Enter your user name
N1 Enter your password
N1 Select the application you want to use
注意其中的/: RESET N1命令,这一段段落将象下面这样输出:
Proceed as follows if you want to work with the SAP R/3
system:
1. Ensure that you have a PC
2. Switch the PC on
3. Click on the SAP icon using the mouse.
You will then enter the SAP logon screen. In order to log on here, you must carry out the following actions:
1. Enter your user name
2. Enter your password
3. Select the application you want to use
而如果没有/: RESET N1命令,这一段段落输出则为:
Proceed as follows if you want to work with the SAP R/3
system:
1. Ensure that you have a PC
2. Switch the PC on
3. Click on the SAP icon using the mouse.
You will then enter the SAP logon screen. In order to log on here, you must carry out the following actions:
4. Enter your user name
5. Enter your password
6. Select the application you want to use
为了在当前文本中包含其他文本,需要使用INCLUDE命令,需要注意的是SAPscript仍然将include进来的文本作为独立的文本处理,仅仅只是在输出时,才将include进来的文本插入到INCLUDE命令指定的地方作为输出。
语法:
/: INCLUDE name [OBJECT o] [ID i] [LANGUAGE l] [PARAGRAPH p] [NEW-PARAGRAPH np]
其中name参数是必需的,其余参数是可选的。
示例:
/: INCLUDE MYTEXT
这个例子将MYTEXT文本包含在当前文本中
/: INCLUDE MYTEXT LANGUAGE 'E' PARAGRAPH 'A1'
这个例子将MYTEXT文本包含在当前文本中,同时指定了语言版本,这个语言版本与调用INCLUDE的文本无关,同时指定了这段文本将要使用的段落格式'A1'。
INCLUDE命令使用SAPSCRIPT-SUBRC作为状态代码返回:
l 0:INCLUDE命令执行成功
l 1:命令包含语法错误,因而不能执行
l 2:如果在SAPscript form中使用这个命令,将不会返回这个值
l 4:指定文本没有找到
STYLE控制命令允许改变文本的样式,新的样式对所有余下的文本有效,除非碰到另外一个STYLE命令,如果指定”*”作为样式的名字,则执行这个命令后,将恢复成系统原始样式。
语法:
①/: STYLE style [DOMINANT]
②/: STYLE *
注意:1)STYLE命令对INCLUDE命令中包含的文本没有作用,如果要使其对INCLUDE命令中的文本起作用,必须添加DOMINANT选项。
2)如果INCLUDE命令中的文本页包含STYLE命令,则即使使用了DOMINANT选项,INCLUDE命令中的文本仍然使用它自己的STYLE命令指定的样式。
语法:
/: ADDRESS [DELIVERY] [TYPE t] [PARAGRAPH a] [PRIORITY p] [LINES l]
/: TITLE title
/: NAME name1[,name2[,name3[,name4]]]
/: PERSON name of natural person [TITLE form of address]
/: PERSONNUMBER number of the personen
/: DEPARTMENT department
/: STREET street name HOUSE house number
/: LOCATION additional location information
/: POBOX po box [CODE post code / zip code] [CITY city]
/: POSTCODE post code / zip_code
/: CITY city1[,city2]
/: NO_UPPERCASE_FOR_CITY
/: REGION county / state
/: COUNTRY recipient country [LANGUAGE language code]
/: COUNTRY_IN_REC_LANG
/: LANG_FOR_COUNTRY language key
/: FROMCOUNTRY sender country
/: ADDRESSNUMBER address number
/: ENDADDRESS
ADDRESS-ENDADDRESS控制命令根据COUNTRY参数所在的邮政习惯来格式化地址文本,参考字段在结构ADRS1, ADRS2, ADRS3中描述,值或者是变量可以分配给参数。
关于ADDRESS-ENDADDRESS控制命令的具体用法以及参数意义请参见SAP online help
示例:
/: ADDRESS
/: TITLE 'Firma'
/: NAME 'Schneider & Co', 'Finanzberatung'
/: STREET 'Kapitalgasse 33'
/: POBOX '12345' CODE '68499'
/: POSTCODE '68309'
/: CITY 'Mannheim'
/: COUNTRY 'DE'
/: FROMCOUNTRY 'DE'
/: ENDADDRESS
输出为:
Firma
Schneider & Co
Finanzberatung
Postfach 12345
68499 Mannheim
2.2.13在main window中设置Header Text:TOP
为了能够总是在main window的顶部打印指定的文本行,可以使用TOP/ENDTOP命令。通过这个命令,文本行总是作为main window中的Header Text。
语法:
/: TOP
:
:
/: ENDTOP
这样,main window中总是以TOP/ENDTOP中的文本行作为开始。
为了禁止Header Text,可以使用不带任何文本的TOP/ENDTOP命令,就象这样:
/: TOP
/: ENDTOP
注意:
如果main window已经包含了一些输出,那么新指定的Header Text仅对后续的页起作用;
对于Header Text的删除,同上
2.2.14在main window中设置Footer Text:BOTTOM
和在main window指定Header Text一样,也可以在main window中指定Footer Text,Footer Text总是在main window的底部打印。
语法:
/: BOTTOM
:
:
/: ENDBOTTOM
同样的,为了禁止Header Text,可以使用不带任何文本的BOTTOM/ENDBOTTOM命令,就象这样:
/: BOTTOM
/: END BOTTOM
可以用IF命令来控制只有当满足一定条件的时候,才打印相应的文本行。
语法1:
/: IF condition
:
:
/: ENDIF
语法2:
/: IF condition
:
/:ELSEIF condition
:
/:ELSE
/: ENDIF
语法3:
/: IF condition
:
/:ELSE
:
/: ENDIF
CASE控制命令相当于多个IF命令,用来控制当满足相应条件的时候,打印相应的文本行。
语法:
/: CASE symbol
/: WHEN value1
:
/: WHEN value2
:
/: WHEN valuen
:
/: WHEN OTHERS.
:
/: ENDCASE
注意:1)CASE语句必须以ENDCASE结束
2)WHEN OTHERS是可选的
可以使用PERFORM命令调用ABAP子程序(FORM),可以这种调用来进行计算、从数据库中获取需要显示和打印的数据,格式化数据等等。
PERFORM和其他控制命令一样,当文档需要显示和打印而被格式化的时候执行。通过在子程序中设置symbol变量的值来完成子程序和文档之间的通讯。
语法:
/: PERFORM <form> IN PROGRAM <prog>
/: USING &INVAR1&
/: USING &INVAR2&
......
/: CHANGING &OUTVAR1&
/: CHANGING &OUTVAR2&
......
/: ENDPERFORM
这里INVAR1 和INVAR2可以是SAPscript四种Symbol类型之一;
OUTVAR1和OUTVAR2是本地symbol,因此必须是字符串型。
这里调用的ABAP中的子程序必须象下面这样定义:
FORM <form> TABLES IN_TAB STRUCTURE ITCSY
OUT_TAB STRUCTURE ITCSY.
...
ENDFORM.
示例:
在SAPscript from中,调用了ABAP程序QCJPERFO中的子程序GET_BARCODE。
SAPscript form 中的定义:
/: PERFORM GET_BARCODE IN PROGRAM QCJPERFO
/: USING &PAGE&
/: USING &NEXTPAGE&
/: CHANGING &BARCODE&
/: ENDPERFORM
/
/ &BARCODE&
ABAP 程序中的子程序定义:
REPORT QCJPERFO.
FORM GET_BARCODE TABLES IN_PAR STUCTURE ITCSY
OUT_PAR STRUCTURE ITCSY.
DATA: PAGNUM LIKE SY-TABIX, "page number
NEXTPAGE LIKE SY-TABIX. "number of next page.
READ TABLE IN_PAR WITH KEY ‘PAGE’.
CHECK SY-SUBRC = 0.
PAGNUM = IN_PAR-VALUE.
READ TABLE IN_PAR WITH KEY ‘NEXTPAGE’.
CHECK SY-SUBRC = 0.
NEXTPAGE = IN_PAR-VALUE.
READ TABLE IN_PAR WITH KEY ‘BARCODE’.
CHECK SY-SUBRC = 0.
IF PAGNUM = 1.
OUT_PAR-VALUE = ‘|’. "First page
ELSE.
OUT_PAR-VALUE = ‘||’. "Next page
ENDIF.
IF NEXTPAGE = 0.
OUT_PAR-VALUE+2 = ‘L’. "Flag: last page
ENDIF.
MODIFY OUT_PAR INDEX SY-TABIX.
ENDFORM.
SUMMING控制命令用来合计值。该命令仅能定义一次。
语法:
/: SUMMING program_symbol INTO total_symbol
注意:SAPscript不能够动态创建合计字段,program_symbol必须定义在调用程序的TABLES结构中。