【ABAP学习笔记】

目录

 语法

 常用

MESSAGE 

 定义变量

 结构体变量

 图标与符号

复选框

颜色

 赋值

数据处理

字符串处理

文本元素

内表

SQL

ALV

ALV 练习

模块化编程

子例程

 调用Tcode

宏定义 

选择屏幕

接口


 语法

 常用

*下划线
WRITE : sy-uline.
*空行
SKIP.
*空五行
SKIP 5.
*断点
BREAK-POINT
*线条
ULINE.
*空串
WRITE: SPACE ,'fly'.

MESSAGE 

*MESSAGE '弹窗红STOP' TYPE 'A' .
*MESSAGE '下标红' TYPE 'E' .
*MESSAGE '信息' TYPE 'I' .
*MESSAGE '红色' TYPE 'W' .
*MESSAGE '绿色√' TYPE 'S' .

分支

REPORT zmm_test_c10089213_2 MESSAGE-ID zfi001.

* 没有满足条件的数据,提示信息并终止程序
  IF lt_items IS INITIAL.
    MESSAGE s001 WITH '银行科目交易明细记录' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

 定义变量

数据类型 默认长度 有效长度 默认值 解释说明
I 4 4 0 整型
F 8 8 0 浮点型
P 8 1~16 0 压缩数类型(将两个十进制数字压缩到一个字节)
C 1 1~65535 '...' 文本型
D 8 8 '00000000' 日期型(YYYYMMDD)
N 1 1~65535 '0...0' 数字字符串类型(0~9之间的字符组成的数字字符串)
T 6 6 '000000' 时间类型(格式:HHMMSS)
STRING 0 ANY SPACE 字符串类型

*定义变量,查看初始值*
DATA lv_c TYPE c.
DATA lv_d TYPE d.
DATA lv_f TYPE f.
DATA lv_i TYPE i.
DATA lv_n TYPE n.
DATA lv_p TYPE p.
DATA lv_t TYPE t.

WRITE :
/ 'LV_C : ' , lv_c,
/ 'LV_D : ' , lv_d,
/ 'LV_F : ' , lv_f,
/ 'LV_I : ' , lv_i,
/ 'LV_N : ' , lv_n,
/ 'LV_P : ' , lv_p,
/ 'LV_T : ' , lv_t.
*定义变量给定初始值*
DATA lv_c1(10) TYPE c VALUE 'ABCDEFG123'.
DATA lv_d1 TYPE d VALUE '20230513'.
DATA lv_f1 TYPE f VALUE '6000.99'.
DATA lv_i1 TYPE i VALUE 65536.
DATA lv_n1(5) TYPE n VALUE 65536.
DATA lv_p1 TYPE p VALUE '65536.99' DECIMALS 2.
DATA lv_t1 TYPE t VALUE '202020' .

*WRITE [/] [] [()]*
*/:换行
*pos:屏幕X轴坐标
*(len):显示输出的长度

WRITE :
/6'LV_C1 : ' , (5)lv_c1,
/ 'LV_D1 : ' ,20  lv_d1,
/ 'LV_F1 : ' , lv_f1,
/ 'LV_I1 : ' , lv_i1,
/ 'LV_N1 : ' , lv_n1,
/ 'LV_P1 : ' , lv_p1,
/ 'LV_T1 : ' , lv_t1.
*时间与日期*

DATA lv_d2 TYPE d .            "定义了日期型的变量
lv_d2 = sy-datum.              "sy-datum 可以获取系统今天的日期
lv_d2 = lv_d2 + 30 .          "日期可以做加法
WRITE : / 'LV_D2 : ' , lv_d2.  

DATA lv_t2 TYPE t .            "定义了时间
lv_t2 = sy-uzeit.              "sy-uzeit 可以获取系统现在的时间
WRITE : / 'LV_T2 : ' , lv_t2.
*定义数据元素后再定义变量*

*数据元素*
TYPES ty_bu_partner(10) TYPE c.          "业务伙伴  十个长度的文本
TYPES ty_bu_partner2 TYPE bu_partner.    "按照SE11里的数据元素定义
TYPES ty_bu_partner3 TYPE ty_bu_partner. "按照定义过的类型定义

TYPES : ty_bu_partner4(10) TYPE c,       "学会使用冒号定义
        ty_bu_partner5     TYPE bu_partner,
        ty_bu_partner6     TYPE ty_bu_partner.

*按照自定义的类型定义变量*
DATA : lv_partner    TYPE ty_bu_partner,
       lv_partner2   TYPE ty_bu_partner2,
       lv_partner3   TYPE ty_bu_partner3.

lv_partner = 'fly'. "只有变量可以赋值,数据元素不可赋值
WRITE : / 'lv_partner :',lv_partner.

 结构体变量

*自定义数据结构*
TYPES : BEGIN OF ty_partnerif, "业务伙伴信息
          name(10) TYPE c,
          age(2)   TYPE i,
          tel(11)  TYPE n,
        END OF ty_partnerif.

*定义结构后再定义了结构体变量
DATA lv_partnerinf TYPE ty_partnerif.

lv_partnerinf-name = 'fly'.
lv_partnerinf-age = 30.
lv_partnerinf-tel ='1234567890'.

WRITE :
/ 'lv_partnerinf' ,
/ 'lv_partnerinf-NAME : ', lv_partnerinf-name,
/ 'lv_partnerinf-AGE :',lv_partnerinf-age ,
/ 'lv_partnerinf-tel :',lv_partnerinf-tel.


*直接定义结构体变量*
DATA : BEGIN OF ls_partnerinf, "业务伙伴信息
         name(10) TYPE c,
         age(2)   TYPE i,
         tel(11)  TYPE n,
       END OF ls_partnerinf.

*结构体变量赋值
ls_partnerinf = lv_partnerinf .

WRITE :
/ 'ls_partnerinf',
/ 'ls_partnerinf-NAME : ', ls_partnerinf-name,
/ 'ls_partnerinf-AGE :',ls_partnerinf-age ,
/ 'ls_partnerinf-tel :',ls_partnerinf-tel.


*结构体变量继承* STRUCTURE 用于SE11定义的结构体,如果是临时的要用Tpye
DATA : BEGIN OF ls_customer.
         INCLUDE STRUCTURE ls_partnerinf.
         DATA:  address(40) TYPE c,
       END OF ls_customer.

*有差异的结构体,可使用MOVE-CORRESSPONDING 匹配及赋值相同的字段*
MOVE-CORRESPONDING ls_partnerinf TO ls_customer.

ls_customer-address = '金山区'.

WRITE :
/ 'ls_customer:',
/ 'ls_customer-NAME :',ls_customer-name,
/ 'ls_customer-AGE :',ls_customer-age,
/ 'ls_customer-tel :',ls_customer-tel,
/ 'ls_customer-address :',ls_customer-address.
DATA:ls_tmp1 TYPE sbook.
DATA:ls_tmp2 TYPE sbook.
DATA:ls_tmp3 TYPE sbook.
SELECT SINGLE * FROM sflight INTO @DATA(ls_data) WHERE carrid = 'AA'.

ls_tmp1-bookid   = '99999999'.
ls_tmp1-customid = '88888888'.
ls_tmp1-fldate   = '20210101'.

ls_tmp2-bookid   = '99999999'.
ls_tmp2-customid = '88888888'.
ls_tmp2-fldate   = '20210101'.

ls_tmp3-bookid   = '99999999'.
ls_tmp3-customid = '88888888'.
ls_tmp3-fldate   = '20210101'.

ls_tmp1 = CORRESPONDING #(  BASE ( ls_tmp1 ) ls_data ). "ls_data 转换成ls_tmp1,没有的还是原值
ls_tmp2 = CORRESPONDING #( ls_data ).  "不指定BASE 初始值会丢失,ls_data 转换成ls_tmp2,没有的默认是初始值
MOVE-CORRESPONDING ls_data TO ls_tmp3. "结构体继承,没有的还是原值

cl_demo_output=>write( ls_tmp1 ).
cl_demo_output=>write( ls_tmp2 ).
cl_demo_output=>write( ls_tmp3 ).
cl_demo_output=>write( ls_data ).
cl_demo_output=>display( ).

 图标与符号

*输出图标和符号(在程序开始使用include)*
WRITE : / 'Phone Symbol:' ,sym_phone AS SYMBOL.
WRITE : / 'Alarm Icon :' ,icon_alarm AS ICON.

复选框

*复选框控件*
DATA : flag1 VALUE '', 
       flag2 VALUE 'X'.

WRITE : / 'CHCECK FLAG 1: ',flag1 AS CHECKBOX. "表示空
WRITE : / 'CHCECK FLAG 2: ',flag2 AS CHECKBOX. "表示勾选

颜色

*颜色输出
DATA col TYPE i VALUE 0.
DO 8 TIMES.
  col = sy-index - 1.
  FORMAT COLOR = col. "使用颜色
  WRITE: / col COLOR OFF,
  'INTENSIFIED ON' INTENSIFIED ON, "背景颜色 加强
  'INTENSIFIED OFF' INTENSIFIED OFF, "背景颜色 不加强
  'INVERSE ON' INVERSE ON, "字体颜色
  'INVERSE OFF' INVERSE OFF. "字体颜色
ENDDO.

 赋值

*MOVE  TO 
*用MOVE进行文本赋值
DATA : m_gendle(4) TYPE c.
MOVE 'male' TO m_gendle.
WRITE : m_gendle.


*WRITE  TO . 带有格式的赋值*
DATA : name(20)   VALUE 'SOURCE',
       source(10) VALUE 'LILY',
       target(10).

WRITE (name) TO target.
WRITE / target.
*指针对象,通过语句FIELD-SYMBOLS加上括号“<>”来定义
"FIELD-SYMBOLS .
"ASSIGN  TO .
"可以不指定变量,存放的是变量的地址,而非变量本身。
"如果修改了FIELD SYMBOL的值,则相应的变量的值也会随之更改
FIELD-SYMBOLS  TYPE any .
DATA : lv_data1 TYPE char10 VALUE 'ABCDE',
       lv_data2 TYPE int2 VALUE 10.
ASSIGN   lv_data2 TO .
WRITE : / ' :',  .
IF  IS ASSIGNED.
   = 8.
ENDIF.
WRITE :/ ' lv_data2:', lv_data2.

数据处理

