SAP-ABAP 语法-内表&数据库表操作

一、内表定义

*---------------------------带表头-----------------------------
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' . "按工作区某个字段值更新内表

*---------------------------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 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.

持续更新~~

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值