SAP/ABAP

[ABAP] RFC

jipgagosipda 2024. 8. 9. 09:08

RFC(Remote Function Call)

: 웹 데이터를 SAP에서 송수신할 수 있는 기능을 하는 Function

 

웹과 연동이 필요한 프로세스의 경우 RFC를 필수로 사용한다.

 


 

Case: 임시전표 삭제 RFC 생성

웹에서 회사코드, 회계연도, 전표번호를 받아온 후 SAP에서 해당 전표를 찾아 삭제하는 RFC를 생성해보자.

 

1. RFC 생성(Import, Export 등의 값 정의)

2. 소스코드 작성 - 삭제할 전표의 회사코드, 전표번호, 회계연도를 웹에서 입력받기

3. 해당 정보를 조건으로 삭제할 전표 셀렉

4. DELETE 펑션 태워서 삭제

5. 결과여부 메시지 출력

 


<RFC 생성>

Function 그룹 우클릭 -> Create

Attributes

- Short Text에 내역 작성

- Processing Type: RFC의 경우 반드시 Remote- Enabled Module로 설정 !

 

Import

- 웹에서 받아올 값 정의

- '참조유형'에서 참조할 필드 정의

- '선택' 체크 해제 시 필수 필드로 설정됨

- RFC는 반드시 'Pass by Value' 체크

 

Export

- 결과값 정의

- '참조유형'에서 참조할 필드 정의

- 'Pass by Value' 체크

- 보통 메시지 타입(E_TYPE), 메시지 텍스트(E_MSG)는 고정으로 정의됨. Function 결과를 출력하는 변수들임.

 

Changing

- Import, Export 둘 다 가능한 변수 정의

 

Tables

- 테이블 정의.  Import, Export 둘 다 가능함.

- Associated Type에서 참조할 테이블/스트럭쳐 정의

 

Source code

- 로직 구현

FUNCTION ZWEBDOCU_DOCUMENT_DELETE_IF.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(I_BUKRS) TYPE  BKPF-BUKRS
*"     VALUE(I_GJAHR) TYPE  BKPF-GJAHR
*"     VALUE(I_BELNR) TYPE  BKPF-BELNR
*"     VALUE(I_MODE) TYPE  RFPDO-ALLGAZMD DEFAULT 'N'
*"  EXPORTING
*"     VALUE(E_TYPE) TYPE  BAPI_MTYPE
*"     VALUE(E_MSG) TYPE  BAPI_MSG
*"     VALUE(E_BELNR) TYPE  BELNR_D
*"     VALUE(E_GJAHR) TYPE  GJAHR
*"----------------------------------------------------------------------
  DATA: LS_BKPF TYPE BKPF,             "전표 헤더 strc
        LT_BKPF LIKE TABLE OF LS_BKPF. "전표 헤더 itab

  DATA : LS_SAVE_H TYPE ZFITW001,                   "WEB전표 헤더 strc
         LT_SAVE_H TYPE STANDARD TABLE OF ZFITW001. "WEB전표 헤더 itab

  DATA : LV_PARKMSG LIKE E_MSG. "메시지

  CLEAR:   LS_BKPF, LS_SAVE_H, LV_PARKMSG.
  REFRESH: LT_BKPF, LT_SAVE_H.

  "삭제할 임시전표 Select
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE LT_BKPF
    FROM BKPF
   WHERE BUKRS = I_BUKRS "웹에서 받아온 조건들
     AND BELNR = I_BELNR
     AND GJAHR = I_GJAHR.

  READ TABLE LT_BKPF INTO LS_BKPF INDEX 1. "Read

  IF LS_BKPF-BSTAT = 'V'. "임시전표

    GET TIME STAMP FIELD LS_SAVE_H-TSTAMP. "web전표 헤더 테이블 키값인 타임스탬프 생성

      CALL FUNCTION 'ZWEBDOCU_DOCUMENT_DELETE' "임시전표 삭제
        EXPORTING
            I_BUKRS   = I_BUKRS
            I_BELNR   = I_BELNR
            I_GJAHR   = I_GJAHR
            I_BDCMODE = I_MODE
        IMPORTING
            E_TYPE = E_TYPE
            E_MSG  = E_MSG.

      E_BELNR = I_BELNR.
      E_GJAHR = I_GJAHR.

      IF E_TYPE = 'E'. "전표 삭제 실패
        CONCATENATE '전표번호' E_BELNR '삭제에 실패했습니다.' INTO LV_PARKMSG SEPARATED BY SPACE.
        E_MSG = LV_PARKMSG.

      ELSE. "전표 삭제 성공

        MOVE : I_BUKRS TO LS_SAVE_H-I_BUKRS,
               I_BELNR TO LS_SAVE_H-BELNR,
               I_GJAHR TO LS_SAVE_H-GJAHR,
               E_TYPE  TO LS_SAVE_H-RETURNTYPE,
               E_MSG   TO LS_SAVE_H-RETURNMSG.

        APPEND LS_SAVE_H TO LT_SAVE_H.

        MODIFY ZFITW001 FROM TABLE LT_SAVE_H.  "수행결과 테이블 업데이트

      ENDIF.

  ELSE. "임시전표 아님

    E_BELNR = I_BELNR.
    E_GJAHR = I_GJAHR.
    E_TYPE = 'E'.

    CONCATENATE '임시전표 상태인 회계연도' E_GJAHR '전표번호'  E_BELNR'가 없습니다.' INTO LV_PARKMSG
                                                                                     SEPARATED BY SPACE.
    E_MSG = LV_PARKMSG.

  ENDIF.