*在不同类型的数据对象之间赋值,会自动进行类型的转换
*转换过程遵照固定的规则,如果c类型数据赋值给N类型,只有数字字符被传递,其他忽略
*C类型不能直接赋值给I,需要C>>N>>I
*可以使用MOVE to 或WRITE TO语句
DATA : lv_data1 TYPE char5 VALUE '12345',
       lv_data2 TYPE int2 VALUE 10,
       lv_data3(5) TYPE n VALUE 6.
lv_data3 = lv_data1.
lv_data2 = lv_data3.
WRITE : / 'lv_data1' , lv_data1.
WRITE : / 'lv_data2' , lv_data2.
*算术运算符
*整除     DIV 
*除余     MOD

*比较逻辑运算符
*等于     EQ
*不等于   NE <>  ><
*小于     LT
*小于等于 LE
*大于     GT
*大于等于 GE

*算术运算函数
*ABS 返回绝对值
*SIGN 正数返回1,0返回0,负数返回-1
*TRUNC 返回整数 
*FRAC 返回小数部分
*STRLEN 返回字符串长度

字符串处理

*截取(偏移量)
DATA: f1(10) VALUE 'ABCDEFGHIJ',
      f2(5).
f2 = f1+3(5). "左数第三个开始截取,取五个字段
WRITE: f1 ,/ f2.


DATA: f3(10) VALUE 'ABCDEFGHIJ',
      f4(10).
f4 = f3+3(*). "左数第三个开始截取,取所有
WRITE: f3 ,/ f4.
*字符串移位
DATA lv_string1 TYPE string.
lv_string1 = 'ABCDEFGHIJKLMN'.
WRITE : / , 'lv_string1:', lv_string1 .
SHIFT lv_string1 BY 3 PLACES LEFT."左移动3
WRITE : / , 'lv_string1:', lv_string1 .
SHIFT lv_string1 BY 3 PLACES RIGHT."右移动3
WRITE : / , 'lv_string1:', lv_string1 .
SHIFT lv_string1 UP TO 'eF'."指定字串移动
WRITE : / , 'lv_string1:', lv_string1 .
WRITE : SY-SUBRC. "成功是0,不成功是4
SHIFT lv_string1 LEFT DELETING LEADING space. "移除左边是空白
WRITE : / , 'lv_string1:', lv_string1 .
SHIFT lv_string1 LEFT DELETING LEADING 'D'. "移除左边是空白
WRITE : / , 'lv_string1:', lv_string1 .
SHIFT lv_string1 RIGHT DELETING TRAILING 'LMN'. "移除左边是空白
WRITE : / , 'lv_string1:', lv_string1 .
*替换
*'ABCDEFG' 中的 'ABC' 替换成 '123' ,结果是'123DEFG'
DATA : lv_aaa(40) TYPE c.
lv_aaa = 'ABCDEFG'.
REPLACE  'ABC' WITH '123' INTO lv_aaa.
WRITE :/ ' lv_aaa:' , lv_aaa.
*字符串转换大小写
DATA city(9) TYPE c VALUE 'DongGuan'.
TRANSLATE city to UPPER CASE. "大写
WRITE : / 'city:', city.
TRANSLATE city to LOWER  CASE. "小写
WRITE : / 'city:', city.
*查找字符串
"SEARCH 查找成功sy-subrc是0,不成功是4
"sy-fdpos 返回值是0可能代表查找的字符在第一个位置,也可能是找不到
"SEARCH 不仅可以查字符串,也可以查内表,但内表不常用
*如果查询的字串里有特殊符号,如“*”、“@”、“.”,要用句号修饰,如'.*.'
DATA lv_string(10) TYPE c VALUE 'EF* ABCD123'.
SEARCH lv_string FOR   'ABCD'.
WRITE : / sy-subrc ,sy-fdpos.
SEARCH lv_string FOR   'E'.
WRITE : / sy-subrc ,sy-fdpos.
SEARCH lv_string FOR   '1'.
WRITE : / sy-subrc ,sy-fdpos.
"ABBREVIATED 按照单词搜索,空白隔开的字符串第一个匹配
SEARCH lv_string FOR   'AC' ABBREVIATED.
WRITE : / sy-subrc ,sy-fdpos.
"STARTING AT 从n(1开始编号)开始查找,相当于截取n(包括n)右边的字串查找
SEARCH lv_string FOR   'A' STARTING AT 3.
WRITE : / sy-subrc ,sy-fdpos.
"ENDING AT 从n(1开始编号)截止查找,相当于截取n(包括n)左边的字串查找
SEARCH lv_string FOR   'A' ENDING AT 5.
WRITE : / sy-subrc ,sy-fdpos.
*字符串合并
"拼接
DATA: a TYPE c VALUE 'a',
      b TYPE c VALUE 'b',
      c TYPE c VALUE 'c',
      d(10) TYPE c.

CONCATENATE a b c INTO  d .
WRITE : / d.
CONCATENATE a b c INTO  d SEPARATED BY space.
WRITE : / d.

文本元素

【ABAP学习笔记】_第1张图片

【ABAP学习笔记】_第2张图片

WRITE  / TEXT-001.

内表

*-------------定义内表-------------*
*自定义类型的内表
TYPES : BEGIN OF ty_itab1, "结构类型
          field1 TYPE char10,
          field2 TYPE int2,
        END OF ty_itab1.
TYPES : t_itab1 TYPE ty_itab1 OCCURS 0 , "表类型
        t_itab2 TYPE TABLE OF ty_itab1.
DATA : itab1 TYPE TABLE OF ty_itab1, "内表
       itab2 TYPE t_itab1,
       itab3 TYPE t_itab2. "TYPE 后是表类型或结构
*直接定义
DATA : BEGIN OF itab4 OCCURS 0, "定义了内表,同时定义了同名工作区
         field1 TYPE char10,
         field2 TYPE int2,
       END OF itab4 .
*参考定义
DATA : itab5 LIKE itab, "Like 后是内表 "参考已定义的内表
       itab6 TYPE TABLE OF sflight, "参考数据库表定义内表
       itab7 TYPE TABLE OF zsewm0003_item, "参考结构定义内表
       itab8 TYPE STANDARD TABLE OF sflight. "STANDARD 可以省略
*排序表,哈希表
DATA: itab9  TYPE SORTED TABLE OF ty_itab1 WITH UNIQUE KEY field1,
      itab10 TYPE HASHED TABLE OF sflight WITH UNIQUE KEY carrid.
"定义工作区
DATA ls_itab1 TYPE ty_itab1.

*----------内表处理----------------*
"初始化
CLEAR itab1. "不能清空带表头的内表
REFRESH itab1.
"添加条目到标准表
ls_itab1-field1 = '0001' .
ls_itab1-field2 = 0001 .
INSERT ls_itab1 INTO itab1 INDEX 1. "插入
APPEND ls_itab1 TO itab1. "添加
COLLECT ls_itab1 INTO itab1. "关键字为非数字字段,数字字段求和
"添加条目到排序表
INSERT ls_itab1 INTO itab9 INDEX 1.
"APPEND ls_itab1 TO itab9. "再次添加到排序表会报错
COLLECT ls_itab1 INTO itab9. "
"添加一个内表到另一个内表
APPEND LINES OF itab1 TO itab2.
APPEND LINES OF itab1 TO itab2.
APPEND LINES OF itab2 FROM 2 TO 3 TO itab2.
INSERT LINES OF itab1 INTO itab2 INDEX 2.
"更新 + 定位行
MODIFY itab2 FROM ls_itab1 INDEX 2.
ls_itab1-field1 = '0002' .
MODIFY itab2 FROM ls_itab1 INDEX 5 TRANSPORTING field1. "指定字段更新
ls_itab1-field2 = 4 .
MODIFY itab2 FROM ls_itab1 TRANSPORTING field2 WHERE field2 = 2.
"删除
DELETE TABLE itab2 FROM ls_itab1. "按照工作区删除,必须所有字段都匹配
DELETE itab2 WHERE field1 = '0002' . "可以用AND链接条件,但是不能用OR
DELETE itab2 INDEX 1.
"排序后删除重复条目
SORT itab2 BY field1.
"DELETE ADJACENT DUPLICATES FROM itab2. "内表的主键默认是文本
SORT itab2 BY field1 field2.
DELETE ADJACENT DUPLICATES FROM itab2 COMPARING ALL FIELDS. "匹配所有字段删除重复值
DELETE ADJACENT DUPLICATES FROM itab2 COMPARING field1 field2. "指定字段删除重复值
"读取
CLEAR ls_itab1. "读取前要清空工作区
READ TABLE itab2 INTO ls_itab1 INDEX 1. "READ 只能读取单条
READ TABLE itab2 INTO ls_itab1 WITH KEY field1 ='0001'.
IF sy-subrc = 0 .
  "如果read读取成功了才执行loop
ENDIF.
LOOP AT itab2 INTO ls_itab1 WHERE field1 = '0001'.
  "WRITE : / ls_itab1-field1 .
ENDLOOP.
"带表头的内表的操作
CLEAR ls_itab1.
ls_itab1-field1 = '0001' .
ls_itab1-field2 = 1.
APPEND ls_itab1 TO itab4.
itab4-field1 = '0002' .
itab4-field2 = 2.
APPEND itab4.

BREAK-POINT.
    "内表的一些注意用法
   
    "IF lt_data IS NOT INITIAL. "内表不是空
    "   FOR ALL ENTRIES IN lt_data. "FOR ALL ENTRIES IN 链接内表
    "ENDIF.

    "WHERE (l_where2) "()里是变量

    "order ... by ...   排序 ,尽量不用

    "sort lt_data DESCENDING by FILED1 FILED2. 排序 "默认升序 ASCENDING    注!!!FILED1一定要在FILED2 之前

    " READ TABLE ty_data INTO wa_data WITH  KEY  vgbel = wa_data-vbeln BINARY SEARCH.  "BINARY SEARCH 二分法,使用前要排序

*定义工作区

DATA a_zmm_test_001 TYPE zmm_test_001.

*定义内表,请注意有HEADER LINE.

DATA ta_zmm_test_001 TYPE TABLE OF zmm_test_001 WITH HEADER LINE.

*分隔线

ULINE.

WRITE / '使用工作区'.

ULINE.

*将数据表逐行转移至工作区,只读首5行

*对于自定义结构(字段少于数据表字段) ,CORRESPONDING FIELDS OF非常重要,*在本例中不使用CORRESPONDING FIELDS OF也是正确的,因为结构完全- -样。

