【ABAP学习笔记】_dp_create_url-程序员宅基地

技术标签: 笔记  ABAP  

目录

 语法

 常用

MESSAGE 

分支

 定义变量

 结构体变量

 图标与符号

复选框

颜色

 赋值

数据处理

字符串处理

文本元素

内表

分组循环 

SQL

SE11

 SE14

ALV

SE41

 ALV 练习

SE37函数

模块化编程

断点调试 

调试2

子例程

 调用Tcode

宏定义 

选择屏幕

屏幕设计

SMW0 上传文件

文本编辑器

 SE41

 SUBMIT

 CALL TRANSACTION 

增强启用范围

 BAPI

接口

系统级变量

实例

 发送企业微信

发送OutLook邮箱

程序锁定和解锁


 语法

 常用

*下划线
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>] [(<len>)]*
*/:换行
*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 <F1> TO <F2>
*用MOVE进行文本赋值
DATA : m_gendle(4) TYPE c.
MOVE 'male' TO m_gendle.
WRITE : m_gendle.


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

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

文本元素

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 <internal_table> WITH KEY <key_fields> INTO <work_area>.

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

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

以下是一个示例:

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 <internal_table>
      [WITH KEY <key_fields>]
      [BINARY SEARCH]
      [INDEX <index>]
      [TRANSPORTING NO FIELDS]
      [REFERENCE INTO <wa>].

其中,<internal_table> 是要进行查找的内部表名称,<key_fields> 是一个条件表达式,用于指定要查找的行。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 分组循环的使用方法小栗子_寒武青锋的博客-程序员宅基地

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(<group>).
  
  CLEAR: gv_tot_age.
  WRITE: / | 组序号: { <group>-index }    角色: { <group>-role WIDTH = 15 }|
              & |     这个组有几条数据: { <group>-size  } |.
   "loop循环组,将组里的数据读出来"           
  LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
    gv_tot_age = gv_tot_age + <ls_member>-age.
    WRITE: /13 <ls_member>-name .
  ENDLOOP.
  
  gv_avg_age = gv_tot_age / <group>-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(<group>).
    IF lt2_stpov IS NOT INITIAL.
      SORT lt2_stpov BY zmatnr zwerks werks matnr idnrk.
    ENDIF.
    LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<fs_stpov>).
      wa2_stpov-zmatnr = <fs_stpov>-zmatnr.          ""查询的物料
      wa2_stpov-zwerks = <fs_stpov>-zwerks.          ""查询的工厂
      wa2_stpov-werks = <fs_stpov>-werks.            ""工厂
      wa2_stpov-matnr = <fs_stpov>-matnr.            ""物料编号
      wa2_stpov-idnrk = <fs_stpov>-idnrk.            ""BOM组件
      wa2_stpov-erfmg3 = <fs_stpov>-erfmg3.          ""比例"
      wa2_stpov-erfmg4 = wa2_stpov-erfmg3.          ""关联交易比例
      IF lt2_stpov IS NOT INITIAL.
        READ TABLE lt2_stpov INTO wa1_stpov WITH KEY zmatnr = <fs_stpov>-zmatnr zwerks = <fs_stpov>-zwerks werks = <fs_stpov>-werks  matnr = <fs_stpov>-idnrk  BINARY SEARCH.
        IF sy-subrc = 0.
          wa2_stpov-erfmg4 = wa1_stpov-erfmg4 * <fs_stpov>-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的博客-程序员宅基地

(95条消息) ALV字段目录lvc_s_fcat_酒剑仙abc的博客-程序员宅基地

SE41

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

 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版本和配置而有所不同

 表维护生成器

SE37创建函数组

SE11创建表后点击“表维护生成器”

维护好后,最后点击“查找屏幕号”

点击

屏幕号生成后点击“创建”

SM30查看下

SE93维护事务码

选最后一个

​​​​​​​

UPDATE 

VIEWNAME

 SE80

​​​​​​​

 

PROCESS BEFORE OUTPUT.
  MODULE liste_initialisieren.
  LOOP AT extract WITH CONTROL
   tctrl_ztsd0044a CURSOR nextline.
    MODULE liste_show_liste.
  ENDLOOP.
*
  MODULE ztsd0044a_show. "表维护生成器设置只读

