一步一步教你寫SAP RFC (實戰專案)
函式目的:OA通過讀取採購訂單號獲取物料號最近5次變價記錄,結果如圖1-1所示
1) 通過TCode:SE37,我們既可以進入RFC的開發初始介面,如圖1-2所示。
2) 與Report不同的是,新建RFC程式前必須先定義一個FuncitonGroup,一個Group下可包含多個Function,建立Function Group的命令的具體操作路徑為:Goto-Function groups-Create group,如圖1-2所示。
3) 單擊Creategroup 命令後將彈出Create Function Group對話方塊,要求輸入自定義的Function group 名稱及描述,如圖1-3所示。
4) 單擊儲存按鈕後系統進入CreateObject Directiory Enter 對話方塊,該介面中需要輸入開發類並選擇儲存型別,STMP表示儲存本地類,也可單擊本地物件按鈕選擇儲存在本地,如圖1-4所示。
5) 選擇本地物件按鈕儲存Functiongroup,系統返回初始介面。
輸入自定義Function名稱:Z_RFC_SHIZHANSTUDY,單擊Create按鈕,SAP將彈出Group設定屬性對話方塊,如圖1-5所示。
6) 輸入本例所建Function Group及描述,單擊Save按鈕儲存定義。
到此為止,該Function已被建立成功,系統進入初始介面。可以看到系統自動生成了預程式碼,但是還不具備任何功能,需要對Function的輸入輸出引數及資料處理邏輯程式進行設定,如圖1-6所示。
7) Function編輯器共分為7個頁面,在Attributes屬性設定視窗,設定如圖1-7所示。允許該Function被SAP及非SAP程式呼叫。
8) Import為資料輸入介面,其介面引數可以為單個變數或者為一個結構體。本例為單個變數,如圖1-8所示。
9) Tables可同時作為輸入輸出介面,其引數可為單個變數或Struct或內表。本例為Struct,如圖1-9所示。本例建立結構步驟省略
10) 單擊Source Code選項卡切換到ABAP程式碼編輯視窗,介面中所定義的引數都是該Function程式碼的私有變數,可以在Function中直接引用,由此實現與外部程式資料交換。
在Source code中加入程式程式碼:
DATA: BEGIN OF POITABOCCURS 0,
EBELN LIKE EKKO-EBELN, "採購訂單號
EBELP LIKE EKPO-EBELP, "採購訂單行專案
LIFNR LIKE EKKO-LIFNR, "供應商
EKORG LIKE EKKO-EKORG, "採購組織
WERKS LIKE EKPO-WERKS, "工廠
MATNR LIKE EKPO-MATNR, "物料號
KSCHL LIKE A017-KSCHL, "條件型別
DATAB LIKE A017-DATAB, "有效期從
DATBI LIKE A017-DATBI, "有效期到
KNUMH LIKE A017-KNUMH, "條件記錄號(定價記錄號)
KBETR LIKE KONP-KBETR,
KONWA LIKE KONP-KONWA,
KPEIN LIKE KONP-KPEIN,
KMEIN LIKE KONP-KMEIN,
END OF POITAB.
DATA: BEGIN OF AITAB OCCURS 0,
LIFNR LIKE A017-LIFNR, "供應商
EKORG LIKE A017-EKORG, "採購組織
WERKS LIKE A017-WERKS, "工廠
MATNR LIKE A017-MATNR, "物料號
DATAB LIKE A017-DATAB, "有效期從
DATBI LIKE A017-DATBI, "有效期到
KSCHL LIKE A017-KSCHL, "條件型別
KNUMH LIKE A017-KNUMH, "條件記錄號(定價記錄號)
END OF AITAB.
DATA: AITAB_S LIKE STANDARD TABLE OF AITABWITH HEADER LINE.
DATA: BEGIN OF ITAB OCCURS 0,
EBELN LIKE EKKO-EBELN, "採購訂單號
EBELP LIKE EKPO-EBELP, "採購訂單行專案
LIFNR LIKE EKKO-LIFNR, "供應商
EKORG LIKE EKKO-EKORG, "採購組織
WERKS LIKE EKPO-WERKS, "工廠
MATNR LIKE EKPO-MATNR, "物料號
END OF ITAB.
DATA: BEGIN OF KITAB OCCURS 0,
KBETR LIKE KONP-KBETR,
KONWA LIKE KONP-KONWA,
KPEIN LIKE KONP-KPEIN,
KMEIN LIKE KONP-KMEIN,
KNUMH LIKE KONP-KNUMH,
END OF KITAB.
" 搜尋出採購訂單號,供應商,採購組織,物料號,工廠
SELECT EKKO~EBELN EKKO~LIFNR
EKKO~EKORG EKPO~WERKS EKPO~MATNRekpo~ebelp
INTO CORRESPONDING FIELDS OF TABLEITAB
FROM EKPO JOIN EKKO ON EKKO~EBELN =EKPO~EBELN
WHERE EKKO~EBELN = IP_EBELN.
"搜尋出生效起和終日期,供應商,採購組織,物料號,工廠
IF ITAB[] IS NOT INITIAL.
在Open SQL中使用FOR ALL ENTRIED IN ITAB 前,一定要檢查ITAB表是否為空,否則會造成SQL執行效率極低。
SELECT A017~DATBI A017~DATAB A017~KNUMHA017~LIFNR A017~MATNR A017~EKORG A017~WERKS
INTO CORRESPONDING FIELDS OF TABLE AITAB
FROM A017
FOR ALL ENTRIES IN ITAB
WHERE A017~LIFNR = ITAB-LIFNR
AND A017~MATNR = ITAB-MATNR
ANDA017~EKORG = ITAB-EKORG
AND A017~WERKS = ITAB-WERKS.
ENDIF.
"搜尋出價格,單位等
IF AITAB[] IS NOT INITIAL.
SELECT KONP~KBETR KONP~KONWA KONP~KPEINKONP~KMEIN KONP~KNUMH KONP~LOEVM_KO
INTO CORRESPONDING FIELDS OF TABLE KITAB
FROM KONP
FOR ALL ENTRIES IN AITAB
WHERE KONP~KNUMH = AITAB-KNUMH
AND KONP~LOEVM_KO <> 'X'.
ENDIF.
DATA: COUNT TYPE I. "定義變數COUNT,計數
COUNT = 0.
SORT AITAB BY LIFNR EKORG WERKS MATNR DATAB DESCENDING . "對AITAB內表排序--倒序
LOOP AT AITAB.
MOVE-CORRESPONDING AITAB TO AITAB_S. "將內表AITAB的值轉移給AITAB_S
APPEND AITAB_S.
AT END OF MATNR." 行組的結尾,如果下一行行組中的任何欄位內容不同於上一行,執行語句塊中的內容。
CLEAR COUNT.
LOOP AT AITAB_S.
COUNT = COUNT + 1.
IF COUNT <= 5. "計數開始,只列出5次的資料資訊
MOVE-CORRESPONDING AITAB_S TO POITAB.
READ TABLE ITAB WITH KEY MATNR = AITAB_S-MATNR LIFNR = AITAB_S-LIFNREKORG = AITAB_S-EKORG WERKS = AITAB_S-WERKS.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING ITAB TO POITAB.
ENDIF.
READ TABLE KITAB WITH KEY KNUMH = AITAB_S-KNUMH. "通過條件記錄號讀出價格
IF SY-SUBRC = 0.
MOVE-CORRESPONDING KITAB TO POITAB.
ENDIF.
APPEND POITAB.
CLEAR POITAB.
ENDIF.
ENDLOOP.
CLEAR AITAB_S. " 將內表重置為填充前的狀態,這意味著該內表將不包含任何行
REFRESH AITAB_S. " 如果內表有表頭行,該語句並沒有將表頭行的內容清空。
ENDAT.
ENDLOOP.
LOOP AT POITAB. "因為POITAB內表和ZPO_INFO有相同欄位,且欄位數量不對等,所以用LOOP AT 做整體賦值操作
MOVE-CORRESPONDING POITAB TO ZPO_INFO.
APPEND ZPO_INFO.
ENDLOOP.
Function程式編寫完成後可直接對其進行測試,儲存Function後並激活,啟用時要順帶將涉及本Function的所有都選中。如圖1-10所示。
單擊編輯介面執行按鈕,如圖1-11所示。
11) Function的執行及資料檢視
可以選擇儲存按鈕將此手工輸入儲存起來,如圖1-12所示。
單擊執行,因為此採購訂單有3條資訊記錄,3條資訊記錄有過很多次改價。程式碼中我們只取離現在日期最近的5條,所以結果顯示15條資料,結果如圖1-13所示。單擊結果如圖1-14所示。
至此本例已經全部完成,重要程式碼部分加註釋了,也一目瞭然。