SELECT * INTO CORRESPONDING FIELDS OF a_zmm_test_001 FROM zmm_test_001 UP TO 5 ROWS.

  WRITE:/ a_zmm_test_001-zct_id , a_zmm_test_001-zct_name  . ", A_ZMM_TEST_001-ZCT_COUNTRY

DATA a_spfli TYPE spfli.

*定义内表,请注意有HEADER LINE.

DATA ta_spfli TYPE TABLE OF spfli WITH HEADER LINE.

*分隔线

ULINE.

WRITE / '使用工作区'.

ULINE.

*将数据表逐行转移至工作区,只读首5行

*对于自定义结构(字段少于数据表字段) ,CORRESPONDING FIELDS OF非常重要,*在本例中不使用CORRESPONDING FIELDS OF也是正确的,因为结构完全- -样。

SELECT * INTO CORRESPONDING FIELDS OF a_spfli FROM spfli UP TO 5 ROWS.

  WRITE: / a_spfli-connid , a_spfli-carrid, a_spfli-cityfrom ,

a_spfli-cityto.

ENDSELECT.

ULINE.


WRITE / '使用内表'.

ULINE.

*从数据表读数据至内表,直接从内表输出

*如果TA_ SPFLI没有定义HEADER LINE,会出错

SELECT * INTO CORRESPONDING FIELDS OF

TABLE ta_spfli FROM spfli UP TO 5 ROWS.

LOOP AT ta_spfli.

  WRITE:/ ta_spfli-connid, ta_spfli-carrid ,ta_spfli-cityfrom, ta_spfli-cityto.

ENDLOOP.

ULINE.

WRITE /'将内表数据转移至工作区'.

ULINE.

LOOP AT ta_spfli INTO a_spfli.

  WRITE:/ a_spfli-connid, a_spfli-carrid , a_spfli-cityfrom ,

  a_spfli-cityto.

ENDLOOP.

*DATA 直接定义
DATA gt_zmm_test_001 TYPE TABLE OF zmm_test_001. "参照数据库表ZMM_TEST_001定义内表
DATA gs_zmm_test_001 TYPE zmm_test_001. "参照数据库表ZMM_TEST_001定义工作区
DATA i TYPE i.

*工作区定义后会继承数据库表的结构,只能存储至多一条数据,
i = 1 .
DO 5 TIMES.
  i = i + 1 .
  gs_zmm_test_001-zct_id = i.
  gs_zmm_test_001-zct_name = '北京'.
  gs_zmm_test_001-zct_country = '中国'.
  INSERT  gs_zmm_test_001 INTO gt_zmm_test_001 INDEX 1. "将工作区中数据插入内表中
  APPEND  gs_zmm_test_001 TO gt_zmm_test_001. "将工作区中数据插入内表中

ENDDO.

MODIFY zmm_test_001 FROM TABLE gt_zmm_test_001. "将内表中的数据加到数据库表里
DATA gt_data TYPE TABLE OF a018.
DATA gs_data TYPE a018.

gs_data-matnr ='B001'.
gs_data-ekorg ='LK00'.

INSERT  gs_data INTO gt_data INDEX 1.
APPEND  gs_data TO gt_data.
MODIFY a018 FROM TABLE gt_data.

*DATA 直接定义
DATA gt_ztmm0066_item TYPE TABLE OF ztmm0066_item. "参照数据库表ZMM_TEST_001定义内表
DATA gs_ztmm0066_item TYPE ztmm0066_item. "参照数据库表ZMM_TEST_001定义工作区
DATA i TYPE i.

*工作区定义后会继承数据库表的结构,只能存储至多一条数据,
i = 6 .
DO 5 TIMES.
  i = i + 1 .
  gs_ztmm0066_item-zzgrid = i.
  gs_ztmm0066_item-zzline = i * 2.
  gs_ztmm0066_item-MATNR = 'B001'.
  gs_ztmm0066_item-WRBTR = 44.
  INSERT  gs_ztmm0066_item INTO gt_ztmm0066_item INDEX 1. "将工作区中数据插入内表中
  APPEND  gs_ztmm0066_item TO gt_ztmm0066_item. "将工作区中数据插入内表中

ENDDO.

MODIFY ztmm0066_item FROM TABLE GT_ztmm0066_item. "将内表中的数据加到数据库表里
在SAP中,READ TABLE是一种用于从内部表中读取数据的关键字。它的语法如下:

READ TABLE  WITH KEY  INTO .

其中,是要读取数据的内部表的名称,是用于定位要读取的数据行的字段值,是一个工作区,用于存储读取到的数据行。

使用WITH KEY可以指定一个或多个键字段来定位要读取的数据行。键字段必须与内部表的定义中的键字段相匹配。如果匹配成功,则将该行的数据读取到中。

以下是一个示例:

DATA: lt_data TYPE TABLE OF ty_data,
      ls_data TYPE ty_data.

ls_data-field1 = 'Value1'.
ls_data-field2 = 'Value2'.
APPEND ls_data TO lt_data.

ls_data-field1 = 'Value3'.
ls_data-field2 = 'Value4'.
APPEND ls_data TO lt_data.

READ TABLE lt_data WITH KEY field1 = 'Value3' field2 = 'Value4' INTO ls_data.

在上面的示例中,我们首先定义了一个内部表lt_data和一个与其结构相匹配的工作区ls_data。然后,我们向内部表添加了两行数据。

使用READ TABLE语句,我们使用WITH KEY指定了字段field1和field2来定位要读取的数据行。当字段field1的值为'Value3'且字段field2的值为'Value4'时,读取到的数据行将被存储在工作区ls_data中。

请注意,如果使用READ TABLE的WITH KEY子句定位不到匹配的数据行,则工作区的内容保持不变,即不会被更新。

在SAP ABAP中,READ TABLE语句用于在内部表中查找特定的行。它的基本语法如下:

READ TABLE 
      [WITH KEY ]
      [BINARY SEARCH]
      [INDEX ]
      [TRANSPORTING NO FIELDS]
      [REFERENCE INTO ].

其中, 是要进行查找的内部表名称, 是一个条件表达式,用于指定要查找的行。WITH KEY子句是可选的,它允许您根据指定的键字段查找行。

下面是一些示例说明:

1. 在内部表it_data中查找键字段lv_key的行,并将结果存储在结构lv_result中:

DATA: lv_key TYPE sy-tabix,
      lv_result TYPE wa_data.

lv_key = 10.
READ TABLE it_data WITH KEY field1 = lv_key INTO lv_result.

2. 在内部表it_data中查找键字段lv_key1和lv_key2的行,并将结果存储在结构lv_result中:

DATA: lv_key1 TYPE sy-tabix,
      lv_key2 TYPE sy-tabix,
      lv_result TYPE wa_data.

lv_key1 = 10.
lv_key2 = 20.
READ TABLE it_data WITH KEY field1 = lv_key1 field2 = lv_key2 INTO lv_result.

3. 使用BINARY SEARCH关键字进行二分查找。在内部表it_data中查找键字段lv_key的行:

DATA: lv_key TYPE sy-tabix,
      lv_result TYPE wa_data.

lv_key = 10.
READ TABLE it_data WITH KEY field1 = lv_key BINARY SEARCH INTO lv_result.

4. 使用INDEX子句指定要查找的行的索引位置。在内部表it_data中查找索引为lv_index的行:

DATA: lv_index TYPE sy-tabix,
      lv_result TYPE wa_data.

lv_index = 5.
READ TABLE it_data INDEX lv_index INTO lv_result.

总结来说,READ TABLE语句允许您根据指定的键字段在内部表中查找行。WITH KEY子句用于指定要查找的键字段,BINARY SEARCH关键字可加快搜索速度,INDEX子句用于指定要查找的行的索引位置。根据需求,可以组合使用这些选项来实现灵活的查找操作。

分组循环 

 LOOP GROUP BY 分组循环的使用方法小栗子_寒武青锋的博客-CSDN博客

TYPES: BEGIN OF ty_employee,
         name TYPE char30,
         role TYPE char30,
         age  TYPE i,
         sex  TYPE char10,
       END OF ty_employee,
ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.
       "对内表进行赋值"
DATA(gt_employee) = VALUE ty_employee_t(   
( name = 'John'     role = 'ABAP guru'       age = 34  sex =  'MAN'   )
( name = 'Alice'     role = 'FI Consultant'   age = 42  sex =  'WOMAN'  )
( name = 'Barry'    role = 'ABAP guru'       age = 54   sex =  'WOMAN'  )
( name = 'Mary'     role = 'FI Consultant'   age = 37  sex =  'WOMAN' )
( name = 'Arthur'   role = 'ABAP guru'       age = 34  sex =  'MAN'  )
( name = 'Mandy'   role = 'SD Consultant'     age = 64  sex =  'MAN'  ) ).

DATA: gv_tot_age TYPE i,
      gv_avg_age TYPE decfloat34.
"通过角色进行分组"
LOOP AT gt_employee INTO DATA(ls_employee) GROUP BY ( role  = ls_employee-role
                                           size  = GROUP SIZE  "分组组数"
                                           index = GROUP INDEX ) "分组的组序号"
  ASCENDING    ASSIGNING FIELD-SYMBOL().
  
  CLEAR: gv_tot_age.
  WRITE: / | 组序号: { -index }    角色: { -role WIDTH = 15 }|
              & |     这个组有几条数据: { -size  } |.
   "loop循环组,将组里的数据读出来"           
  LOOP AT GROUP  ASSIGNING FIELD-SYMBOL().
    gv_tot_age = gv_tot_age + -age.
    WRITE: /13 -name .
  ENDLOOP.
  
  gv_avg_age = gv_tot_age / -size.
  WRITE: / |组平均年龄: { gv_avg_age }|.
  SKIP.