PROCESS AFTER INPUT.
  MODULE liste_exit_command AT EXIT-COMMAND.
  MODULE liste_before_loop.
  LOOP AT extract.
    MODULE liste_init_workarea.
    CHAIN.
      FIELD ztsd0044a-lfart .
      MODULE ztsd0044a_update ON CHAIN-REQUEST. "更新
    ENDCHAIN.

    CHAIN.
      FIELD ztsd0044a-lfart .
      FIELD ztsd0044a-erdat .
      FIELD ztsd0044a-erzei .
      FIELD ztsd0044a-ernam .
      MODULE set_update_flag ON CHAIN-REQUEST.
    ENDCHAIN.
    FIELD vim_marked MODULE liste_mark_checkbox.
    CHAIN.
      FIELD ztsd0044a-lfart .
      MODULE liste_update_liste.
    ENDCHAIN.
  ENDLOOP.
  MODULE liste_after_loop.

PROCESS ON VALUE-REQUEST.
  FIELD ztsd0044a-lfart MODULE ztsd0044a_f4help.
*----------------------------------------------------------------------*
***INCLUDE LZ_SD_I0075O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module ZTSD0044A_show OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE ztsd0044a_show OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  LOOP AT SCREEN.
    IF screen-name = 'ZTSD0044A-ERDAT' OR screen-name = 'ZTSD0044A-ERZEI' OR screen-name = 'ZTSD0044A-ERNAM'.
      screen-input = 0 .
      MODIFY SCREEN .
    ENDIF.
  ENDLOOP.

ENDMODULE.
*----------------------------------------------------------------------*
***INCLUDE LZ_SD_I0075I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  ZTSD0044A_update  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE ztsd0044a_update INPUT.

  SELECT SINGLE lfart FROM tvlk INTO ztsd0044a-lfart WHERE lfart = ztsd0044a-lfart.

  IF NOT sy-subrc = 0.
    MESSAGE '交货类型不存在!' TYPE 'E' .
  ENDIF.

  ztsd0044a-erdat = sy-datum.
  ztsd0044a-erzei = sy-uzeit.
  ztsd0044a-ernam = sy-uname.

ENDMODULE.

 

*----------------------------------------------------------------------*
***INCLUDE LZ_SD_I0075I03.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  ZTSD0044A_F4HELP  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE ztsd0044a_f4help INPUT.

  TYPES : BEGIN OF ty_tvlkt,
            lfart TYPE lfart,            ""交货类型
            vtext TYPE bezei20,          ""描述"
          END OF ty_tvlkt.

  DATA: lt_tvlkt  TYPE TABLE OF ty_tvlkt.

  SELECT
      tvlkt~lfart,          ""交货类型
      tvlkt~vtext           ""描述"
   FROM tvlkt
    WHERE tvlkt~spras = @sy-langu
   INTO CORRESPONDING FIELDS OF TABLE @lt_tvlkt
     UP TO 20 ROWS .

  SORT lt_tvlkt BY lfart.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      retfield        = 'LFART' "显示的字段
*     PVALKEY         = ' '
      dynpprog        = sy-repid "获取程式
      dynpnr          = sy-dynnr
      dynprofield     = 'LFART'
*     STEPL           = 0
*     WINDOW_TITLE    =
*     VALUE           = ' '
      value_org       = 'S' " 'C'只有一列
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
* IMPORTING
*     USER_RESET      =
    TABLES
      value_tab       = lt_tvlkt
*     FIELD_TAB       =
"     return_tab      = lt_return "不指定的话没有返回值
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      parameter_error = 1
      no_tvlkts_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.



ENDMODULE.

 

 

模块化编程

断点调试 

设置断点

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

提示成功

F8后可以进入系统程序

调试2

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

 断点删除

子例程

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 上传图片

 

 

*&---------------------------------------------------------------------*
*& 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状态栏

 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 <fs_table> 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 <fs_table>.
      IF <fs_table> IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING <fs_table> 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 <fs_table> 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 <fs_table>.
      IF <fs_table> IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING <fs_table> 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 <fs_table> 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 <fs_table>.
      IF <fs_table> IS ASSIGNED.
        "后续处理逻辑
        MOVE-CORRESPONDING <fs_table> 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

创建类CL_GUI_CUSTOM_CONTAINER,命名CONTAINER

 

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

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

系统级变量

