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