ENDLOOP.
  LOOP AT gt_stpov INTO gs_stpov
       GROUP BY ( zmatnr = gs_stpov-zmatnr zwerks = gs_stpov-zwerks dstuf = gs_stpov-dstuf )
                ASCENDING ASSIGNING FIELD-SYMBOL().
    IF lt2_stpov IS NOT INITIAL.
      SORT lt2_stpov BY zmatnr zwerks werks matnr idnrk.
    ENDIF.
    LOOP AT GROUP  ASSIGNING FIELD-SYMBOL().
      wa2_stpov-zmatnr = -zmatnr.          ""查询的物料
      wa2_stpov-zwerks = -zwerks.          ""查询的工厂
      wa2_stpov-werks = -werks.            ""工厂
      wa2_stpov-matnr = -matnr.            ""物料编号
      wa2_stpov-idnrk = -idnrk.            ""BOM组件
      wa2_stpov-erfmg3 = -erfmg3.          ""比例"
      wa2_stpov-erfmg4 = wa2_stpov-erfmg3.          ""关联交易比例
      IF lt2_stpov IS NOT INITIAL.
        READ TABLE lt2_stpov INTO wa1_stpov WITH KEY zmatnr = -zmatnr zwerks = -zwerks werks = -werks  matnr = -idnrk  BINARY SEARCH.
        IF sy-subrc = 0.
          wa2_stpov-erfmg4 = wa1_stpov-erfmg4 * -erfmg3.
        ENDIF.
      ENDIF.
      APPEND wa2_stpov TO lt2_stpov.
      APPEND wa2_stpov TO lt1_stpov.
    ENDLOOP.
    gs_stpov-zmatnr = gs_stpov-zmatnr."用于断点
    CLEAR:wa1_stpov,wa2_stpov,lt2_stpov.
  ENDLOOP.
  CLEAR gs_stpov.

  SORT lt1_stpov BY zmatnr zwerks werks matnr idnrk.
  LOOP AT gt_stpov INTO gs_stpov.
    READ TABLE lt1_stpov INTO wa1_stpov WITH KEY zmatnr = gs_stpov-zmatnr
                                                 zwerks = gs_stpov-zwerks
                                                 werks = gs_stpov-werks
                                                 matnr = gs_stpov-matnr
                                                 idnrk = gs_stpov-idnrk  BINARY SEARCH.
    IF sy-subrc = 0.
      MODIFY gt_stpov FROM wa1_stpov TRANSPORTING erfmg4.
    ENDIF.
  ENDLOOP.
  CLEAR:wa1_stpov,gs_stpov.

SQL

*-----------------SQL取单条数据-----------------*
DATA sitab TYPE TABLE OF spfli WITH HEADER LINE. "sitab是带工作区的内表
SELECT SINGLE  "取单条数据
carrid connid airpfrom airpto "SE11中spfli的其中四个字段,单词拼错会报字段不存在的错误
FROM spfli "来源于SE11中透明表spfli
INTO CORRESPONDING FIELDS OF sitab "根据字段匹配,不写容易出错
WHERE carrid = 'LH' AND connid = '400'.
CHECK sy-subrc = 0.
WRITE:
/ 'sitab-Carrld=',sitab-carrid,
/ 'sitab-Connld=',sitab-connid,
/ 'sitab-Airpfron=', sitab-airpfrom,
/ 'siab-Airpto=',sitab-airpto.
*-----------------SQL取多条数据-----------------*
DATA sitab TYPE TABLE OF spfli WITH HEADER LINE. "sitab是带工作区的内表
SELECT "取数据
carrid connid airpfrom airpto "SE11中spfli的其中四个字段,单词拼错会报字段不存在的错误
FROM spfli "来源于SE11中透明表spfli
INTO CORRESPONDING FIELDS OF TABLE sitab "根据字段匹配,不写容易出错
WHERE carrid = 'LH' .
loop at sitab. "循环,此处内表和工作区同名
WRITE:
/ 'sitab-Carrld=',sitab-carrid,
 'sitab-Connld=',sitab-connid,
 'sitab-Airpfron=', sitab-airpfrom,
 'siab-Airpto=',sitab-airpto.
ENDLOOP.
*------------SELECT + 标准函数  用的较少------------*
*此处相当于在表sbook中,按照connid 进行透视,求了个数、总计、平均
DATA:counts  TYPE i,total TYPE p DECIMALS 2,average TYPE f.
DATA: connid LIKE sbook-connid.
SELECT connid COUNT(*) SUM( luggweight ) AVG( luggweight ) "循环
INTO (connid,counts,total,average) "查询的目标变量
FROM sbook "来源于SE11的透明表
GROUP BY connid. "分组查询,一般比较慢,并不常用
  CHECK sy-subrc = 0. "如果成功则执行
  WRITE:
  / 'SY-DBCNT=',sy-dbcnt, "可以获取当前读取数据的行数
  / 'CONNID=', connid,
  / 'COUNTS=', counts,
  / 'TOTAL=', total,
  / 'AVERAGE=', average.
  CHECK total > 10.
  WRITE: / 'THW SUM WEIGHT MORE THAN 10.'.
  ULINE.
ENDSELECT.
*-----------表连接-----------------*
DATA: BEGIN OF xflight OCCURS 0, "定义内表xflight,用于接收数据
        carrid2  TYPE spfli-carrid,
        airpfrom LIKE spfli-airpfrom,
        airpto   LIKE spfli-airpto,
        deptime  LIKE spfli-deptime,
        fldate   LIKE sflight-fldate,
      END OF xflight.
SELECT a~carrid AS carrid2 a~airpfrom a~airpto  a~deptime b~fldate  "取多张表时要指定表和表字段
* a~carrid as carrid2 可以转换字段
INTO TABLE xflight "CORRESPONDING FIELDS OF 此处可以省略
* INTO CORRESPONDING FIELDS OF TABLE xflight
FROM spfli AS a INNER JOIN sflight AS b "INNER JOIN  查询结果包含两个连接表中彼此相对应的数据记录 "AS 可以重命名表名称
ON a~carrid = b~carrid AND a~connid = b~connid "匹配相同字段
UP TO 5 ROWS "测试的时候可以加些限制,不需要读取太多数据
ORDER BY a~airpfrom a~airpto b~fldate a~deptime. "排序
LOOP AT xflight.
  WRITE: / 'carrid2', xflight-carrid2, 'Airpfrom=', xflight-airpfrom, 'Airpto=', xflight-airpto,'Deptime=' , xflight-deptime , 'Flydate=',xflight-fldate.
ENDLOOP.
*-------------UPDATE 更新---------------*
UPDATE sflight SET currency ='RMB' WHERE carrid ='AA' AND connid = '0017' AND seatsocc_b ='30'.
CHECK sy-subrc = 0 .
WRITE : / '更新成功'.
*---------------INSERT 插入单条--------------
DATA:wa_sfilght TYPE sflight,
     lt_sflight TYPE TABLE OF sflight.
SELECT SINGLE  * FROM sflight INTO wa_sfilght WHERE carrid = 'AA' AND connid = '17' .
wa_sfilght-fldate = sy-datum.
INSERT sflight FROM wa_sfilght.
CHECK sy-subrc = 0 .
WRITE : / '更新成功'.


*---------------INSERT 批量插入,运行第二遍的时候会报错---------------
DATA:wa_data TYPE sflight,
     lt_data TYPE TABLE OF sflight,
     i       TYPE i.
SELECT * FROM sflight INTO TABLE lt_data WHERE carrid = 'AA' AND connid = '64' .

LOOP AT lt_data INTO wa_data .
  i = i + 1 .
  wa_data-fldate = sy-datum + i.
  MODIFY lt_data FROM wa_data INDEX i TRANSPORTING fldate.
ENDLOOP.

INSERT sflight FROM TABLE lt_data.
*---------------APPEND 更新多条--------------
DATA:wa_data TYPE sflight,
     lt_data TYPE TABLE OF sflight.
SELECT SINGLE  * FROM sflight INTO wa_data WHERE carrid = 'AA' AND connid = '17' .
wa_data-fldate = sy-datum.
wa_data-connid = '22'.
APPEND wa_data to lt_data.
wa_data-connid = '23'.
APPEND wa_data to lt_data.
wa_data-connid = '24'.
APPEND wa_data to lt_data.
INSERT sflight FROM TABLE lt_data.
CHECK sy-subrc = 0 .
WRITE : / '内表更新成功'.
*-----------DELETE 删除---------
DELETE FROM sflight WHERE fldate = sy-datum.
*---------------MODIFY 有就修改,没有就新增--------------


*---------------MODIFY 此处仅更新一条数据--------------
DATA:wa_sfilght TYPE sflight,
     1t_sflight TYPE TABLE OF sflight.
SELECT SINGLE  * FROM sflight INTO wa_sfilght WHERE carrid = 'AA' AND connid = '17' .
wa_sfilght-fldate = sy-datum.
wa_sfilght-currency = 'USD'.
MODIFY  sflight FROM wa_sfilght.
CHECK sy-subrc = 0 .
WRITE : / '修改成功'.



*---------------MODIFY 在带表头的内表循环更新数据,效率低下--------------
DATA lt_data TYPE TABLE OF sflight WITH HEADER LINE.
SELECT * FROM sflight INTO TABLE  lt_data WHERE carrid = 'AA' AND connid = '17' .

LOOP AT lt_data.
  lt_data-currency = 'USD'.
  MODIFY  sflight FROM lt_data.
ENDLOOP.


*---------------MODIFY 更新多条数据,相当于UPDATE--------------
DATA:wa_data TYPE sflight,
     lt_data TYPE TABLE OF sflight.
SELECT * FROM sflight INTO TABLE lt_data WHERE carrid = 'AA' AND connid = '17' .
wa_data-currency = 'RMB'.
MODIFY lt_data FROM wa_data TRANSPORTING currency WHERE currency = 'USD'.
MODIFY sflight FROM TABLE lt_data.

"SELECT嵌套
DATA wa_sflight TYPE sflight.

SELECT * FROM sflight INTO wa_sflight
WHERE seatsocc = ( SELECT MAX( seatsocc ) FROM sflight ).
ENDSELECT.
BREAK-POINT.
"分组求和
SELECT a~ebeln,a~ebelp,SUM( CASE shkzg WHEN 'S' THEN a~menge
                                       WHEN 'H' THEN a~menge * -1 END ) AS zkpsl,
                       SUM( CASE shkzg WHEN 'S' THEN wrbtr
                                       WHEN 'H' THEN wrbtr * -1 END ) AS zkpje
      FROM rseg AS a
      INNER JOIN @lt_ekpo AS b ON a~ebeln = b~ebeln AND a~ebelp = b~ebelp
      GROUP BY a~ebeln,a~ebelp
      INTO TABLE @DATA(lt_resg).

"除重
  CLEAR gt_where1.
  SELECT DISTINCT bukrs , gjahr FROM bkpf  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_where1.
"中间表
  DATA: gv_dbs(20) ,
        go_exc_ref    TYPE REF TO cx_sy_native_sql_error,
        gv_error_text TYPE string,
        lv_count      TYPE syst_index.

***************取中间表员工供应商开户行信息
  SELECT SINGLE conntxt
  FROM zdbconn INTO gv_dbs
  WHERE sysname = 'EDSAP'.