TYPES:BEGIN OF ty_data,
        abap(10) TYPE c,
        msg(30)  TYPE c,
      END OF ty_data.

DATA: gt_data TYPE TABLE OF ty_data,
      gs_data TYPE ty_data.


gt_data = VALUE #(
( abap = 'CUCOL'  msg = SY-CUCOL )
( abap = 'CUROW'  msg = SY-CUROW )
( abap = 'STEPL'  msg = SY-STEPL )
( abap = 'SROWS'  msg = SY-SROWS )
( abap = 'SCOLS'  msg = SY-SCOLS )
( abap = 'LOOPC'  msg = SY-LOOPC )
( abap = 'DYNNR'  msg = SY-DYNNR )
( abap = 'DYNGR'  msg = SY-DYNGR )
( abap = 'PFKEY'  msg = SY-PFKEY )
( abap = 'TITLE'  msg = SY-TITLE )
( abap = 'DATAR'  msg = SY-DATAR )
( abap = 'PAGNO'  msg = SY-PAGNO )
( abap = 'COLNO'  msg = SY-COLNO )
( abap = 'LINNO'  msg = SY-LINNO )
( abap = 'MACOL'  msg = SY-MACOL )
( abap = 'MAROW'  msg = SY-MAROW )
( abap = 'ULINE'  msg = SY-ULINE )
( abap = 'VLINE'  msg = SY-VLINE )
( abap = 'BATCH'  msg = SY-BATCH )
( abap = 'BINPT'  msg = SY-BINPT )
( abap = 'CALLD'  msg = SY-CALLD )
( abap = 'TCODE'  msg = SY-TCODE )
( abap = 'SLSET'  msg = SY-SLSET )
( abap = 'CPROG'  msg = SY-CPROG )
( abap = 'INDEX'  msg = SY-INDEX )
( abap = 'TABIX'  msg = SY-TABIX )
( abap = 'TFILL'  msg = SY-TFILL )
( abap = 'DBCNT'  msg = SY-DBCNT )
( abap = 'FDPOS'  msg = SY-FDPOS )
( abap = 'TLENG'  msg = SY-TLENG )
( abap = 'SUBRC'  msg = SY-SUBRC )
( abap = 'UCOMM'  msg = SY-UCOMM )
( abap = 'ABCDE'  msg = SY-ABCDE )
( abap = 'FDAYW'  msg = SY-FDAYW )
( abap = 'LANGU'  msg = SY-LANGU )
( abap = 'MANDT'  msg = SY-MANDT )
( abap = 'DATUM'  msg = SY-DATUM )
( abap = 'UZEIT'  msg = SY-UZEIT )
( abap = 'UNAME'  msg = SY-UNAME )
( abap = 'MSGID'  msg = SY-MSGID )
( abap = 'MSGTY'  msg = SY-MSGTY )
( abap = 'MSGNO'  msg = SY-MSGNO )
( abap = 'MSGV1'  msg = SY-MSGV1 )
( abap = 'MSGV2'  msg = SY-MSGV2 )
( abap = 'MSGV3'  msg = SY-MSGV3 )
( abap = 'MSGV4'  msg = SY-MSGV4 )
( abap = 'PRIMM'  msg = SY-PRIMM )
( abap = 'PRREL'  msg = SY-PRREL )
( abap = 'PRNEW'  msg = SY-PRNEW )
( abap = 'PDEST'  msg = SY-PDEST )
( abap = 'PRCOP'  msg = SY-PRCOP )
( abap = 'SPONO'  msg = SY-SPONO )
( abap = 'TLOPC'  msg = SY-TLOPC )
( abap = 'TMAXL'  msg = SY-TMAXL )
( abap = 'TOCCU'  msg = SY-TOCCU )
( abap = 'TTABC'  msg = SY-TTABC )
( abap = 'TSTIS'  msg = SY-TSTIS )
( abap = 'TTABI'  msg = SY-TTABI )
( abap = 'LINCT'  msg = SY-LINCT )
( abap = 'LINSZ'  msg = SY-LINSZ )
( abap = 'PAGCT'  msg = SY-PAGCT )
( abap = 'SFOFF'  msg = SY-SFOFF )
( abap = 'WILLI'  msg = SY-WILLI )
( abap = 'LILLI'  msg = SY-LILLI )
( abap = 'FLENG'  msg = SY-FLENG )
( abap = 'LSIND'  msg = SY-LSIND )
( abap = 'LISTI'  msg = SY-LISTI )
( abap = 'TPAGI'  msg = SY-TPAGI )
( abap = 'WINX1'  msg = SY-WINX1 )
( abap = 'WINY1'  msg = SY-WINY1 )
( abap = 'WINX2'  msg = SY-WINX2 )
( abap = 'WINY2'  msg = SY-WINY2 )
( abap = 'WINCO'  msg = SY-WINCO )
( abap = 'WINRO'  msg = SY-WINRO )
( abap = 'WINDI'  msg = SY-WINDI )
( abap = 'FOLEN'  msg = SY-FOLEN )
( abap = 'FODEC'  msg = SY-FODEC )
( abap = 'TZONE'  msg = SY-TZONE )
( abap = 'DAYST'  msg = SY-DAYST )
( abap = 'FTYPE'  msg = SY-FTYPE )
( abap = 'APPLI'  msg = SY-APPLI )
( abap = 'CCURS'  msg = SY-CCURS )
( abap = 'CCURT'  msg = SY-CCURT )
( abap = 'DEBUG'  msg = SY-DEBUG )
( abap = 'CTYPE'  msg = SY-CTYPE )
( abap = 'INPUT'  msg = SY-INPUT )
( abap = 'MODNO'  msg = SY-MODNO )
( abap = 'NEWPA'  msg = SY-NEWPA )
( abap = 'PRI40'  msg = SY-PRI40 )
( abap = 'RSTRT'  msg = SY-RSTRT )
( abap = 'WTITL'  msg = SY-WTITL )
( abap = 'CPAGE'  msg = SY-CPAGE )
( abap = 'DBNAM'  msg = SY-DBNAM )
( abap = 'PREFX'  msg = SY-PREFX )
( abap = 'FMKEY'  msg = SY-FMKEY )
( abap = 'PEXPI'  msg = SY-PEXPI )
( abap = 'PRINI'  msg = SY-PRINI )
( abap = 'PLAYO'  msg = SY-PLAYO )
( abap = 'PRBIG'  msg = SY-PRBIG )
( abap = 'PLAYP'  msg = SY-PLAYP )
( abap = 'PRLOG'  msg = SY-PRLOG )
( abap = 'PLIST'  msg = SY-PLIST )
( abap = 'PAUTH'  msg = SY-PAUTH )
( abap = 'PRDSN'  msg = SY-PRDSN )
( abap = 'PNWPA'  msg = SY-PNWPA )
( abap = 'CALLR'  msg = SY-CALLR )
( abap = 'REPI2'  msg = SY-REPI2 )
( abap = 'RTITL'  msg = SY-RTITL )
( abap = 'PRREC'  msg = SY-PRREC )
( abap = 'PRTXT'  msg = SY-PRTXT )
( abap = 'PRABT'  msg = SY-PRABT )
( abap = 'LPASS'  msg = SY-LPASS )
( abap = 'NRPAG'  msg = SY-NRPAG )
( abap = 'PAART'  msg = SY-PAART )
( abap = 'BATZS'  msg = SY-BATZS )
( abap = 'BSPLD'  msg = SY-BSPLD )
( abap = 'BREP4'  msg = SY-BREP4 )
( abap = 'BATZO'  msg = SY-BATZO )
( abap = 'BATZD'  msg = SY-BATZD )
( abap = 'BATZW'  msg = SY-BATZW )
( abap = 'BATZM'  msg = SY-BATZM )
( abap = 'CTABL'  msg = SY-CTABL )
( abap = 'DBSYS'  msg = SY-DBSYS )
( abap = 'DCSYS'  msg = SY-DCSYS )
( abap = 'MACDB'  msg = SY-MACDB )
( abap = 'SYSID'  msg = SY-SYSID )
( abap = 'OPSYS'  msg = SY-OPSYS )
( abap = 'SAPRL'  msg = SY-SAPRL )
( abap = 'CFWAE'  msg = SY-CFWAE )
( abap = 'CHWAE'  msg = SY-CHWAE )
( abap = 'SPONR'  msg = SY-SPONR )
( abap = 'WAERS'  msg = SY-WAERS )
( abap = 'CDATE'  msg = SY-CDATE )
( abap = 'SUBTY'  msg = SY-SUBTY )
( abap = 'SUBCS'  msg = SY-SUBCS )
( abap = 'GROUP'  msg = SY-GROUP )
( abap = 'FFILE'  msg = SY-FFILE )
( abap = 'DSNAM'  msg = SY-DSNAM )
( abap = 'TABID'  msg = SY-TABID )
( abap = 'TFDSN'  msg = SY-TFDSN )
( abap = 'LSTAT'  msg = SY-LSTAT )
( abap = 'MARKY'  msg = SY-MARKY )
( abap = 'SFNAM'  msg = SY-SFNAM )
( abap = 'TNAME'  msg = SY-TNAME )
( abap = 'MSGLI'  msg = SY-MSGLI )
( abap = 'ENTRY'  msg = SY-ENTRY )
( abap = 'LISEL'  msg = SY-LISEL )
( abap = 'XCODE'  msg = SY-XCODE )
( abap = 'XPROG'  msg = SY-XPROG )
( abap = 'XFORM'  msg = SY-XFORM )
( abap = 'LDBPG'  msg = SY-LDBPG )
( abap = 'TVAR0'  msg = SY-TVAR0 )
( abap = 'TVAR1'  msg = SY-TVAR1 )
( abap = 'TVAR2'  msg = SY-TVAR2 )
( abap = 'TVAR3'  msg = SY-TVAR3 )
( abap = 'TVAR4'  msg = SY-TVAR4 )
( abap = 'TVAR5'  msg = SY-TVAR5 )
( abap = 'TVAR6'  msg = SY-TVAR6 )
( abap = 'TVAR7'  msg = SY-TVAR7 )
( abap = 'TVAR8'  msg = SY-TVAR8 )
( abap = 'TVAR9'  msg = SY-TVAR9 )
( abap = 'ONCOM'  msg = SY-ONCOM )
( abap = 'WINSL'  msg = SY-WINSL )
( abap = 'STACO'  msg = SY-STACO )
( abap = 'STARO'  msg = SY-STARO )
( abap = 'HOST'  msg = SY-HOST )
( abap = 'LOCDB'  msg = SY-LOCDB )
( abap = 'LOCOP'  msg = SY-LOCOP )
( abap = 'DATLO'  msg = SY-DATLO )
( abap = 'TIMLO'  msg = SY-TIMLO )
( abap = 'ZONLO'  msg = SY-ZONLO )
).
"

