ABAP 编程中,有很多小的技术点,不一定每一个都记得,要用到的时候到处找,现在整理了一部分,编程的时候遇到不记得的,可以过来扫一眼,看看这里有木有。
一.* 检索客户端文件路径
CALL FUNCTION 'WS_FILENAME_GET'(上传文件用)
效果图:
二.* 从路径文件名中分离出路径
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
三.* 检查路径是否存在
CALL FUNCTION 'WS_QUERY'
四.* 若为后台程序,检查是否有其他job执行
SELECTCOUNT(*)
INTO L_NUM
FROM TBTCO
WHERE JOBNAME = 'ZCV2OC000010'
AND STATUS = 'R'.
* 检查前一个JOB是否这行结束
IF L_NUM <> 1 AND SY-BATCH = 'X' .
* 前一个JOB执行没有结束
V_LOGSTR = '前一个JOB仍在执行,当先JOB被取消'.
EXIT.
ENDIF.
注释:SY-BATCH作用:如果ABAP程序在后台运行,为'x',否则为空。
五.* 上传文件(程序以SY-BATCH 判断是前台还是后台)
1.SY-BATCH = SPACE.前台,从本地获取文件:
(服务其上文件接收失败等情况时):
使用CALL FUNCTION 'WS_UPLOAD'
2.SY-BATCH = ‘X’.后台抓取文件:
首先:确认后台已上传文件:
CALL FUNCTION 'DB6_DIAG_LIST_DIRECTORY'
获得表BTCXPM:从外部程序到调用程序的日志消息;从该表中可以获取文件名称。
六. * 设置TAB键(用于上传的文件或下载的文件内容分隔符)
CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
CONSTANTS:
C_TAB TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
利用TAB分割文件
SPLIT WA_UPLOAD AT C_TAB
INTO......
七.* 日期有效性检查
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
八.* 判断是不是时间
CALL FUNCTION 'TIME_CHECK_PLAUSIBILITY'
九.* 检查并转换字符至数字
CALL FUNCTION 'RKD_CHECK_PACKED'
十.* 数据库操作
1.> MOVE-CORRESPONDING WA_DEALER TO ZCSD0003(工作区).
完整版:
TABLES :ZCOC00070.
CLEAR ZCOC00070.
ZCOC00070-WERKS = WA_LGORT-WERKS.
ZCOC00070-LGORT = WA_LGORT-LGORT.
ZCOC00070-AUDAT = SY-DATUM.
* 将该记录插入至状态控制表中。
INSERT ZCOC00070.
2.> UPDATE ZCSD0003
SET ZMMSTATUS = '2' "当前记录状态 - 完成
VBELN = L_VBELN "销售凭证编号
POSNR = WA_SALES_B-POSNR
WHERE ZFIDEALNO = WA_SALES_B-ZFIDEALNO. "DEALER接口数据编号
3.>UPDATE ZCOC00020.(单条记录)
十一. * MOVE-CORRESPONDING
MOVE-CORRESPONDING 用于将一个结构中的数据赋予另一个结构中的对应字段,只
能存一行数据。
MOVE-CORRESPONDING WA_ATO WA_B.
十二. * 生成销售凭证(生成SO)-BAPI函数
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
十三. * 有条件的LOOP。
LOOP AT I_SALES_B INTO WA_SALES_B
WHERE KUNNR = L_IN_KUNNR "客户
AND WERKS = L_IN_WERKS "工厂
AND SPART = L_IN_SPART. "部门
十四. * 有条件的READ
READ TABLE ITAB_MATNR INTO WA_MATNR WITH KEY WERKS = V_WERKS
LGORT = V_LGORT
MATNR = WA_PROCESS_D-MATNR.
(来源:尤妮佳程序ZCV2OC000080(代理商欠品处理) Line: 490, 537)
十五. * 设置REQUEST帮助。
1000选择屏幕:AT SELECTION-SCREENON VALUE-REQUEST FOR P_FNAME.
自建屏幕-逻辑流中:MODULE VBFA_CTL_MARK ON REQUEST.
十六. * MESSAGE。
--设置整个程序共用MESSAGE:REPORT ZCV2OC000080 MESSAGE-IDZOC01.
--消息的种类: A:弹出对话框,终止
E:红感叹号
I:information的弹出框
S:打钩,成功
W:警告,在1000的START-OF-SELECTION下,会和E的一样
×××:DISPLAY LIKE'W'.
X :平时运行错误
--正确使用MESSAGE:
1.> MESSAGE I001 WITH V_LOGSTR.(程序开头已定义消息类,I:弹出消息框)
MESSAGE V_MESSAGE TYPE 'I' DISPLAY LIKE 'E'.
(弹出错误消息框)
2.> MESSAGE S001 WITH V_LOGSTR DISPLAYLIKE 'E'.
(START-OF-SELECTION.下:避免屏幕功能置灰,即不中断)
3.> MESSAGE TEXT-M01 TYPE 'S'. (自定义消息内容)
4.> MESSAGE I001 WITH SY-REPIDINTO V_LOGSTR.
(将MESSAGE内容写入变量)
十七. * 拼接字符。
CONCATENATE WA_LGORT-WERKS '/' WA_LGORT-LGORT INTO V_LOGSTR.
十八. * 数据加锁-锁表,解锁。
CALL FUNCTION 'ENQUEUE_EZCOC00070'
CALL FUNCTION 'DEQUEUE_EZCOC00070'
十九. * 查询内表中有条件的单条记录。
READ TABLE ITAB_MATNR INTO WA_MATNR WITH KEY AUDAT = SY-DATUM
MATNR = WA_DATA_D-MATNR
WERKS = V_WERKS
LGORT = V_LGORT.
二十. * 聚集附加-COLLECT语句
相同关键字的数据行不重复出现,非关键字段(数字类型)进行累加。
COLLECT WA_MATNR INTO ITAB_MATNR.
二十一. * 取上个月的第一天或最后一天
CALL FUNCTION 'FIMA_DATE_CREATE'
二十二. * Ranges
RANGES:
S_WERKS FOR T001W-WERKS.
S_WERKS-SIGN = 'I'.
S_WERKS-OPTION = 'EQ'.
S_WERKS-LOW = 'XXX'.
APPENDS_WERKS.
二十三. * 查询,插入同一个内表
SELECT B~VBELN "订单号
B~MATNR "物料
B~KBMENG AS QTY "数量
INTO TABLE ITAB_UNCLEAR_TEMP
SELECT B~VBELN "订单号
B~MATNR "物料
B~KBMENG AS QTY "数量
APPENDING TABLE ITAB_UNCLEAR_TEMP
二十四. * CHECK,CONTINUE,RETURN,EXIT
Check .... 可加条件,不符合条件则跳出程序或当前循环进入下一条(在循环中时),
符合条件则继续。
Continue. 不可加条件,跳出当前循环,进入下一条。
EXIT. 不可加条件,跳出循环。
Return 不管有没有循环,直接跳出FORM。
二十五. * 返回--上级屏幕,初始屏幕等。
返回代码程序:LEAVE PROGRAM.
返回上级屏幕:
START-OF-SELECTION. ->LEAVE LIST-PROCESSING
AT SELECTION-SCREEN.-> LEAVE TO SCREEN 1000.(需指定屏幕号)
二十六. * LOOP 中的MODIFY
MODIFY ITAB_DATA_D FROM WA_PROCESS_D INDEX L_INDEX_D.
(L_INDEX_D=SY-TABIX)
MODIFY ITAB_H FROM WA_H INDEX L_INDEX_H TRANSPORTING DO_FLG.
二十七. * 格式化销售订单号-BAPI函数
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
二十八. * 修改订单-BAPI函数
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
二十九. * COMMIT WORK ,ROLLBACK WORK
COMMIT WORK AND WAIT .
WAIT UP TO 3 SECONDS.
ROLLBACK WORK.
三十. * 弹出对话框
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
CALL FUNCTION 'POPUP_TO_CONFIRM'
(来源:尤妮佳程序ZDIVAP_E03_01 Line:578)
三十一. * AT NEW / AT END OF。。。 ENDAT.
AT FIRST/LAST 。。。 ENDAT.
AT NEW F .
F是内表的一个字段,当f字段或者f字段左边的字段内容发生变化时该事件后面的语句都会执行。
SORT RANGES BY LINENO. (LINENO 是 RANGES中的第一个字段)
LOOPAT RANGES.
AT NEW LINENO.“RANGES中LINENO 字段(某个值)第一次出现时:
REFRESH ARANGE.
ENDAT.
CLEAR: ARANGE.
MOVE-CORRESPONDING RANGES TO ARANGE.
APPEND ARANGE.
AT END OF LINENO.“RANGES中LINENO 字段(某个值)最后一次出现时:
PERFORM FILL_CONTENT USING RANGES-LINENO.
ENDAT.
ENDLOOP.
SORT GT_INITIAL_NUM BY NUM. (NUM 是该内表中的第一个字段)
LOOP AT GT_INITIAL_NUM.
GT_DATA-ZERO_01 = GT_DATA-ZERO_01 + GT_INITIAL_NUM-ZERO_01.
AT END OF NUM.
PERFORM F_FILL_CELL USING GT_INITIAL_NUM-NUM 8 GT_DATA-ZERO_01.
CLEAR GT_DATA.
ENDAT.
ENDLOOP.
三十二. * SELECT SINGLE( 放入临时变量,可避
EndSelect. 不过要确保是单条记录)
UP TO n ROWS (限制取最上面 n 条记录)
SELECT SINGLE VBELN
FROM VBAK [UP TO n ROWS]
INTO WA_VBELN “临时变量 [UP TO n ROWS]
WHERE ...
三十三. * DELETEADJACENT DUPLICATES FROM <table>
DELETEADJACENT DUPLICATES FROM I_VBELN
COMPARING VBELV VBTYP.
功能:删除临近,相同VBELV VBTYP的行
注意:使用该语句前要先按VBELV VBTYP排序。
转载于:https://blog.51cto.com/sap2013/1254820