SE11

 SE14

 SE11修改的话要去SE14激活

ALV

(95条消息) 【SAP】ALV中fieldcat的字段_Mona_1220的博客-CSDN博客

(95条消息) ALV字段目录lvc_s_fcat_酒剑仙abc的博客-CSDN博客

SE41

进入SE41复制SAPLSALV中STANDARD的GUI状态栏 给自己的程式

【ABAP学习笔记】_第3张图片

【ABAP学习笔记】_第4张图片

 ALV 练习

"测试数据
DATA gt_data TYPE TABLE OF vbak.
DATA gs_data TYPE vbak.

gs_data-vbeln = 'A001'.
gs_data-ERDAT = '20230626'.

APPEND  gs_data TO gt_data.
MODIFY vbak FROM TABLE gt_data.
"测试数据
DATA gt_data TYPE TABLE OF vbap.
DATA gs_data TYPE vbap.

gs_data-vbeln = 'A001'.

APPEND  gs_data TO gt_data.
MODIFY vbap FROM TABLE gt_data.
"要有GUI 状态


*第一步:声明ALV相关变量*
TYPE-POOLS slis.
DATA : lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat
       ls_fieldcat TYPE slis_fieldcat_alv,
       ls_layout   TYPE slis_layout_alv, "ALV格式控制的结构体
       lt_event    TYPE slis_t_event, "事件的内表
       ls_event    TYPE slis_alv_event,
       lt_sort     TYPE slis_t_sortinfo_alv,
       ls_sort     TYPE slis_sortinfo_alv,
       ls_setting  TYPE lvc_s_glay,
       pgm         TYPE sy-repid,
       lv_colpos   TYPE int2,
       logo        TYPE string.


*第二步:定义内表*

TYPES:BEGIN OF ty_alvshow,
        vbeln TYPE vbak-vbeln,
        erdat TYPE vbak-erdat,
        ernam TYPE vbak-ernam,
        kunnr TYPE vbak-kunnr,
        posnr TYPE vbap-posnr,
        matnr TYPE vbap-matnr,
        matkl TYPE vbap-matkl,
        zmeng TYPE vbap-zmeng,
        zieme TYPE vbap-zieme,
        werks TYPE vbap-werks,
        lgort TYPE vbap-lgort,
      END OF ty_alvshow.
DATA: lt_alvshow TYPE TABLE OF ty_alvshow,
      wa_alvshow TYPE ty_alvshow.

*第三步:读取数据*
SELECT
a~vbeln a~erdat a~ernam kunnr
posnr matnr matkl zmeng
zieme werks lgort
FROM vbak AS a INNER JOIN vbap AS b
ON a~vbeln = b~vbeln
INTO TABLE lt_alvshow
UP TO 100 ROWS.


*第四步:ALV格式控制*
ls_layout-zebra = 'X'. "交替
ls_layout-detail_titlebar ='标题信息' .
ls_layout-detail_popup = 'X'. "弹窗
ls_layout-f2code = '&ETA'. "双击
ls_layout-colwidth_optimize = 'X'. "最适列宽

"销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = 'VBELN'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = "10°.
ls_fieldcat-seltext_m = '销售凭证'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.

"销售日期'
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'ERDAT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'DATS'.
ls_fieldcat-outputlen = '8'.
ls_fieldcat-seltext_m = '销售日期'.
ls_fieldcat-edit = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.

"销售数量
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ZMENG'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'QUAN'.
ls_fieldcat-outputlen = '13'.
ls_fieldcat-seltext_m = '销售数量'.
ls_fieldcat-decimals_out = 3. "当编辑数量字段的时候,如果是小数,要指定小数位,否则输入数据之后,敲回车,会自动缩小。
ls_fieldcat-do_sum = 'X'.
ls_fieldcat-edit = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.


*第五步定义事件*
ls_event-name = 'USER_COMMAND' . "用户响应事件
ls_event-form = 'FORM_USER_COMMAND' .
APPEND ls_event TO lt_event.
ls_event-name = 'TOP_OF_PAGE' . "显示标题
ls_event-form = 'FORM_TOP_OF_PAGE'.
APPEND ls_event TO lt_event.
ls_event-name = 'PF_STATUS_SET'. "设置gui-status
ls_event-form = 'FORM_PF_STATUS_SET' .
APPEND ls_event TO lt_event.

*第六步排序*
ls_sort-fieldname = 'ERDAT'.
ls_sort-down = 'X'.
APPEND ls_sort TO lt_sort.
CLEAR ls_sort.

ls_sort-fieldname = 'VBELN'.
ls_sort-up = 'X'.
APPEND ls_sort TO lt_sort.
CLEAR ls_sort.



*第七步显示ALV*
logo ='Z26310115' .
PERFORM frm_alv_grid_display.


FORM frm_alv_grid_display.

  ls_setting-edt_cll_cb ='X'. "编辑单元格之后,返回给程序编辑后的值
  pgm = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER = ' '
*     I_BUFFER_ACTIVE    = ' '
      i_callback_program = pgm
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
   "  I_STRUCTURE_NAME   = ''
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
      i_grid_settings    = ls_setting "编辑单元格之后,返回给程序编辑后的值
      is_layout          = ls_layout
      it_fieldcat        = lt_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS  =
      it_sort            = lt_sort
*     IT_FILTER          =
*     IS_SEL_HIDE        =
*     I_DEFAULT          = 'X'
      i_save             = 'A' "保存变式
*     IS_VARIANT         =
      it_events          = lt_event
*     IT_EVENT_EXIT      =
*     IS_PRINT           =
*     IS_REPREP_ID       =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  = 0
*     I_HTML_HEIGHT_END  = 0
*     IT_ALV_GRAPHICS    =
*     IT_HYPERLINK       =
*     IT_ADD_FIELDCAT    =
*     IT_EXCEPT_QINFO    =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*     O_PREVIOUS_SRAL_HANDLER           =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = lt_alvshow
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

FORM form_user_command USING r_ucomm LIKE sy-ucomm
                             rs_selfield TYPE slis_selfield.


  DATA: lt_vbap TYPE TABLE OF vbap,
        wa_vbap TYPE vbap.


  CASE r_ucomm .
    WHEN 'ZADD'.
      MESSAGE 'ZADD!' TYPE 'I'.
    WHEN 'ZSAVE'.

      SELECT * FROM vbap INTO TABLE lt_vbap
      FOR ALL ENTRIES IN lt_alvshow
      WHERE vbeln = lt_alvshow-vbeln
      AND posnr = lt_alvshow-posnr.

      LOOP AT lt_vbap INTO wa_vbap.
        READ TABLE lt_alvshow INTO wa_alvshow WITH KEY vbeln = wa_vbap-vbeln posnr = wa_vbap-posnr.
        IF sy-subrc = 0.
          wa_vbap-zmeng  = wa_alvshow-zmeng.
          MODIFY lt_vbap FROM wa_vbap. "内表更新
        ENDIF.
        CLEAR wa_vbap.
        CLEAR wa_alvshow.
      ENDLOOP.
      UPDATE vbap FROM TABLE lt_vbap. "数据库表的更新
      IF sy-subrc = 0 .
        COMMIT WORK. "数据库提交
        MESSAGE '保存成功!' TYPE 'I'.
      ELSE.
        ROLLBACK WORK.
        MESSAGE '保存失败!' TYPE 'I'.
      ENDIF.

    WHEN '&CRR'.
      logo ='Z51_ALV'.
      ls_event-name = 'TOP_OF_PAGE' . "显示标题
      ls_event-form = 'FORM_TOP_OF_PAGE'.
      APPEND ls_event TO lt_event.
      PERFORM frm_alv_grid_display.

    WHEN '&CRL'.
      logo ='Z26310115'.
      ls_event-name = 'TOP_OF_PAGE' . "显示标题
      ls_event-form = 'FORM_TOP_OF_PAGE'.
      APPEND ls_event TO lt_event.
      PERFORM frm_alv_grid_display.

    WHEN OTHERS.
  ENDCASE.

ENDFORM. "FORM USER COMMAND

FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'.
ENDFORM.

FORM form_top_of_page.
  DATA : lt_commentary TYPE slis_t_listheader,
         wa_commentary TYPE slis_listheader.

  wa_commentary-typ = 'H'.
  wa_commentary-info = '销售凭证清单'.
  APPEND wa_commentary TO lt_commentary.
  wa_commentary-typ = 'S'.
  wa_commentary-info = '销售凭证清单'.
  APPEND wa_commentary TO lt_commentary.
  wa_commentary-typ = 'A'.
  wa_commentary-info = '销售凭证清单'.
  APPEND wa_commentary TO lt_commentary.



  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = lt_commentary
      i_logo             = logo " 'Z26310115'           "T-code:OAER
*     I_END_OF_LIST_GRID =
*     I_ALV_FORM         =
    .

ENDFORM .

SE37函数

 参照类型:Type,Type Ref  TO 参考类型对象

DATA :
  lv_vbeln TYPE vbeln_va,
  ls_vbak  TYPE vbak,
  lt_vbap  TYPE TABLE OF vbap.

lv_vbeln = '1'.

"CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_vbeln  IMPORTING OUTPUT = lv_vbeln.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input         = lv_vbeln
 IMPORTING
   OUTPUT        = lv_vbeln.

CALL FUNCTION 'ZFMMMTEST001'
  EXPORTING
    i_vbeln              = lv_vbeln
  IMPORTING
    e_vbak               = ls_vbak
    "e_vbap               =
  TABLES
    t_vbap               = lt_vbap
  EXCEPTIONS
    division_by_zero     = 1
    salesorder_not_exist = 2
    OTHERS               = 3.

IF sy-subrc = 2.
  WRITE : '销售凭证不存在'.
ELSEIF sy-subrc = 0 .
  WRITE : ls_vbak-vbeln.
ENDIF.

"GUI_DOWNLOAD  下载文件中的数据
"GUI_UPLOAD 上载数据到文件里
"WS_FILENAME_GET 获取文件名
"CLOI_PUT_SIGN_IN_FRONT 将负号前置,SAP默认将负号在数字后面
"CONVERSION_EXIT_ALPHA_INPUT 数字串补0

"获取每个月的最后一天
DATA date TYPE d.
date = sy-datum.
CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = date IMPORTING last_day_of_month = date.
WRITE /  date.
"去掉前面0
DATA s TYPE string.
s = '000000021'.
call function 'CONVERSION_EXIT_ALPHA_OUTPUT' exporting input = s importing output = s.
WRITE / s.

