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: BEGINOF 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,
- ENDOF POITAB.
- DATA: BEGINOF 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, "條件記錄號(定價記錄號)
- ENDOF AITAB.
- DATA: AITAB_S LIKE STANDARD TABLEOF AITABWITH HEADER LINE.
- DATA: BEGINOF 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, "物料號
- ENDOF ITAB.
- DATA: BEGINOF KITAB OCCURS 0,
- KBETR LIKE KONP-KBETR,
- KONWA LIKE KONP-KONWA,
- KPEIN LIKE KONP-KPEIN,
- KMEIN LIKE KONP-KMEIN,
- KNUMH LIKE KONP-KNUMH,
- ENDOF 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[] ISNOT INITIAL.
- 在Open SQL中使用FORALL ENTRIED IN ITAB 前,一定要檢查ITAB表是否為空,否則會造成SQL執行效率極低。
- SELECT A017~DATBI A017~DATAB A017~KNUMHA017~LIFNR A017~MATNR A017~EKORG A017~WERKS
- INTO CORRESPONDING FIELDS OFTABLE AITAB
- FROM A017
- FORALL 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[] ISNOT INITIAL.
- SELECT KONP~KBETR KONP~KONWA KONP~KPEINKONP~KMEIN KONP~KNUMH KONP~LOEVM_KO
- INTO CORRESPONDING FIELDS OFTABLE KITAB
- FROM KONP
- FORALL 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.
- ATENDOF MATNR." 行組的結尾,如果下一行行組中的任何欄位內容不同於上一行,執行語句塊中的內容。
- CLEAR COUNT.
- LOOP AT AITAB_S.
- COUNT = COUNT + 1.
- IF COUNT <= 5. "計數開始,只列出5次的資料資訊
- MOVE-CORRESPONDING AITAB_S TO POITAB.
- READTABLE ITAB WITHKEY 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.
- READTABLE KITAB WITHKEY 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所示。
至此本例已經全部完成,重要程式碼部分加註釋了,也一目瞭然。