一、常用代码
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下创建的所有增强实现。