"CONVERSION_EXIT_ALPHA_INPUT 数字串补0
DATA : lv_vbeln TYPE vbeln_va,
       s        TYPE string.
lv_vbeln = '1'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_vbeln  IMPORTING output = lv_vbeln.
s = lv_vbeln .
WRITE : / 's:', s.
WRITE : / 'lv_vbeln:',   lv_vbeln.
BREAK-POINT.
"把SAP里的负号放到前面来的函数CLOI_PUT_SIGN_IN_FRONT
DATA  t(10) TYPE c VALUE '65465-' .
CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT' CHANGING value = t.
WRITE : / t .
根据提供的引用内容,SAP中可以使用以下函数来获取日期的年月日:

CALL FUNCTION 'BKK_GET_MONTH_LASTDAY':该函数可以获取指定日期的月份的最后一天。
CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES_NEW':该函数可以计算两个日期之间的月份差异。
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL':该函数可以根据给定的条件获取需要的日期。
CALL FUNCTION 'FIMA_DATE_CREATE':该函数可以根据给定的条件创建日期。
请注意,以上函数的具体使用方法和参数可能会根据具体的SAP版本和配置而有所不同

模块化编程

断点调试 

设置断点

【ABAP学习笔记】_第5张图片

F8执行,进入后F9,设置查找的内容,如ALV函数

【ABAP学习笔记】_第6张图片

提示成功

F8后可以进入系统程序

【ABAP学习笔记】_第7张图片

调试2

 进入程式,/h进入调试,

【ABAP学习笔记】_第8张图片

 断点删除

【ABAP学习笔记】_第9张图片

子例程

DATA : a TYPE i VALUE 1, b TYPE i VALUE 2, c TYPE i ,d TYPE i ,e TYPE i.
PERFORM frm_plus USING a b c d e.
WRITE:/ c ,/ d ,/ e.
*-------------子例程--------------*
FORM frm_plus USING p_a p_b p_c VALUE(p_d) CHANGING p_e.
  p_c = p_a + p_b .  " 引用传递
  p_d = p_a + p_b .  " 值传递
  p_e = p_a + p_b .  " 引用传递
ENDFORM.

*-------------子例程结构--------------*
FORM frm_get_sflight USING carrid
                           sflight TYPE sflight.
  sflight-carrid = 'aa'.
ENDFORM.

 调用Tcode

CALL TRANSACTION 'SE93'. "调用TCODE

宏定义 

*-----------------宏(不可调试)-------------*
DEFINE increment.
  &1 = &1 + 1.
  WRITE: / &1 , / &2 .
END-OF-DEFINITION.

DATA : a TYPE i VALUE 1,b TYPE i VALUE 2.

increment a b .

选择屏幕

*SAP内存*
DATA lv_data1 TYPE char5 VALUE 'fly'.
SET PARAMETER ID 'P1' FIELD lv_data1.


*另外的程式,获取SAP内存*
DATA lv_data2 TYPE char5 .
GET PARAMETER ID 'P1' FIELD lv_data2.
WRITE lv_data2.
*ABAP内存*
DATA lv_data TYPE char5 VALUE 'fly'.
export  lv_data to MEMORY id 'P2'.


*另外的程式,实际无法获取ABAP内存*
*要通过SUBMIT这样的方式才可以获取,变量内存都要一样才行*
DATA lv_data TYPE char5 .
IMPORT lv_data FROM MEMORY ID 'P2'.
WRITE lv_data.
PARAMETERS p_p1(5) TYPE c DEFAULT 'fly' MEMORY ID p1.


*另外的程式,获取SAP内存*
DATA lv_data2 TYPE char5 .
GET PARAMETER ID 'P1' FIELD lv_data2.
WRITE lv_data2.

屏幕设计

SMW0 上传文件

 smw0 上传图片【ABAP学习笔记】_第10张图片

 【ABAP学习笔记】_第11张图片

 【ABAP学习笔记】_第12张图片

【ABAP学习笔记】_第13张图片

*&---------------------------------------------------------------------*
*& Report ZHF_TEST00
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test00.

DATA:OK_CODE TYPE SY-UCOMM,
     SAVE_OK TYPE SY-UCOMM.
*定义控制和图像对象定义
DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA PICTURE TYPE REF TO CL_GUI_PICTURE.
*初始标志字段定义
DATA INIT.

CALL SCREEN 100.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
*用户交互
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
* 定义状态条、包括菜单、工具条按钮、系统按钮等
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STANDARD'.
*如果还未创建定制对象
  IF INIT IS INITIAL.
*图片地址字段定义
    DATA URL(255).
    CLEAR URL.
*创建对象
    CREATE OBJECT CONTAINER
      EXPORTING CONTAINER_NAME = 'CUSCON'.

    CREATE OBJECT PICTURE
      EXPORTING PARENT = CONTAINER
      EXCEPTIONS ERROR = 1.
    IF SY-SUBRC NE 0.
    ENDIF.
*定义通用函数取得图片地址
    PERFORM LOAD_PIC_DB CHANGING URL.
*显示图片
    CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
      EXPORTING
        URL = URL.
    IF SY-SUBRC NE 0.
    ENDIF.
*置标志位已初始
    INIT = 'X'.
  ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  LOAD_PIC_DB
*&---------------------------------------------------------------------*
* 获取图片地址通用函数
*----------------------------------------------------------------------*
*      <--P_URL  text
*----------------------------------------------------------------------*
FORM LOAD_PIC_DB  CHANGING P_URL.
  DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE.
  DATA HTML_TABLE LIKE W3HTML OCCURS 1.
  DATA RETURN_CODE LIKE W3PARAM-RET_CODE.
  DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE.
  DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN.
  DATA PIC_DATA LIKE W3MIME OCCURS 0.
  DATA PIC_SIZE TYPE I.

  REFRESH QUERY_TABLE.
*查询对象数据
  QUERY_TABLE-NAME = '_OBJECT_ID'.
*图片对象名称
  QUERY_TABLE-VALUE = 'ZPT02'.
  APPEND QUERY_TABLE.
*读取WWWDATA表,取得图片对象信息
  CALL FUNCTION 'WWW_GET_MIME_OBJECT'
    TABLES
      QUERY_STRING        = QUERY_TABLE
      HTML                = HTML_TABLE
      MIME                = PIC_DATA
    CHANGING
      RETURN_CODE         = RETURN_CODE
      CONTENT_TYPE        = CONTENT_TYPE
      CONTENT_LENGTH      = CONTENT_LENGTH
    EXCEPTIONS
      OBJECT_NOT_FOUND    = 1
      PARAMETER_NOT_FOUND = 2
      OTHERS              = 3.
  IF SY-SUBRC EQ 0.
    PIC_SIZE = CONTENT_LENGTH.
  ENDIF.
*创建图片URL地址
  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      TYPE                       =  'image'
      SUBTYPE                    =  CNDP_SAP_TAB_UNKNOWN
     SIZE                        =  PIC_SIZE
*   DATE                       =
*   TIME                       =
*   DESCRIPTION                =
      LIFETIME                   =  CNDP_LIFETIME_TRANSACTION
*   CACHEABLE                  =
    TABLES
      DATA                       =  PIC_DATA
*   FIELDS                     =
*   PROPERTIES                 =
    CHANGING
      URL                        =  URL
   EXCEPTIONS
     DP_INVALID_PARAMETER       = 1
     DP_ERROR_PUT_TABLE         = 2
     DP_ERROR_GENERAL           = 3
     OTHERS                     = 4
            .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " LOAD_PIC_DB

文本编辑器

*&---------------------------------------------------------------------*
*& Report ZHF_TEST00
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test00.


"文本编辑器


DATA: ok_code TYPE sy-ucomm,  "防止功能码错乱
      save_ok TYPE sy-ucomm.
*初始标志字段定义
*定制控制和编辑对象定义
DATA: init,  "初始标志字段定义  省略了 tyoe c
      "*定义控制和图像对象定义
      "定义类 TYPE REF TO
      " SE24查看类
      "cl_gui_custom_container=>Static Attribute 静态属性、静态方法、常量属性
      "lr_custom->www_active 实列
      container TYPE REF TO cl_gui_custom_container, "定制控制
      editor    TYPE REF TO cl_gui_textedit. "文本编辑器

DATA: m1(256)   TYPE c OCCURS 0, "内表
      line(256) TYPE c. "工作区
*输入初始值
line = '请输入'.
APPEND line TO m1.

CALL SCREEN 100.

REFRESH m1.

CALL METHOD editor->get_text_as_r3table
  IMPORTING
    table = m1.
*逐行输出
LOOP AT m1 INTO line.
  WRITE / line.
ENDLOOP.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STANDARD'.
*如果还未创建定制对象
  IF init IS INITIAL.
    "CREATE OBJECT: container EXPORTING container_name = 'CUSCON'.
    CREATE OBJECT container EXPORTING container_name = 'CUSCON'. "可以省略 :


*    CREATE OBJECT container
*      EXPORTING
**       parent         =
*        container_name = 'CUSCON' "“定制化控制”控件的名称,要大写
**       style          =
**       lifetime       = lifetime_default
**       repid          =
**       dynnr          =
**       no_autodef_progid_dynnr     =
**  EXCEPTIONS
**       cntl_error     = 1
**       cntl_system_error           = 2
**       create_error   = 3
**       lifetime_error = 4
**       lifetime_dynpro_dynpro_link = 5
**       others         = 6
*      .
*    IF sy-subrc <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*    ENDIF.


*CREATE OBJECT editor
*  EXPORTING
**    max_number_chars       =
**    style                  = 0
**    wordwrap_mode          = WORDWRAP_AT_WINDOWBORDER
**    wordwrap_position      = -1
**    wordwrap_to_linebreak_mode = FALSE
**    filedrop_mode          = DROPFILE_EVENT_OFF
*    parent                 =
**    lifetime               =
**    name                   =
**  EXCEPTIONS
**    error_cntl_create      = 1
**    error_cntl_init        = 2
**    error_cntl_link        = 3
**    error_dp_create        = 4
**    gui_type_not_supported = 5
**    others                 = 6
*    .
*IF sy-subrc <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*ENDIF.

    IF container IS BOUND. "如果对象控件是绑定
      CREATE OBJECT editor
        EXPORTING
          parent                     = container "父类
          wordwrap_mode              = cl_gui_textedit=>wordwrap_at_fixed_position "初始位置
          wordwrap_position          = 256 "文本位置
          wordwrap_to_linebreak_mode = cl_gui_textedit=>true. "确实要处理属性
    ENDIF.

    init = 'X'.
  ENDIF.