ENDFUNCTION.

 

전표 삭제 Function

FUNCTION ZWEBDOCU_DOCUMENT_DELETE.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(I_BUKRS) TYPE  BKPF-BUKRS
*"     REFERENCE(I_GJAHR) TYPE  BKPF-GJAHR
*"     REFERENCE(I_BELNR) TYPE  BKPF-BELNR
*"     REFERENCE(I_BDCMODE) TYPE  RFPDO-ALLGAZMD DEFAULT 'N'
*"  EXPORTING
*"     REFERENCE(E_TYPE) TYPE  BAPI_MTYPE
*"     REFERENCE(E_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------
  DATA: LV_TCODE LIKE SY-TCODE,
            LV_LINE  LIKE SY-TABIX.
*  DATA : BDCDATA   TYPE BDCDATA    OCCURS 0 WITH HEADER LINE.
  DATA : BEGIN OF MESSTAB OCCURS 0.
          INCLUDE STRUCTURE BDCMSGCOLL.
  DATA : END   OF MESSTAB.

    CLEAR : BDCDATA,  BDCDATA[],
            MESSTAB, MESSTAB[],
            LV_TCODE.
    SELECT SINGLE TCODE FROM BKPF INTO LV_TCODE
     WHERE BUKRS = I_BUKRS
       AND GJAHR = I_GJAHR
       AND BELNR = I_BELNR.

    PERFORM DYNPRO  USING : 'X' 'SAPMF05V'       '0100',
                             ' ' 'BDC_OKCODE'     '=ENTR',
                             ' ' 'RF05V-BUKRS'    I_BUKRS,
                             ' ' 'RF05V-BELNR'    I_BELNR,
                             ' ' 'RF05V-GJAHR'    I_GJAHR.

    IF LV_TCODE = 'FV60'.        " ENJOY AP
      PERFORM DYNPRO USING : 'X' 'SAPMF05A' '1100',
                             ' ' 'BDC_OKCODE' '=9-PD'.
    ELSEIF LV_TCODE = 'FV70'.    " ENJOY AR
      PERFORM DYNPRO USING :  'X' 'SAPMF05A' '1200',
                              ' ' 'BDC_OKCODE' '=9-PD'.
    ELSEIF LV_TCODE = 'FV50'.    " ENJOY GL
      PERFORM DYNPRO USING : 'X' 'SAPMF05A' '1001',
                             ' ' 'BDC_OKCODE' '=9-PD'.
    ELSE.                              " GENERAL
      PERFORM DYNPRO USING : 'X' 'SAPLF040' '0700',
                             ' ' 'BDC_OKCODE' '=BL'.
    ENDIF.

    PERFORM DYNPRO USING : 'X' 'SAPLSPO1'       '0200',
                           ' ' 'BDC_OKCODE'     '=YES'.

    CALL TRANSACTION 'FBV0' USING  BDCDATA
                              MODE    I_BDCMODE
                              UPDATE   'S'
                              MESSAGES INTO MESSTAB.

    CLEAR LV_LINE.
    DESCRIBE TABLE MESSTAB LINES LV_LINE.

    IF LV_LINE <> 0.
      READ TABLE MESSTAB INDEX LV_LINE.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          MSGID               = MESSTAB-MSGID
          MSGNR               = MESSTAB-MSGNR
          MSGV1               = MESSTAB-MSGV1
          MSGV2               = MESSTAB-MSGV2
          MSGV3               = MESSTAB-MSGV3
          MSGV4               = MESSTAB-MSGV4
        IMPORTING
          MESSAGE_TEXT_OUTPUT = E_MSG.    "MessageText
       E_TYPE          = MESSTAB-MSGTYP.

    ENDIF.

ENDFUNCTION.

 

소스코드 작성 후 Import 값 넣고 실행시켜본다.

디버깅으로 코드 잘 실행되는지 확인해보는 과정도 필요

원하는 Export 값이 잘 출력되면 성공