"gt_data
BREAK-POINT.

实例

 发送企业微信

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 = '<h3 style="color: blue;">Header 3</h3>'.
  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.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43156252/article/details/130853207

智能推荐

flask-login-程序员宅基地

文章浏览阅读170次。创建扩展对象实例from flask_login import LoginManagerlogin_manager = LoginManager()login_manager.login_view = 'auth.login'# 上面这一句是设置登录视图的名称,如果一个未登录用户请求一个只有登录用户才能访问的视图,# 则闪现一条错误消息,并重定向到这里设置的登录视图。# 如果未设置..._python flask please log in to access this page

html怎么控制top值为0,关于vue滚动scrollTop 赋值一直为0问题-程序员宅基地

文章浏览阅读428次。Vue中document.body.scrollTop的值总为零的解决办法最近在做vue的时候监听页面滚动发现document.body.scrollTop一直为0但是发现document.body.scrollTop一直是0。查资料发现是DTD的问题。页面指定了DTD,即指定了DOCTYPE时,使用document.documentElement。页面没有DTD,即没指定DOCTYPE时,使用d..._滚动给scrolltop赋值

kingbase数据库安装教程(初步使用)(人大金仓)-程序员宅基地

文章浏览阅读2.1k次,点赞25次,收藏21次。人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。_kingbase

