很多range table 以数据库表的形式存在数据库中 ,那么如何把它转换为range table,供我们取值呢?
首先介绍下基本组成:
选择表是一个带表头行的内表。它的行结构是字段字符串,由四个组件构成,即SIGN、OPTION、LOW和HIGH。每个选择表行表示数据选择的条件:
Ø SIGN :SIGN的数据类型是C,长度为1。SIGN是标志,表示保存在OPTION中的运算符是否需要翻转。允许值是I和E。
ü I表示“包含”(包含标准-运算符不翻转)
ü E表示“排除”(排除标准-运算符翻转)
Ø OPTION:OPTION的数据类型是C,长度为2。OPTION包含选择运算符。如果SIGN包含E,运算符的作用就象它的前面有NOT
ü 如果HIGH是空的,您可以使用EQ、NE、GT、LE、LT、CP和NP。这些运算符在《编程逻辑表达式》中描述。运算符CP和NP没有它们在通常逻辑表达式中所具有的范围。只有当在输入字段中使用了通配符(“*”或“+”)时它们才是有效的。没有定义退出符号。
ü 如果HIGH已被填充,则可以使用BT(位于)和NB(不位于)。这些运算符的功能与BETWEEN和NOT BETWEEN一样)。
Ø LOW:LOW的数据类型与数据库表的列类型相同,该表与选择标准相连接。
ü 如果HIGH为空,LOW的内容定义单值选择。它与OPTION中的运算符相结合,为数据库选择指定了条件。
ü 如果HIGH已填充,LOW和HIGH中的内容为间隔选择指定上界和下界。与OPTION中的运算符相结合,该间隔为数据库选择指定了条件。
Ø HIGH:HIGH的数据类型与数据库表的列类型相同,该表与选择标准相连接。HIGH中的内容为间隔选择指定了上界。与OPTION中的运算符相结合,该间隔为数据库选择指定了条件。
如果选择表包含多行,系统将按下列规则执行数据选择:
Ø 组成在SIGN字段值为I(包含)的行上定义的集合联合。
Ø 去掉在SIGN字段值为E(排除)的行上定义的集合联合。
Ø 选择结果集合。
如果选择表只具有SIGN字段等于E的行,系统将选择这些行所指定的集合之外的所有数据。
以下的例子为已知各个公司的成本中心组,如何取到各公司的成本中心。
"定义成本中心组的range table,定义的语法为 R_XX TYPE RANGE OF 变量,这个变量为之后需要用range table限制取值的的字段,例如这里就是成本中心变量。
DATA:R_COSTELMNT_SPIA TYPE RANGE OF /BI0/OICOSTELMNT,
LS_R_COSTELMNT_SPIA LIKE LINE OF R_COSTELMNT_SPIA,
R_COSTELMNT_NPIA TYPE RANGE OF /BI0/OICOSTELMNT,
LS_R_COSTELMNT_NPIA LIKE LINE OF R_COSTELMNT_NPIA ,
R_COSTELMNT_NES TYPE RANGE OF /BI0/OICOSTELMNT,
LS_R_COSTELMNT_NES LIKE LINE OF R_COSTELMNT_NES,
R_COSTELMNT_AMB TYPE RANGE OF /BI0/OICOSTELMNT,
LS_R_COSTELMNT_AMB LIKE LINE OF R_COSTELMNT_AMB.
首先取出数据库表中的,并放在内表中
SELECT /BIC/ZSETNAME,/BIC/ZSIGN,/BIC/ZOPTION,/BIC/ZVALFROM,/BIC/ZVALTO FROM /BIC/AZCCO_O122
INTO TABLE @DATA(LT_/BIC/AZCCO_O122)
WHERE /BIC/ZSETNAME IN ('PIA_NES','OP_SPIA','NPIA_ASS').
DATA:LS_/BIC/AZCCO_O122 LIKE line of LT_/BIC/AZCCO_O122.
根据关键字段,将上面内表的数据放入不同的range table中
LOOP AT LT_/BIC/AZCCO_O122 INTO LS_/BIC/AZCCO_O122.
IF LS_/BIC/AZCCO_O122-/bic/zsetname = 'PIA_NES'.
LS_R_COSTELMNT_NES-SIGN = LS_/BIC/AZCCO_O122-/bic/zsign.
LS_R_COSTELMNT_NES-option = LS_/BIC/AZCCO_O122-/bic/zoption.
LS_R_COSTELMNT_NES-low = LS_/BIC/AZCCO_O122-/bic/zvalfrom.
LS_R_COSTELMNT_NES-high = LS_/BIC/AZCCO_O122-/bic/zvalto.
append LS_R_COSTELMNT_NES TO R_COSTELMNT_NES.
CLEAR LS_/BIC/AZCCO_O122.
ENDIF.
IF LS_/BIC/AZCCO_O122-/bic/zsetname = 'OP_SPIA'.
LS_R_COSTELMNT_SPIA-SIGN = LS_/BIC/AZCCO_O122-/bic/zsign.
LS_R_COSTELMNT_SPIA-option = LS_/BIC/AZCCO_O122-/bic/zoption.
LS_R_COSTELMNT_SPIA-low = LS_/BIC/AZCCO_O122-/bic/zvalfrom.
LS_R_COSTELMNT_SPIA-high = LS_/BIC/AZCCO_O122-/bic/zvalto.
append LS_R_COSTELMNT_SPIA TO R_COSTELMNT_SPIA.
ENDIF.
IF LS_/BIC/AZCCO_O122-/bic/zsetname = 'NPIA_ASS'.
LS_R_COSTELMNT_NPIA-SIGN = LS_/BIC/AZCCO_O122-/bic/zsign.
LS_R_COSTELMNT_NPIA-option = LS_/BIC/AZCCO_O122-/bic/zoption.
LS_R_COSTELMNT_NPIA-low = LS_/BIC/AZCCO_O122-/bic/zvalfrom.
LS_R_COSTELMNT_NPIA-high = LS_/BIC/AZCCO_O122-/bic/zvalto.
append LS_R_COSTELMNT_NPIA TO R_COSTELMNT_NPIA.
CLEAR LS_/BIC/AZCCO_O122.
ENDIF.
ENDLOOP.
之后range table就可以正常使用了,用来限制取值,这里是限制不同公司成本中心组的成本中心
语法fields in R_XXXX,取值的时候最好加上IS NOT initial的限制,range table 如果为空取值会出现问题
IF source_fields-bukrs = '8100'.
IF SOURCE_FIELDS-kostl IN R_COSTELMNT_NPIA AND R_COSTELMNT_NPIA IS NOT initial.
RESULT = SOURCE_FIELDS-swg.
endif.
ELSEIF source_fields-bukrs = '8200'.
IF SOURCE_FIELDS-kostl IN R_COSTELMNT_SPIA AND R_COSTELMNT_SPIA IS NOT initial.
RESULT = SOURCE_FIELDS-swg.
endif.
ELSEIF source_fields-bukrs = '2100'.
IF SOURCE_FIELDS-kostl IN R_COSTELMNT_NES AND R_COSTELMNT_NES IS NOT initial.
RESULT = SOURCE_FIELDS-swg.
endif.
ENDIF.