*CALL METHOD editor->set_text_as_r3table
**  EXPORTING
**    table           =
**  EXCEPTIONS
**    error_dp        = 1
**    error_dp_create = 2
**    others          = 3
*        .
*IF sy-subrc <> 0.
** Implement suitable error handling here
*ENDIF.



*读入初始数据
  CALL METHOD editor->set_text_as_r3table
    EXPORTING
      table = m1.

ENDMODULE.                 " STATUS_0100  OUTPUT

 SE41

 SE41复制GUI状态栏

【ABAP学习笔记】_第14张图片

 SUBMIT

TABLES: t001.


*销售主营收入
TYPES: BEGIN OF ty_zysr,
         period          TYPE char20,
         balance_cum(12) TYPE p DECIMALS 2,
       END OF ty_zysr.
DATA gt_xssr TYPE TABLE OF ty_zysr.


SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-001.
PARAMETERS p_year TYPE marv-lfgja  OBLIGATORY. "年度
SELECT-OPTIONS s_bukrs FOR t001-bukrs OBLIGATORY.." 公司
SELECTION-SCREEN:END OF BLOCK a1.

INITIALIZATION.

START-OF-SELECTION. "执行按钮后触发

  PERFORM frm_getxssr.

  IF gt_xssr IS NOT INITIAL.
    cl_demo_output=>display( gt_xssr ).
  ENDIF.

FORM frm_getxssr .
  DATA fs_data TYPE REF TO data.

  FIELD-SYMBOLS  TYPE ANY TABLE.

  cl_salv_bs_runtime_info=>set(
     EXPORTING
       display  = abap_false  "不显示
       metadata = abap_false
       data     = abap_true
    ).

  "科目
  RANGES: s_hko FOR bsis-hkont.
  DEFINE mcr_set_hko.
    s_hko-sign = 'I'.
    s_hko-option = 'EQ'.
    s_hko-low = &1. "科目
    APPEND s_hko.
    CLEAR s_hko.
  END-OF-DEFINITION.
  mcr_set_hko:
  '0060010101' ,
  '0060010102' ,
  '0060010103' ,
  '0060010104' ,
  '0060010105' ,
  '0060010207' ,
  '0060010208' ,
  '0060010209' ,
  '0060010210' ,
  '0060020103' ,
  '0060030103' .


  SUBMIT fagl_account_balance
    WITH racct IN s_hko
    WITH rbukrs IN s_bukrs
    WITH ryear = p_year
      AND RETURN.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = fs_data ).
      ASSIGN fs_data->* TO .
      IF  IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING  TO gt_xssr.
      ENDIF.
    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE '获取数据失败' TYPE 'E' .
  ENDTRY.
  "清除设置的格式
  cl_salv_bs_runtime_info=>clear_all( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Report ZHF_TEST0
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test0.

TABLES: t001.


*销售主营收入
TYPES: BEGIN OF ty_zysr,
         period          TYPE char20,
         balance_cum(12) TYPE p DECIMALS 2,
       END OF ty_zysr.
DATA gt_xssr TYPE TABLE OF ty_zysr.


SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-001.
PARAMETERS p_year TYPE marv-lfgja . " OBLIGATORY. "年度
SELECT-OPTIONS s_bukrs FOR t001-bukrs." OBLIGATORY.." 公司
SELECTION-SCREEN:END OF BLOCK a1.

INITIALIZATION.

START-OF-SELECTION. "执行按钮后触发

  " PERFORM frm_getxssr.

  PERFORM  frm_getdata.

  IF gt_xssr IS NOT INITIAL.
    cl_demo_output=>display( gt_xssr ).
  ENDIF.

FORM frm_getxssr .
  DATA fs_data TYPE REF TO data.

  FIELD-SYMBOLS  TYPE ANY TABLE.

  cl_salv_bs_runtime_info=>set(
     EXPORTING
       display  = abap_false  "不显示
       metadata = abap_false
       data     = abap_true
    ).

  "科目
  RANGES: s_hko FOR bsis-hkont.
  DEFINE mcr_set_hko.
    s_hko-sign = 'I'.
    s_hko-option = 'EQ'.
    s_hko-low = &1. "科目
    APPEND s_hko.
    CLEAR s_hko.
  END-OF-DEFINITION.
  mcr_set_hko:
  '0060010101' ,
  '0060010102' ,
  '0060010103' ,
  '0060010104' ,
  '0060010105' ,
  '0060010207' ,
  '0060010208' ,
  '0060010209' ,
  '0060010210' ,
  '0060020103' ,
  '0060030103' .


  SUBMIT fagl_account_balance
    WITH racct IN s_hko
    WITH rbukrs IN s_bukrs
    WITH ryear = p_year
      AND RETURN.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = fs_data ).
      ASSIGN fs_data->* TO .
      IF  IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING  TO gt_xssr.
      ENDIF.
    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE '获取数据失败' TYPE 'E' .
  ENDTRY.
  "清除设置的格式
  cl_salv_bs_runtime_info=>clear_all( ).
ENDFORM.




FORM frm_getdata.
  DATA fs_data TYPE REF TO data.

  FIELD-SYMBOLS  TYPE ANY TABLE.

  cl_salv_bs_runtime_info=>set(
     EXPORTING
       display  = abap_false  "不显示
       metadata = abap_false
       data     = abap_true
    ).



  SET PARAMETER ID 'MAT' FIELD 'MCCMM084-015'.
  SET PARAMETER ID 'WRK' FIELD 'MC01'.
  SET PARAMETER ID 'POPR' FIELD '1'.
  SET PARAMETER ID 'BDTJ' FIELD '2023'.
  CALL  TRANSACTION 'CKM3N' AND SKIP FIRST SCREEN.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = fs_data ).
      ASSIGN fs_data->* TO .
      IF  IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING  TO gt_xssr.
      ENDIF.
    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE '获取数据失败' TYPE 'E' .
  ENDTRY.
  "清除设置的格式
  cl_salv_bs_runtime_info=>clear_all( ).
ENDFORM.

 CALL TRANSACTION 

T-code:SHDB 

TABLES anla.

SELECTION-SCREEN BEGIN OF BLOCK text1.
PARAMETERS : p_bukrs LIKE anla-bukrs OBLIGATORY .
SELECT-OPTIONS: s_anln1 FOR anla-anln1 OBLIGATORY .
PARAMETERS : p_anln2 LIKE anla-anln2 OBLIGATORY .
SELECTION-SCREEN END OF BLOCK text1.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

START-OF-SELECTION.

  DATA: lt_bdcdata_tab TYPE TABLE OF bdcdata,
        ls_opt         TYPE ctu_params.

  ls_opt = VALUE #( dismode = 'E'
                    defsize = 'X' ).

  LOOP AT  s_anln1.
    lt_bdcdata_tab = VALUE #(
     ( program = 'SAPLAIST' dynpro = '100'  dynbegin = 'X' )
     ( fnam = 'BDC_OKCODE'     fval = '/00' )
     ( fnam = 'ANLA-ANLN1'     fval = s_anln1-low )
     ( fnam = 'ANLA-ANLN2'     fval = p_anln2 )
     ( fnam = 'ANLA-BUKRS'     fval = p_bukrs )
     ( program = 'SAPLAIST' dynpro = '210'  dynbegin = 'X' )
     ( fnam = 'BDC_OKCODE'     fval = '=BUCH' )
     ( fnam = 'RA02S-XPHYS'    fval = 'X' )
     ( program = 'SAPLSPO1' dynpro = '100'  dynbegin = 'X' )
     ( fnam = 'BDC_OKCODE'     fval = '=YES' ) )."

    TRY.
        CALL TRANSACTION 'AS06' WITH AUTHORITY-CHECK
                                   USING lt_bdcdata_tab OPTIONS FROM ls_opt.
      CATCH cx_sy_authorization_error ##NO_HANDLER.
    ENDTRY.

  ENDLOOP.

增强启用范围

Z_ENHANCE_FM_MAINTAIN

【ABAP学习笔记】_第15张图片

【ABAP学习笔记】_第16张图片

创建类CL_GUI_CUSTOM_CONTAINER,命名CONTAINER

 【ABAP学习笔记】_第17张图片

CREATE OBJECT container
  EXPORTING
*    parent                      =
    container_name              =
*    style                       =
*    lifetime                    = lifetime_default
*    repid                       =
*    dynnr                       =
*    no_autodef_progid_dynnr     =
*  EXCEPTIONS
*    cntl_error                  = 1
*    cntl_system_error           = 2
*    create_error                = 3
*    lifetime_error              = 4
*    lifetime_dynpro_dynpro_link = 5
*    others                      = 6
    .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

 创建类CL_GUI_TEXTEDIT的方法SET_TEXT_AS_R3TABLE命名是EDITOR

【ABAP学习笔记】_第18张图片

CALL METHOD editor->set_text_as_r3table
*  EXPORTING
*    table           =
*  EXCEPTIONS
*    error_dp        = 1
*    error_dp_create = 2
*    others          = 3
        .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

 BAPI

DATA: TA_ORDER_CONDITIONS_IN TYPE TABLE OF BAPICOND WITH HEADER LINE,
TA_ORDER_CONDITTIONS_INX TYPE TABLE OF BAPICONDX WITH HEADER LINE.
DATA:
* HK IRIEJY Order partners
LLORDER_PARTNERS TYPE STANDARD TABLE OF BAPIPARNR,
L_ORDER_PARTNERS LIKE BAPIPARNR,
* HRT Mk Structures for order header -
L_ORDER_HEADER_IN LIKE BAPISDHD1,
L_ORDER_HEADER_INX LIKE BAPISDHD1X,
* S151 Tables for order items
LI_ORDER_ITEMS_IN TYPE STANDARD TABLE OF BAPISDITM,
L_ORDER_ITEMS_IN LIKE BAPISDITM,
LI_ORDER_ITEMS_INX TYPE STANDARD TABLE OF BAPISDITMX,
 L_ORDER_ITEMSINX  LIKE BAPISDITMX,
* BAPI??2Return table from bapi call
LI_RETURN TYPE STANDARD TABLE OF BAPIRET2,
L_RETURN TYPE BAPIRET2,
* SEEIVAR SH) Sales documen t number
L_VBELN LIKE BAPIVBELN-VBELN,
* Error flag
L_ERRFLAG(1) TYPE C.
START-OF-SELECTION.
* FEAKILFFOLIEDF Build panner information

