1. 程式人生 > >sap中rfc例項建立

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中加入程式程式碼:

  1. DATA: BEGINOF POITABOCCURS 0,  
  2.      EBELN LIKE EKKO-EBELN,   "採購訂單號  
  3.      EBELP LIKE EKPO-EBELP,   "採購訂單行專案  
  4.      LIFNR LIKE EKKO-LIFNR,   "供應商  
  5.      EKORG LIKE EKKO-EKORG,  "採購組織  
  6.      WERKS LIKE EKPO-WERKS,  "工廠  
  7.      MATNR LIKE EKPO-MATNR,  "物料號  
  8.      KSCHL LIKE A017-KSCHL, "條件型別  
  9.      DATAB LIKE A017-DATAB, "有效期從  
  10.      DATBI LIKE A017-DATBI, "有效期到  
  11.      KNUMH LIKE A017-KNUMH, "條件記錄號(定價記錄號)  
  12.      KBETR LIKE KONP-KBETR,  
  13.      KONWA LIKE KONP-KONWA,  
  14.      KPEIN LIKE KONP-KPEIN,  
  15.      KMEIN LIKE KONP-KMEIN,  
  16.     ENDOF POITAB.  
  17.   DATA: BEGINOF AITAB OCCURS 0,  
  18.      LIFNR LIKE A017-LIFNR, "供應商  
  19.      EKORG LIKE A017-EKORG, "採購組織  
  20.      WERKS LIKE A017-WERKS, "工廠  
  21.      MATNR LIKE A017-MATNR, "物料號  
  22.      DATAB LIKE A017-DATAB, "有效期從  
  23.      DATBI LIKE A017-DATBI, "有效期到  
  24.      KSCHL LIKE A017-KSCHL, "條件型別  
  25.      KNUMH LIKE A017-KNUMH, "條件記錄號(定價記錄號)  
  26.     ENDOF AITAB.  
  27.   DATA: AITAB_S LIKE STANDARD TABLEOF AITABWITH HEADER LINE.  
  28.   DATA: BEGINOF ITAB OCCURS 0,  
  29.     EBELN LIKE EKKO-EBELN,   "採購訂單號  
  30.     EBELP LIKE EKPO-EBELP,    "採購訂單行專案  
  31.     LIFNR LIKE EKKO-LIFNR,   "供應商  
  32.     EKORG LIKE EKKO-EKORG,  "採購組織  
  33.     WERKS LIKE EKPO-WERKS,  "工廠  
  34.     MATNR LIKE EKPO-MATNR,  "物料號  
  35.     ENDOF ITAB.  
  36.   DATA: BEGINOF KITAB OCCURS 0,  
  37.     KBETR LIKE KONP-KBETR,  
  38.     KONWA LIKE KONP-KONWA,  
  39.     KPEIN LIKE KONP-KPEIN,  
  40.     KMEIN LIKE KONP-KMEIN,  
  41.     KNUMH LIKE KONP-KNUMH,  
  42.    ENDOF KITAB.  
  43.   " 搜尋出採購訂單號,供應商,採購組織,物料號,工廠  
  44.   SELECT EKKO~EBELN EKKO~LIFNR  
  45.          EKKO~EKORG EKPO~WERKS EKPO~MATNRekpo~ebelp  
  46.          INTO CORRESPONDING FIELDS OF TABLEITAB  
  47.     FROM EKPO JOIN EKKO ON EKKO~EBELN =EKPO~EBELN  
  48.     WHERE EKKO~EBELN = IP_EBELN.  
  49.   "搜尋出生效起和終日期,供應商,採購組織,物料號,工廠  
  50.   IF ITAB[] ISNOT INITIAL.      
  51. Open SQL中使用FORALL ENTRIED IN ITAB 前,一定要檢查ITAB表是否為空,否則會造成SQL執行效率極低。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  52.     SELECT A017~DATBI A017~DATAB A017~KNUMHA017~LIFNR A017~MATNR A017~EKORG A017~WERKS  
  53.       INTO CORRESPONDING FIELDS OFTABLE AITAB  
  54.       FROM A017  
  55.       FORALL ENTRIES IN ITAB  
  56.       WHERE A017~LIFNR = ITAB-LIFNR  
  57.       AND A017~MATNR = ITAB-MATNR  
  58.       ANDA017~EKORG = ITAB-EKORG  
  59.       AND A017~WERKS = ITAB-WERKS.  
  60.   ENDIF.  
  61.   "搜尋出價格,單位等  
  62.   IF AITAB[] ISNOT INITIAL.  
  63.     SELECT KONP~KBETR KONP~KONWA KONP~KPEINKONP~KMEIN KONP~KNUMH KONP~LOEVM_KO  
  64.       INTO CORRESPONDING FIELDS OFTABLE KITAB  
  65.       FROM KONP  
  66.       FORALL ENTRIES IN AITAB  
  67.       WHERE KONP~KNUMH = AITAB-KNUMH  
  68.         AND KONP~LOEVM_KO <> 'X'.  
  69.   ENDIF.  
  70.   DATA: COUNT TYPE I. "定義變數COUNT,計數  
  71.   COUNT = 0.  
  72.   SORT AITAB BY LIFNR EKORG WERKS MATNR DATAB DESCENDING . "對AITAB內表排序--倒序
  73.   LOOP AT AITAB.  
  74.     MOVE-CORRESPONDING AITAB TO AITAB_S.   "將內表AITAB的值轉移給AITAB_S  
  75.     APPEND AITAB_S.  
  76.     ATENDOF MATNR." 行組的結尾,如果下一行行組中的任何欄位內容不同於上一行,執行語句塊中的內容。  
  77.       CLEAR COUNT.  
  78.       LOOP AT AITAB_S.  
  79.         COUNT = COUNT + 1.  
  80.         IF COUNT <= 5.  "計數開始,只列出5次的資料資訊  
  81.           MOVE-CORRESPONDING AITAB_S TO POITAB.  
  82.           READTABLE ITAB WITHKEY  MATNR = AITAB_S-MATNR LIFNR = AITAB_S-LIFNREKORG = AITAB_S-EKORG WERKS = AITAB_S-WERKS.  
  83.           IF SY-SUBRC = 0.  
  84.             MOVE-CORRESPONDING ITAB TO POITAB.  
  85.           ENDIF.  
  86.           READTABLE KITAB WITHKEY  KNUMH = AITAB_S-KNUMH.  "通過條件記錄號讀出價格  
  87.           IF SY-SUBRC = 0.  
  88.             MOVE-CORRESPONDING KITAB TO POITAB.  
  89.           ENDIF.  
  90.           APPEND POITAB.  
  91.           CLEAR POITAB.  
  92.         ENDIF.  
  93.       ENDLOOP.  
  94.       CLEAR AITAB_S. " 將內表重置為填充前的狀態,這意味著該內表將不包含任何行  
  95.       REFRESH AITAB_S. " 如果內表有表頭行,該語句並沒有將表頭行的內容清空。  
  96.     ENDAT.  
  97.   ENDLOOP.  
  98.   LOOP AT POITAB. "因為POITAB內表和ZPO_INFO有相同欄位,且欄位數量不對等,所以用LOOP AT 做整體賦值操作  
  99.     MOVE-CORRESPONDING POITAB TO ZPO_INFO.  
  100.     APPEND ZPO_INFO.  
  101.   ENDLOOP.  


Function程式編寫完成後可直接對其進行測試,儲存Function後並激活,啟用時要順帶將涉及本Function的所有都選中。如圖1-10所示。


單擊編輯介面執行按鈕,如圖1-11所示。


11)             Function的執行及資料檢視


可以選擇儲存按鈕將此手工輸入儲存起來,如圖1-12所示。


單擊執行,因為此採購訂單有3條資訊記錄,3條資訊記錄有過很多次改價。程式碼中我們只取離現在日期最近的5條,所以結果顯示15條資料,結果如圖1-13所示。單擊結果如圖1-14所示。

 

至此本例已經全部完成,重要程式碼部分加註釋了,也一目瞭然。