abap常用代码、增强整理

一、常用代码

1、SHIFT 位移(可去零)

1、将字符串整体或者子串进行位移:

SHIFT < c > [BY < n > PLACES] [ < modes > ]
< modes > :
(1).空白, 字符串往左移一位
(2).LEFT, 字符串往左移 n 位
(3).RIGHT, 字符串往右移 n 位
例:

DATA string(12) VALUE '00ABCDEFGHIJ'.
SHIFT string.
WRITE : string.
输出: 0ABCDEFGHIJ

SHIFT string BY 2 PLACES LEFT.
WRITE : / string.
输出: BCDEFGHIJ
2、指定字符串c从子串c1进行位移:

SHIFT c UP TO c1
执行结果返回系统参数SY-SUBRC
执行成功,返回0,不匹配,返回4

DATA:shift_str1(10) VALUE 'ABCDEFGHIJ',
     shift_str2(10) VALUE 'ABCDEFGHIJ',
     s_three(3)     VALUE 'DEF',
     s_four(3)      VALUE 'DEF  '.

SHIFT shift_str1 UP TO s_three.
WRITE: / 'shift_str1=',shift_str1,',SY-SUBRC=',sy-subrc.

SHIFT shift_str2 UP TO s_four.
WRITE: /'shift_str2=',shift_str2,',SY-SUBRC=',sy-subrc.
输出:
shift_str1= DEFGHIJ    ,SY-SUBRC=     0
shift_str2= DEFGHIJ    ,SY-SUBRC=     0
3、移除字符串c左边/右边的子字符串c1:

SHIFT c LEFT/RIGHT DELETING LEADING/ TRAILING c1
执行结果返回系统参数SY-SUBRC
执行成功,返回0,不匹配,返回4

DATA: shift_string1(15) VALUE '   ABCDEFGHIJ',
      shift_string2(15) VALUE '   ABCDEFGHIJ',
      shift_string3(15) VALUE '   ABCDEFGHIJ',
      shift_string4     TYPE string,
      m1(4)             VALUE 'ABCD',
      m2(6)             VALUE 'HIJ'.
shift_string4 = shift_string1.
WRITE: / 'shift_string1=',shift_string1.
SHIFT shift_string1 LEFT DELETING LEADING space.
WRITE: / 'shift_string1=',shift_string1,'AA'.
WRITE: / 'shift_string2=',shift_string2.
SHIFT shift_string2 RIGHT DELETING TRAILING m1.
WRITE: / 'shift_string2=',shift_string2.
WRITE: / 'shift_string3=',shift_string3.
SHIFT shift_string3 RIGHT DELETING TRAILING m2.
WRITE: / 'shift_string3=',shift_string3.
WRITE: / 'shift_string4=',shift_string4.
SHIFT shift_string4 LEFT DELETING LEADING space.
WRITE: / 'shift_string4=',shift_string4,'AA'.
输出:
shift_string1=    ABCDEFGHIJ
shift_string1= ABCDEFGHIJ      AA
shift_string2=    ABCDEFGHIJ
shift_string2=    ABCDEFGHIJ
shift_string3=    ABCDEFGHIJ
shift_string3=         ABCDEFG
shift_string4=    ABCDEFGHIJ
shift_string4= ABCDEFGHIJ AA

2、FOR ALL ENTRIES IN

 1、FOR ALL ENTRIES IN
IF gt_list IS NOT INITIAL.
    SELECT * FROM ekko
      INTO CORRESPONDING FIELDS OF TABLE @gt_ekko
      FOR ALL ENTRIES IN @gt_list
      WHERE ebeln = @gt_list-ebeln.

    SELECT * FROM ekpo
    INTO CORRESPONDING FIELDS OF TABLE @gt_ekpo
    FOR ALL ENTRIES IN @gt_list
    WHERE ebeln = @gt_list-ebeln
    AND   ebelp = @gt_list-ebelp.
  ENDIF.

  SORT gt_ekko BY ebeln.
  LOOP AT gt_list ASSIGNING FIELD-SYMBOL(<lfs_list_ekko>) .
    CLEAR: gs_ekko.
    READ TABLE gt_ekko
    INTO gs_ekko
    WITH KEY ebeln = <lfs_list_ekko>-ebeln
    BINARY SEARCH.
    IF gs_ekko IS NOT INITIAL.
      <lfs_list_ekko>-ekgrp = gs_ekko-ekgrp.
    ELSE.
    ENDIF.
  ENDLOOP.

