ABAP 内表操作备忘 刘欣

这篇博客详细介绍了ABAP中内表的定义和操作,包括2步法和3步法定义内表,内表的删除、修改、附加、汇总等常见操作,并给出了具体的代码示例。此外,还涉及到了RANGE表的使用和字符串截取等知识点。

关于ABAP  内表操作备忘,博主会把平时使用的例句,都统统记录到这个文档里:

"--------定义内表(2步法)-----------

"定义结构体
TYPES: BEGIN OF ty_flight,
         airline_id       TYPE i,
         airline_name(20) TYPE c,
         flight_number    TYPE i,
       END OF ty_flight.

"定义内表
DATA gt_flight TYPE  TABLE OF ty_flight.

"--------定义内表3步法------------

"1、定义结构体
TYPES: BEGIN OF ty_tank,
         airline_id       TYPE i,
         airline_name(20) TYPE c,
         flight_number    TYPE i,
       END OF ty_tank.

"2、依照结构体,定义标准表,(定义不唯一的默认主键 airline_id)
TYPES ty_tab_tank TYPE STANDARD TABLE OF ty_tank WITH NON-UNIQUE KEY airline_id.

"3、依照结构体类型,定义内表
DATA gt_tank TYPE ty_tab_tank.


"--------定义一行结构体------------

"定义结构体
TYPES: BEGIN OF ty_shop,
         airline_id       TYPE i,
         airline_name(20) TYPE c,
         flight_number    TYPE i,
       END OF ty_shop.

"一行结构体变量
DATA gs_shop TYPE ty_shop.

"--------内表删除(循环中删除满足条件的一行自己)------------

  loop at gt_log into data(gs_log).

      "内表删除这一行,这里不能调用RFC,否在SY-TABIX会改变为1
      DELETE  gt_log INDEX  SY-TABIX.

      "内表删除这一行,这个方法更好
      DELETE  gt_log .
  endloop.

"--------内表修改(循环中修改满足条件的一行里的字段)------------

LOOP AT gt_excel ASSIGNING FIELD-SYMBOL(<fs>).
           
        满足条件: <fs>-pichi = '1111'.
ENDLOOP.

变量再次使用:
LOOP AT gt_excel ASSIGNING <fs>.

            <fs>-pichi = '2222'.
ENDLOOP.

"-------内表附加(需要建一个临时表,添加全部数据到临时表)-----------

APPEND LINES OF GT_temp to GT_TABLE.

"--------内表修改(循环中增加了其它内表的行数)------------

      LOOP AT gt_JH1 INTO gs_JH1.

        READ TABLE gt_XJDCKC WITH  KEY MATNR = gs_JH1-MATNR INTO  DATA(gs_XJDCKC).

              IF sy-subrc <> 0.

                    wa_XJDCKC-QCKCSL = 0.
                    wa_XJDCKC-THSL = 0.
                    wa_XJDCKC-MATNR = gs_JH1-MATNR.
                    wa_XJDCKC-JHSL = gs_JH1-JHSL.

                    APPEND  wa_XJDCKC TO  gt_XJDCKC .

            ENDIF.

      ENDLOOP.

"--------内表汇总(汇总逻辑261为正,262为负数,最后汇总数量)------------

 LOOP AT GT29 ASSIGNING FIELD-SYMBOL(<fs29>) .

          IF <fs29>-BWART = '262'.
              <fs29>-BWART = 261.
              <fs29>-ERFMG = <fs29>-ERFMG * -1.
          ENDIF.

          COLLECT <fs29> INTO GTCOLLECT.
        ENDLOOP.

"--------RANGE表和结构-------

-----------RANGE变量直接定义------------
DATA R_TEST TYPE RANGE OF CAUFV-AUFNR WITH HEADER LINE.
----------------------------------------
创建一个选择表,For 后面字段必须为参考表的字段,不能使用 Data Element 来定义.
RANGES R_TEST FOR dobj [OCCURS n] 


(1/2)定义一个RANGE变量:
DATA s_matnr TYPE RANGE OF PPC_MAT-MATNR.

(2/2)定义一行RANGE变量:
data   rs_matnr like line of s_matnr.


在RANGE中新增数据行:
LOOP AT GT_JH1 INTO DATA(GS162).

    if GS162-sobkz is initial.
         rs_matnr-sign   = 'I'.  rs_matnr-option = 'EQ'.  rs_matnr-low = GS162-matnr.
         append rs_matnr to s_matnr.
     endif.
ENDLOOP.


将选择表转换为 Range,因为如果选择表的LOW和HIGH字段一致,可以直接转:
APPEND LINES OF s_werks TO range_werks.

"--------从右边截取字符-------

DATA GV(12) TYPE C VALUE '12345678acbd'.

write: gv+8(4).

显示输出  abcd

"--------read table 多行,取最大或最小的一行-------

很多时候,小表中有多行,我们只取其中一行,需要先排序一下

DATA gt_all TYPE  TABLE OF ztlight_ads .
  DATA gs_all TYPE ztlight_ads.

  SELECT * INTO TABLE gt_all FROM ztlight_ads ORDER BY ZID DESCENDING.  "把台账全部抓出来,ID大的先抓


  SORT gt_all by ZID DESCENDING.

  LOOP AT gt_input ASSIGNING FIELD-SYMBOL(<input>).



    READ TABLE gt_all  WITH  KEY ZSPNUMBER = <input>-Z2   VIN = <input>-Z4  ZFPTYPE = <input>-Z7   TTNAME =  <input>-Z8 ZEMAIL =  <input>-Z15   INTO gs_all.  " ZFPTYPE = <input>-Z7

         IF sy-subrc = 0.

              <input>-Z3 = gs_all-ZFPNUMBER  &&  ',订单号、VIN、开票类型、单位名称、邮箱与台账相同'.

              CONTINUE.
         ELSE.


              READ TABLE gt_all WITH  KEY ZSPNUMBER = <input>-Z2    INTO gs_all.

                 IF sy-subrc = 0.

                      <input>-Z3 = gs_all-ZFPNUMBER  && ',订单号与台账相同'.

                  ENDIF.

                CONTINUE.


         ENDIF.






  ENDLOOP.

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

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

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

打赏作者

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

抵扣说明:

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

余额充值