ABAP:RANGE TABLE 语法取值示例

22 篇文章 2 订阅
7 篇文章 0 订阅

很多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.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Idan Lian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值