3、 MESSAGE

1、弹窗消息

这种方式提示消息不会像E类型的消息那样会终止程序,提示完消息之后会继续执行程序

"这种方式提示消息不会像E类型的消息那样会终止程序,提示完消息之后会继续执行程序
DATA: lt_msg TYPE rs_t_msg,
      ls_msg TYPE bal_s_msg.
DATA: lf_one_msg_as_sys_msg TYPE flag.
CLEAR ls_msg.
ls_msg-msgty = 'S'.
ls_msg-msgid = '00'.
ls_msg-msgno = '001'.
ls_msg-msgv1 = '消息1'.
ls_msg-msgv2 = '消息2'.
APPEND ls_msg TO lt_msg.
IF lt_msg IS NOT INITIAL.
  SORT lt_msg BY msgv1.
  DELETE ADJACENT DUPLICATES FROM lt_msg COMPARING msgv1.
  cl_epic_ui_services=>show_messages_with_alog(
  it_messages       = lt_msg
  iv_one_msg_direct = lf_one_msg_as_sys_msg ).
ENDIF.

在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/fe9a71310a47482f881b056c90e93d24.png

2、接收消息MESSAGE
DATA:e_message TYPE char100.
     CALL FUNCTION 'MESSAGE_TEXT_BUILD'
           EXPORTING
          msgid               = sy-msgid
          msgnr               = sy-msgno
          msgv1               = sy-msgv1
          msgv2               = sy-msgv2
          msgv3               = sy-msgv3
          msgv4               = sy-msgv4
        IMPORTING
          message_text_output = e_message.

MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.

  MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE sy-msgty.
  或者使用
  CALL FUNCTION 'RP_READ_T100'
             EXPORTING
                  ARBGB          = SY-MSGID
                  MSGNR          = SY-MSGNO
                  MSGV1          = SY-MSGV1
                  MSGV2          = SY-MSGV2
                  MSGV3          = SY-MSGV3
                  MSGV4          = SY-MSGV4
                  SPRSL          = SY-LANGU
             IMPORTING
                  TEXT           = MESSAGE_TEXT
             EXCEPTIONS
                  NO_ENTRY_FOUND = 1
                  OTHERS         = 2.

4、内表

1、删除数据DELETE
1)按条件删除
	DELETE itab WHERE k1=v1 AND kn=vn.2)按照工作区内容删除
	DETELE TABLE itab FROM wa.3)删除具体行
	DELETE  itab INDEX idx.4)删除具体行范围
	DELETE itab FROM idx1 TO idxn.5)删除重复数据,需先排序
	SORT itab BY col  ASCENDING/DESCENDING
	DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
	DELETE ADJACENT DUPLICATES FROM itab COMPARING col1 ….coln.
2、更改数据MODIFY
1)按内表位置修改内表数据
	MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING col1….coln].2)按where条件修改内表数据
	MODIFY itab [FROM wa] [TRANSPORTING col1….coln] WHERE cond.
3、读取数据
READ依据具体行数或字段值等条件读取某一内表的数据(使用sy-subrc判断是否成功)
(1)读取一行到工作区,with key有多行的话,只读取第一行
READ TABLE itab INTO wa [with key k1=vn].2)根据条件读取数据到工作区或内表(多条),BINARY SEARCH可以提高速度,使用前必须排序
READ TABLE itab INTO wa/itab WITH KEY k1=v1 … kn=vn [BINARY SEARCH].3)根据具体行数读取数据 
READ TABLE itab INTO wa INDEX i.
4、内表赋值
1.1 内表给内表赋值
如果要保留目标表的数据:append lines of it_tabA to lt_tabB. 
如果只是单纯的内表赋值:it_tabB[] = it_tabA[].

