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

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所示。

 

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