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排序。