一、内表定义
*---------------------------带表头-----------------------------
DATA: BEGIN OF itab OCCURS 0,
matnr LIKE mara-matnr,
werks LIKE marc-werks,
END OF itab .
DATA: otab LIKE TABLE OF itab WITH HEADER LINE.
DATA: BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE ztmm001. "表内包含其他结构或表
DATA: str(10) TYPE c.
DATA: END OF itab.
*---------------------------无表头-----------------------------
DATA: BEGIN OF itab OCCURS 0,
matnr LIKE mara-matnr,
werks LIKE marc-werks,
END OF itab .
TYPES: BEGIN OF gs_alv. "结构
INCLUDE STRUCTURE ztmm001.
TYPES: zterm TYPE dzterm,
sel TYPE c.
TYPES: END OF gs_alv.
二、内表&数据库表操作
*---------------------------Insert----------------------------
INSERT db_table FROM TABLE itab ACCEPTING DUPLICATE KEYS.
INSERT db_table FROM TABLE itab.
INSERT dbtab FROM wa.
INSERT into dbtab values wa.
COMMIT WORK.
INSERT LINES OF itab1 INTO TABLE itab2 INDEX 1.
INSERT sy-index INTO TABLE itab.
INSERT wa INTO itab INDEX n.
*---------------------------Append-----------------------------
APPEND LINES OF itab_temp TO itab. "多行
APPEND LINES OF itab_temp FROM 2 TO 3 TO itab. "多行-指定行
APPEND itab_temp TO itab. "单行
*---------------------------Delete-----------------------------
DELETE FROM ztco33_sr WHERE gjahr = p_gjahr "按条件删除
AND monat IN s_monat.
DELETE ztco33_sr FROM wa.
DELETE ztco33_sr FROM TABLE itab[]. "按主键删除
COMMIT WORK AND WAIT.
LOOP AT gt_item INTO gs_item .
DELETE gtitem[] . "删除内表当前行
ENDLOOP .
DELETE gt_item INDEX 20 . "不建议在loop循环中使用,会影响内表的行索引
DELETE TABLE itab FROM wa. "按主键删除
DELETE itab WHERE matnr NOT IN s_matnr.
SORT itab BY werks matnr.
DELETE ADJACENT DUPLICATES FROM itab COMPARING werks matnr. "删除重复行,保留第一条数据
*---------------------------Modify-----------------------------
MODIFY dbtab FROM wa.
MODIFY dbtab FROM TABLE itab[]. "按主键决定是更新还是插入
COMMIT WORK.
MODIFY itab.
MODIFY itab FROM wa. "内表里修改
MODIFY itab FROM wa INDEX 1. "修改行
MODIFY itab FROM wa TRANSPORTING f1 f2 f3 WHERE f = '1235' . "按工作区某个字段值更新内表
MODIFY TABLE itab FROM wa. "内表Loop外修改(内表必须有主键,按主键修改)
**用指针修改
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE SELXXX eq 'X' .
<fs_alv>-LES_DEL = 'X'. "内表更新
UPDATE ZTSD0010 SET LES_DEL = 'X' WHERE ID = <fs_alv>-ID. "透明表更新
ENDLOOP.
COMMIT WORK AND WAIT.
*---------------------------Update-----------------------------
UPDATE dbtab FROM wa.
UPDATE dbtab FROM TABLE itab[].
UPDATE db_table
SET matnr = t_flag
chgby = sy-uname
WHERE werks = c_value1.
COMMIT WORK.
*---------------------------Read-----------------------------
READ TABLE itab INTO gs_itab WITH KEY matnr = '1001' werks = '1000'.
READ TABLE itab INDEX 1.
**二分法(使用前一定要先排序,二分法查找会反复将查找区间对半划分)
SORT itab BY matnr werks.
READ TABLE itab INTO DATA(gs_itab) WITH KEY matnr = '1001' werks = '1000' BINARY SEARCH.
*---------------------------Collect-----------------------------
SORT itab_temp BY matnr.
LOOP AT itab_temp.
COLLECT itab_temp INTO itab_col.
ENDLOOP.
三、数据库表查询-Select
-------------------------------------获取一笔数据-----------------------------------------
SELECT SINGLE * FROM t001w WHERE werks = itab-werks.
SELECT SINGLE verpr peinh INTO (itab-verpr,itab-peinh)
FROM mbew
WHERE matnr = itab-matnr
AND bwkey = itab-werks
AND ( lfgja < g_lfgja OR ( lfgja = g_lfgja AND lfmon <= g_lfmon ) ) .
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF TABLE itab
FROM ztmm_config.
SELECT
EKPO~NETPR "按数量单位的价格
EKPO~PEINH "数量单位
EKKO~WAERS
EKKO~AEDAT
EKPO~EBELN
EKPO~EBELP
INTO (Z_NETPR,Z_PEINH,Z_WAERS,Z_AEDAT,Z_EBELN,Z_EBELP)
FROM EKPO INNER JOIN EKKO ON EKKO~EBELN = EKPO~EBELN
UP TO 1 ROWS
WHERE EKKO~BUKRS = ZBUKRS
AND EKKO~EKORG = I_TAB1-EKORG
AND EKKO~LIFNR = I_TAB1-LIFNR
AND EKPO~MATNR = I_TAB1-MATNR
AND EKKO~AEDAT >= Z_DATE "当年1月1号
AND EKPO~LOEKZ <> 'X' "删除
AND EKPO~RETPO <> 'X' "退货
ORDER BY EKKO~AEDAT ASCENDING. "获取创建日期最小的一笔
---------------------------------------获取多笔数据---------------------------------------
IF ITAB_TEMP2[] IS NOT INITIAL.
SELECT MBLNR MJAHR ZEILE EBELN EBELP MATNR MENGE BWART
FROM MSEG
INTO CORRESPONDING FIELDS OF TABLE ITAB_MSEG
FOR ALL ENTRIES IN ITAB_TEMP2 "for all entries in ...
WHERE EBELN = ITAB_TEMP2-EBELN
AND EBELP = ITAB_TEMP2-EBELP.
ENDIF.
SELECT werks matnr
INTO CORRESPONDING FIELDS OF TABLE itab
FROM marc
WHERE werks = '1000'.
SELECT werks matnr
INTO CORRESPONDING FIELDS OF itab
FROM marc
WHERE werks = '1000'.
APPEND itab.
CLEAR itab.
ENDSELECT.
SELECT * INTO TABLE it_pl FROM dd07t
WHERE domname = 'ZZBDPL'
AND ddlanguage = 1
AND domvalue_l NOT IN ('C00','C99','C12','C13','C14','C88')
AND domvalue_l NOT LIKE 'CZ%'.
SELECT * INTO TABLE lt_data FROM zthr_swmx "屏幕输入月份 - 1
WHERE zoaid IN s_zoaid
AND gjahr = lv_gjahr
AND monat = lv_monat
AND bukrs IN s_bukrs
AND zbm IN s_zbm
AND ( zrzxz LIKE 'YT%' or zrzxz LIKE 'YL%' )
AND zdflag <> 'D'.
----------------------------------多表连接-----------------------------------------------
SELECT b~matnr a~lifnr b~ebelp b~ebeln
INTO (itab-matnr,itab-lifnr,itab-ebelp,itab-ebeln)
FROM ekko AS a INNER JOIN ekpo AS b ON a~ebeln = b~ebeln
WHERE b~werks IN s_werks
AND b~matnr IN s_matnr
AND a~lifnr IN s_lifnr.
------------------------------------数量汇总---------------------------------------------
SELECT SUM( menge ) SUM( wemng )
INTO (l_menge,l_wemng)
FROM eket
WHERE ebeln = itab-ebeln
AND ebelp = itab-ebelp.
------------------------------------取最大值--------------------------------------------
SELECT MAX( budat ) INTO p_budat "取最后一笔入库的时间
FROM mseg INNER JOIN mkpf ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr
WHERE mseg~matnr = itab-matnr
AND mseg~werks = p_werks
AND mseg~lifnr <> ''
AND mseg~bwart IN ('103','105').
--------------------------------------Range---------------------------------------------
RANGES: p_auart FOR aufk-auart.
SELECT value INTO p_auart-low
FROM ztmm_config
WHERE werks IN i_werks
AND catgy = 'ZMMR013_01'.
p_auart-sign = 'I'.
p_auart-option = 'EQ'.
APPEND p_auart.
CLEAR p_auart.
ENDSELECT.
四、字符串处理
CONCATENATE year1 month1 day1 INTO p_date1 SEPARATED BY '/'. "拼接
SEARCH p_string FOR x. "查找字符
CONDENSE p_string NO-GAPS. "去空格
REPLACE 'ST' WITH 'PC' INTO p_string. "用PC替换ST
SPLIT c1 AT c2 INTO c3 c4 c5 c6. "分割字符串
SPLIT p_name AT '/' INTO name1 name2. "分割字符串
p_len = STRLEN( p_name ). "获取字符串长度
SHIFT p_name BY 35 PLACES LEFT. "去掉字符串的前n个位置的字符(LEFT:从左边截断;RIGHT:从右边截断)
SHIFT p_name UP TO 'S' LEFT. "去掉字符串中在字母S左边之前的字符
TRANSLATE p_name TO UPPER CASE. "转换成大写
TRANSLATE p_name TO LOWER CASE. "转换成小写
五、指针
-----------------------------------语法-------------------------------------------
*分配某个变量给指针
ASSIGN var TO <fs>.
*分配结构中的某个字段的地址给指针
ASSIGN COMPONENT pos OF STRUCTURE struc TO <fs>.
*分配整个内表行给指针(指针必须定义为有栏位结构的类型)
READ TABLE itab INDEX/WITH KEY .. ASSIGNING <fs>.
LOOP AT itab
ASSIGNING <fs>.
ENDLOOP.
*分配类的方法或接口给指针
ASSIGN dref->* TO <fs>.
--------------------------------用指针修改内表字段的值--------------------------------
FIELD-SYMBOLS <FA1> TYPE ANY. "定义指针
DATA: Z_FIELD1 TYPE STRING.
LOOP AT GT_OUT.
READ TABLE LT_OUT INTO LS_OUT WITH KEY ZTYPE = GT_OUT-ZTYPE ZXH = GT_OUT-ZXH.
IF SY-SUBRC = 0.
CONCATENATE 'LS_OUT-ZJE' Z_MON INTO Z_FIELD1.
ASSIGN (Z_FIELD1) TO <FA1>.
IF SY-SUBRC = 0.
<FA1> = GT_OUT-ZJE. "金额
ENDIF.
MODIFY LT_OUT FROM LS_OUT INDEX GT_OUT-ZXH.
ENDIF.
ENDLOOP.
-------------------------------用指针修改屏幕字段的值---------------------------------
FIELD-SYMBOLS: <FS> TYPE ANY. "定义指针
DATA: LV_FIELD TYPE STRING.
DATA: Z_ISM04 TYPE I VALUE 10.
LV_FIELD = '(SAPLXCOF)AFRUD_IMP-ISM04'. "字段名称
ASSIGN (LV_FIELD) TO <FS>.
IF <FS> IS ASSIGNED.
<FS> = Z_ISM04. "给指针赋值,修改屏幕字段值
ENDIF.
持续更新~~