INSERT可以按内表的具体字段向表中插入一行或者多行数据:
INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx].
INSERT [wa INTO|INITIAL LINE INTO] TABLE itab.
INSERT LINES OF itab1 [FROM idx] [TO idx2] INTO itab2 [INDEX idx3].

要增加内表,既可逐行添加数据,也可复制另一个表格的内容。要逐行填充内表,可以使用APPEND、 COLLECT或 INSERT 语句。
1. 逐行填充内表
   1.1 要将内表仅用于存储数据,出于性能方面的考虑,建议使用 APPEND。
   1.2 要计算数字字段之和或要确保内表中没有出现重复条目,请使用 COLLECT 语句。
   1.3 要在内表现有行之前插入新行,请使用INSERT语句。
语法:
APPEND [<wa> TO|INITIAL LINE TO] <itab>.
COLLECT [<wa> INTO] <itab>.
INSERT [<wa> INTO|INITIAL LINE INTO] <itab> [INDEX  <idx>].  
2. 将内表内容复制到另一个内表中 
   2.1 要将内表行附加到另一个内表中,请使用APPEND语句。
   2.2 要将内表行插入另一个内表中,请使用INSERT语句。
   2.3 要将内表条目内容复制到另一个内表中,并且覆盖该目标表格,请使用 MOVE语句。
语法:
附加内表行:
APPEND LINES OF <itab1> [FROM <n1>] [TO <n2>] TO <itab2>.
插入内表:
INSERT LINES OF <itab1> [FROM <n1>] [TO <n2>]
INTO <itab2> [INDEX <idx>].
复制内表:
MOVE <itab1> TO <itab2>.
<itab2> = <itab1>.
3. 通过OPEN SQL将数据表中的数据按条件查询后放入内表中,
	SELECT …  INTO TABLE <itab>
    SELECT … APPENDING TABLE <itab>

5、OPENSQL

1、注意事项
使用opensQL注意事项:
1、避免在循环语句中,使用SELECT语句,而是通过FORALLENTRIESIN语句抽取数据到内表中
2、inner ioin获取数据时,尽量不要用太多的表关联,特别是大表关联,关联顺序为:小表-大表
3、查询结果应该只需要自己关系的字段,尽量少用select *
4、where 条件里面多用索引、主键,顺序也要遵循小表-大表
5、不要使用select end-select 语句,可以取出来后再处理
6、不要用<>,这样会不使用索引,可以用>or< 来替代
7、不要用order by进行排序,取出来后在内表中处理内表处理优化:
	1.尽量少用多重循环
	2.read时,可以先sort 然后用read binary search,会快很多
	3.对内表做批量修改时,可以用modifytransporting where 语句进行替换,而不用循环修改
8、内表求和,能够在sql层次上实现就用sql实现,不能实现的,在内表循环中用atend of之类的进行求和,collect直接求和在数据量很大时,效率会比较低。
9、CPU的负载可以通过优化程序来改善,在程序中尽量使用诸如SUM(SQL语句)或者COLLECT(ABAP语句)10、用append lines of *** to ***,代替loop at ****,append *** to ***, endloop。

6、ALV

1、fieldcat参数

在这里插入图片描述
decimals_out设置小数点位数,可解决fieldcat中quan类型数据在编辑后自动缩小倍数的问题or将字段设置参考字段也可解决

2、alv显示调用的方法为固定格式:
1、ALV事件响应:条目选择/业务处理/穿透
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
      rs_selfield TYPE slis_selfield.
2、ALV标题、工具栏设置
FORM frm_pf_status  USING  pt_extab TYPE slis_t_extab.
3、上传alv标题栏的logo
t_code:OAER

二、增强

1、ME2L 字段增强及搜索条件添加

(1)增加字段展示

SE11 查看已经创建的增强结构:MEREP_OUTTAB_PURCHDOC

在ZZLM_PO_APPEND中增加需要增加的字段。
在这里插入图片描述
SE18查看下这个增强点:ES_BADI_ME_REPORTING
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义类型:
在这里插入图片描述
增加页面展示:
在这里插入图片描述
增加取值
在这里插入图片描述
验证是否添加成功-更改布局中显示该字段
在这里插入图片描述
在这里插入图片描述

