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 값이 잘 출력되면 성공
'SAP > ABAP' 카테고리의 다른 글
[ABAP] FIELD-SYMBOL 필드 심볼 (0) | 2024.08.05 |
---|---|
[ABAP] 날짜 관련 함수 (0) | 2024.08.01 |
[ABAP] MOVE-CORRESPONDING, KEEPING TARGET LINES (0) | 2024.08.01 |
[ABAP] FOR ALL ENTRIES IN 인터널 테이블과의 조인 (0) | 2024.07.30 |