接口

 C:\Windows\System32\drivers\etc\

 C:\Windows\System32\drivers\etc\hosts.ics

SOAMANAGER

SE80  OA过账 Z_FI_I0006

SWO1   BAPI

实例

 发送企业微信

DATA : title    TYPE string,
       content  TYPE string,
       code     TYPE c,
       flag     TYPE c,
       validity TYPE  string.


content = sy-datum . "sy-uname .
code = 'ZHF_TEST2'. "ZTPP0018_WEMAIL表中维护,但是只能维护首字母
flag = 'W'.  "调用函数中的SQL,要选W才会运行

  CONCATENATE  '创建人:'   sy-uname   '      '
               '创建日期:' sy-datum+0(4) '.'
                            sy-datum+4(2) '.'
                            sy-datum+6(2) '      '
               '创建时间:' sy-uzeit+0(2) ':'
                            sy-uzeit+2(2) ':'
                            sy-uzeit+4(2)
               INTO content.

CALL FUNCTION 'ZPP_SAP_MESSAGETO'
  EXPORTING
*   TITLE          =
    content        = content
    code           = code
    flag           = flag
    vkorg          = 'WX'
*   VALIDITY       =
* IMPORTING
*   RETURN         =
          .
  DATA:st_msg         TYPE zscommon_wechat_in.

  DATA : c1      TYPE string,
         c2      TYPE string,
         c3      TYPE string,
         c4      TYPE string,
         content TYPE string.

  TYPES: BEGIN OF ty_adrp,
           name_last  TYPE ad_namelas,          ""姓
           name_first TYPE ad_namefir,          ""名 "
         END OF ty_adrp.

  DATA: gt_adrp TYPE TABLE OF ty_adrp,
        gs_adrp TYPE ty_adrp.

  TYPES: BEGIN OF ty_tstct,
           ttext TYPE ttext_stct,          "事务说明
         END OF ty_tstct.

  DATA: gt_tstct TYPE TABLE OF ty_tstct,
        gs_tstct TYPE ty_tstct.

  SELECT SINGLE
        adrp~name_last,           ""姓
        adrp~name_first          ""名 "
  FROM adrp
    LEFT JOIN usr21 ON usr21~persnumber = adrp~persnumber
  WHERE usr21~bname = @sy-uname
    INTO CORRESPONDING FIELDS OF @gs_adrp.

  SELECT SINGLE
         tstct~ttext          "事务说明
  FROM tstct
  WHERE tstct~sprsl = @sy-langu          "语言代码
    AND tstct~tcode = @sy-tcode          "事务代码
  INTO CORRESPONDING FIELDS OF @gs_tstct.


  "CONCATENATE  '创建人:' sy-uname INTO c1 SEPARATED BY space.

  "CONCATENATE  '创建日期:' sy-datum+0(4) '.'
  "                          sy-datum+4(2) '.'
  "                          sy-datum+6(2)
  "                          INTO c2.

  "CONCATENATE  '创建时间:' sy-uzeit+0(2) ':'
  "                          sy-uzeit+2(2) ':'
  "                          sy-uzeit+4(2)
  "                          INTO c3.

  CONCATENATE 'Dear'  gs_adrp-name_last gs_adrp-name_first ':' INTO c1 SEPARATED BY space.
  c2 = '您好!' .
  CONCATENATE sy-tcode gs_tstct-ttext '更新完成,谢谢!' INTO c3 SEPARATED BY space.


  CONCATENATE c1  cl_abap_char_utilities=>newline
              c2  cl_abap_char_utilities=>newline
              c3  INTO content.

  st_msg-receiver = sy-uname.   "单条发送
  st_msg-content = content.       "信息内容
  st_msg-sendtime = sy-datum.     "推送时间

  CALL FUNCTION 'Z_COMMON_SEND_TO_WECHAT'
    EXPORTING
      os_in = st_msg.
*&---------------------------------------------------------------------*
*& Report ZHF_TEST3
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_wechat MESSAGE-ID zfi001.


TABLES:bkpf,ztco0043_slm.


TYPES: BEGIN OF ty_msgbox,
         c1 TYPE string,
       END OF ty_msgbox.

DATA: gt_msgbox TYPE TABLE OF ty_msgbox,
      gs_msgbox TYPE  ty_msgbox.

DATA:st_msg  TYPE zscommon_wechat_in,
     lv_name TYPE string,
     i       TYPE i.



TYPES: BEGIN OF ty_adrp,
         name_last  TYPE ad_namelas,          ""姓
         name_first TYPE ad_namefir,          ""名 "
       END OF ty_adrp.
DATA: gt_adrp TYPE TABLE OF ty_adrp,
      gs_adrp TYPE ty_adrp.


SELECTION-SCREEN BEGIN OF BLOCK text1.

PARAMETERS : p_usnam LIKE bkpf-usnam  DEFAULT sy-uname OBLIGATORY..   ""用户名
SELECT-OPTIONS:s_msgtx FOR ztco0043_slm-msgtx NO INTERVALS .   ""凭证抬头文本

SELECTION-SCREEN END OF BLOCK text1.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

START-OF-SELECTION.

  PERFORM frm_selection_check.
  PERFORM frm_send_to_wechat.





*&---------------------------------------------------------------------*
*& Form FRM_SELECTION_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_selection_check .

  IF s_msgtx IS INITIAL.
    MESSAGE s000 WITH '请输入消息内容!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  LOOP AT s_msgtx.
    IF s_msgtx-low = '*'.
      MESSAGE s000 WITH '消息内容:不能输入*!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
    IF NOT s_msgtx-sign = 'I'.
      MESSAGE s000 WITH '消息内容:只能输入I!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
    IF NOT s_msgtx-option = 'EQ'.
      MESSAGE s000 WITH '消息内容:只能输入等于!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SEND_TO_WECHAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_send_to_wechat .

  SELECT SINGLE
        adrp~name_last,           ""姓
        adrp~name_first          ""名 "
  FROM adrp
    LEFT JOIN usr21 ON usr21~persnumber = adrp~persnumber
  WHERE usr21~bname = @sy-uname
    INTO CORRESPONDING FIELDS OF @gs_adrp.

  lv_name = gs_adrp-name_last && gs_adrp-name_first.
  i = strlen( lv_name ).

  IF i = 2.
    lv_name = lv_name+1(1) .
  ELSEIF i = 3.
    lv_name = lv_name+1(2) .
  ELSEIF i = 4.
    lv_name = lv_name+2(2) .
  ENDIF.

  CONCATENATE 'Dear'  lv_name ':' INTO gs_msgbox-c1 SEPARATED BY space.
  APPEND gs_msgbox TO gt_msgbox.

  gs_msgbox-c1 = '您好!' .
  APPEND gs_msgbox TO gt_msgbox.


  LOOP AT s_msgtx.
    gs_msgbox-c1 = s_msgtx-low.
    APPEND gs_msgbox TO gt_msgbox.
  ENDLOOP.
  CLEAR gs_msgbox.


  LOOP AT gt_msgbox INTO gs_msgbox.

    st_msg-receiver = sy-uname.   "单条发送
    st_msg-content = gs_msgbox-c1.       "信息内容
    st_msg-sendtime = sy-datum.     "推送时间

    CALL FUNCTION 'Z_COMMON_SEND_TO_WECHAT'
      EXPORTING
        os_in = st_msg.

    WAIT UP TO '0.5' SECONDS.  "等待0.5秒
  ENDLOOP.
  CLEAR gs_msgbox.




ENDFORM.

发送OutLook邮箱

PERFORM send_mail_fm.


FORM send_mail_fm.
  DATA: l_subject   TYPE so_obj_des, "邮件主题
        l_content   TYPE soli_tab, "正文内容
        l_line      TYPE soli, "正文文本取值
        l_recipient TYPE safm_apt_pp_email, "收件人
        l_copy_to   TYPE safm_apt_pp_email,
        l_mail_addr TYPE ad_smtpadr, "收件人取值--邮箱地址取值
        l_attach    TYPE pobjt_string,
        l_fullpath  TYPE string.
  DATA: lo_err TYPE REF TO cx_bcs,
        lv_msg TYPE string.

  l_subject = '测试邮件-主题'.
  "正文内容
  CLEAR: l_content, l_line.
  l_line-line = '

Header 3

'. APPEND l_line TO l_content. "收件人 CLEAR l_mail_addr. l_mail_addr = '[email protected]'. APPEND l_mail_addr TO l_recipient. *"抄送人 * CLEAR L_MAIL_ADDR. * L_MAIL_ADDR = '[email protected]'. * APPEND L_MAIL_ADDR TO L_COPY_TO. * CLEAR L_FULLPATH. * L_FULLPATH = 'C:\Users\10308218\Desktop\123.pdf'. * APPEND L_FULLPATH TO L_ATTACH. * SELECT * FROM MARA INTO TABLE @DATA(LT_MARA) UP TO 20 ROWS. CALL FUNCTION 'Z_SEND_MAIL' EXPORTING content_type = 'HTM' subject = l_subject * IMPORTANCE = * SENSITIVITY = content = l_content * SENDER = SY-UNAME recipient = l_recipient * COPY_TO = L_COPY_TO * ATTACHMENT = L_ATTACH * INTERNAL_TABLE = LT_MARA IMPORTING cx_bcs = lo_err message = lv_msg. WRITE: /1 lv_msg. ENDFORM.

程序锁定和解锁

*&---------------------------------------------------------------------*
*& Form GET_SUOD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_suod .
  CALL FUNCTION 'ENQUEUE_ES_PROG'
    EXPORTING
      mode_trdir     = 'E'
      name           = 'ZCOD0046'
*     X_NAME         = ' '
*     _SCOPE         = '2'
*     _WAIT          = ' '
*     _COLLECT       = ' '
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  IF sy-subrc <> 0.
    MESSAGE '对象已被锁定,请稍后执行' TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_JIES
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_jies .
  CALL FUNCTION 'DEQUEUE_ES_PROG'
    EXPORTING
      mode_trdir = 'E'
      name       = 'ZCOD0046'
*     X_NAME     = ' '
*     _SCOPE     = '3'
*     _SYNCHRON  = ' '
*     _COLLECT   = ' '
    .

ENDFORM.

你可能感兴趣的:(ABAP,笔记)