(2)页面增加搜索条件

进入事务代码:ME2L,点击系统-状态,出现下面界面,双击程序进入
在这里插入图片描述
选择圈中的包含程序
在这里插入图片描述
选择屏幕增加OA采购申请搜索条件:
增加字段
点击-文本要素-选择文本,在增加的字段名后,增加页面展示文本
在这里插入图片描述
双击定义的对象名称,查看引用
在这里插入图片描述
在这里插入图片描述
进入引用程序
增加查询取值条件:
在这里插入图片描述
该程序有if判断,需修改删除,实际以业务需求为准。
查看页面,验证是否成功添加搜索条件:
在这里插入图片描述

2、MB51增强

如果新增的字段不属于MSEG中的字段,比如添加一些描述字段,则可通过增强实现需求:
首先进入MB51的标准程序,点击增强按钮,然后点击菜单里面的增强选择把程序的所有隐
式增强显示出来,在下面几个地方增加如下代码:
1.在INCLUDE RM07DOCS_GENERATED里面的内表定义ITAB增强需要的这字段:
在这里插入图片描述
在FORM DATA_SELECTION_NEW 的尾部增加如下代码:
在这里插入图片描述
在FORM BUILD_RUNTIMETABLE 尾部增加如下代码
在这里插入图片描述
问题:部分自定义字段不显示描述,页面显示为空,需要自定义字段名称
这里需要注意,如果是标准表(表名长度不大于5个字符)的字段,可直接在build_runtimetable中添加;如果是自定义表字段,则最好在build_fieldcatalog添加。
在这里插入图片描述
程序RM07DOCS,新增增强点,判断需要更改的字段名,赋值需要展示的字段名称即可.
在这里插入图片描述

3、VF11/VF01增强

1、事务代码:SE80,选择函数组,V60A
2、包含文件 :LV60AFSL line:63 修改激活即可
在这里插入图片描述

3、SM30增强

1、去除修改页面的删除按钮

SE80进入,访问表维护生成器的函数组—双击屏幕编号,
进入逻辑流—在PROCESS BEFORE OUTPUT下新增MODULE,比如MODULE check_del.
在这里插入图片描述
双击该MODULE创建,并写入如下代码激活即可 (若出现excl_cua_funct未定义报错,可更换MODULE所在的包含文件位置)

*&---------------------------------------------------------------------*
*& Module CHECK_DEL OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE check_del OUTPUT.
  "隐藏删除按钮
  MOVE 'DELE' TO excl_cua_funct-FUNCTION.
  COLLECT excl_cua_funct.
ENDMODULE.

三、问题

1、解决SM30不显示字段名、不显示中文问题

se80进入,访问表维护生成器的函数组——点击屏幕——进入页面布局——选择不显示的字段名修改即可
长度显示不全:点击元素清单——修改Deflg长度即可
在这里插入图片描述

四、增强查找

场景一:查找SE18里的classic BAdI

在CL_EXITHANDLER的GET_INSTANCE方法里设置断点,然后重新运行程序,如果断点触发,就把变量exit_name的值抄下来:
在这里插入图片描述SE18, 粘贴到BAdI Name字段里去,就能看到这个增强定义下所有的实现了。
在这里插入图片描述
在这里插入图片描述

场景二 - 查找GET BADI关键字调用的新式增强

这种方式需要先以调试模式运行想要寻找增强的应用,在调试器的Break/Watchpoints里新建一个动态断点:
在这里插入图片描述
输入GET BADI, 回车:
在这里插入图片描述
动态断点创建成功,此时F8继续执行:
在这里插入图片描述如果断点停下来,双击GET BADI后的变量lr_badi, 把名称COM_MERGE_DATA_SET抄下来,这就是SE18里Enhancement Spot的BAdI定义名称。
在这里插入图片描述
把这个名称输入SE18的Enhancement Spot里,也能看到该Enhancement Spot下创建的所有增强实现。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好coder

大佬们,行行好!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值