vue基础笔试题_vue笔试题-程序员宅基地

文章浏览阅读1.2w次,点赞20次,收藏156次。ctions 选项用来定义事件处理方法,用于处理 state 数据。actions 类似于 mutations,不同之处在于 actions 是异步执行的,事件处理函数可以接收 {commit} 对象,完成 mutation 提交,从而方便 devtools 调试工具跟踪状态的 state 变化。..............._vue笔试题

isis协议配置和详解-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏23次。isis是一种与ospf很相似的网络协议(属于动态路由协议),它被应用在巨大规模网络,如运营商以及银行等。同样的它也是基于链路状态算法,支持clnp网络,ip网络。与ospf不同的是,它是基于数据链路层报文传输,而ospf则是在ip层进行计算。它可以自动的发现远程网络,只要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自动获知新增加的网络,还可以在当前网络连接失败时找出备用路径。无类..._isis协议配置

Proxychains 手册_proxychains是什么-程序员宅基地

文章浏览阅读1.9k次。名称:Proxychains – 通过代理服务器进行连接语法:proxychains 描述:这个程序会强制所有使用特定tcp连接的客户端所引起的TCP连接走代理通道。它是一种跳板程序。这个软件和sockscap、premo、eborder异曲同工。2.0版支持SOCKS4、SOCKS5、HTTP类的代理。认证方法:socks-“user/pass”,http-“basic_proxychains是什么

随便推点

Oracle触发器原理、创建、修改、删除_用oracle创建一个instead of触发器,当在course表中删除数据,不允许在course-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏7次。本篇主要内容如下:8.1 触发器类型8.1.1 DML触发器8.1.2 替代触发器8.1.3 系统触发器8.2创建触发器8.2.1 触发器触发次序8.2.2 创建DML触发器8.2.3 创建替代(INSTEAD OF)触发器8.2.3 创建系统事件触发器8.2.4 系统触发器事件属性8.2.5 使用触发器谓词8.2.6 重新编译触发器8.3删除和使用触发器8.4触发器和数据字典8.5数据库触发器的应用举例8.6 触发器的查看8...._用oracle创建一个instead of触发器,当在course表中删除数据,不允许在course表

计算机科学与技术网上书店,计算机科学与技术毕业论文:基于web的网上书店.doc...-程序员宅基地

文章浏览阅读188次。本科毕业论文(设计)题  目  基于web的网上书店学生姓名专业名称  计算机科学与技术指导教师目录1、引言52、系统概述62.1概述62.2 开发平台73.需求分析73.1总体需求描述73.2系统总体功能图73.3系统需要实现的功能83.4业务流程图94.详细设计114.1数据库详细设计114.2建立数据库124.3页面详细设计:185用户手册225.1普通用户:225.2管理员:24参考文献3..._计算机科学与技术毕业设计网上书店

素数求和_输入一个正整数n和n个正整数,统计其中素数的和。-程序员宅基地

文章浏览阅读1.6k次。Description输入一个正整数N和N个正整数,统计其中素数的和。Input输入一个正整数N(1≤N≤100)和N个正整数(≥3),用空格分隔。Output输出所有素数,用空格隔开;再输出这些素数和。Sample Input10 4 5 8 12 13 24 34 37 20 885 1 5 8 12 13Sample Output5 13 37 s=555 13 s=..._输入一个正整数n和n个正整数,统计其中素数的和。

Oracle DB 使用RMAN创建备份2_rman 备份 生成两个文件-程序员宅基地

文章浏览阅读2.5k次。归档备份:概念归档备份:概念 如果需要在指定时间内保留联机备份,RMAN 通常会假定用户可能需要在自执行该备份以来到现在之间的任意时间执行时间点恢复。为了满足这一要求,RMAN 会在此时段内保留归档日志。但是,可能仅需要在指定的时间(如两年)内保留特定备份(并使其保持一致和可恢复)。用户不打算恢复到自执行该备份以后的某一时间点,只是希望能够正好恢复到执行该备_rman 备份 生成两个文件

JS实用技巧之断点调试详解_js断点调试-程序员宅基地

文章浏览阅读9.3k次,点赞9次,收藏58次。引言调试能力是一个程序员的生存根本,可是很多初学者却忽视调试。今天我们就来讨究一下JS的调试技巧。本文章将会详细列举JS相关的各种实用调试技巧。如果您是JS的初学者,那么这篇文章将对您有很大的帮助。为什么要调试?程序就是函数堆砌起来的,程序的运行就是函数的执行过程。而通过JS调试,我们可以更为直观的追踪到在程序运行中,函数的执行顺序,以及各个参数的变化。这样我们就可以快速的定位到问题所在。1. 什么是JS调试?在程序运行中,我们总会遇到各种bug,而通过代码的追踪代码的运行顺序从而定位到问题的过_js断点调试

记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露-程序员宅基地

文章浏览阅读1k次。记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露

推荐文章

热门文章

相关标签