본문 바로가기

SAP ABAP 개발 및 설명/SAP Function Module

Function Module 호출 및 예시


Function Module 호출 및 예시


이번엔 실제 앞에서 정리한 내용을 바탕으로 간단한 Function Module을 호출하는 방법을 보도록 하겠습니다.
추후 더 어렵거나 실제 개발했었던 내용을 올려드리도록 하게 지금은 아주 간단하게 Function Module을 만들고 전달하는 방법을 해보도록 하겠습니다.

요구사항을 가정해봅시다.

일정 기간동안 발생한 판매오더(Sales Order : SO)를 외부 시스템에 판매오더 번호(SO Numbeer), 고객 , 금액, 금액에 대항되는 통화 정도를 전송하는 Function Module이 요구되었다고 합니다.
실제 업무에 대해서는 이런 요구사항보다는 좀 더 복잡할 것 입니다. 특정 영업사원이 만든 SO라던가, 아니면 하나의 SO에 대해서 실제 납품, 선적, 대금청구까지 현황이 어떤 지 이러한 더 복합적일 것입니다.

하지만 연습이므로, 해당 내용의 Function Module을 만들어보도록 합시다.


STEP 1. SE37에서 Function Module 생성

이름을 ZSD_SO_RFC1이라는 이름으로 ZSD1라는 Function Group에 Function Module을 만들어 줍니다.

SE37 Functio Module 생성
SE37 Function Module / Group / Des 입력


STEP 2. Function Module - Attribute Tab 세팅

Remote System(외부 시스템)과 통신(Interface)를 해야되기 때문에 Processing Type에서 Remoted-Enabled Module을 ㅣ선택합니다.

Function Module : Attribute Tab 설정


STEP 3. Function Module - Import Tab 세팅

Function Module : Import Parameter 설정

입력할 수 있는 기준이 될 날짜를 From / To 변수로 하나씩 생성해줍니다.
여기서 ERDAT는 실제 내부 형식을 보면 Character형식의 8자리 글자입니다. 
RFC에서는 개발자나 컨설턴트 간의 개발 성향이 있지만, 저는 외부통신을 할때는 외부 시스템에서 사용하는 언어와 그 언어에서의 데이터 형식(Character, 날짜 타입, String, Numc 등의 숫자 타입 등)의 형식이 일치하지 않는 경우가 있습니다.
그래서 저는 보통 Import 되는 Parameter와 Export 되는 Parameter 모두 Character로 만듭니다.


STEP 4. Function Module - Export Tab 세팅

보통 Remoted-Enabled 형식이라면 필요는 없지만, 때때로 외부 Interface 경우에는 성공 / 실패에 대한 메시지를 전송해야하는 경우가 있습니다. 이러한 경우에는 Export Parameter에 해당 내용을 담을 수 있는 Parameter를 매개변수로 설정해줍니다. 

Function Module : Export Parameter 설정

 


STEP 5. Function Module - Changing Tab 세팅

먼저 사용할 구조(Structure) SE11에서 만들어줍니다.
해당 Structure에서 필드는 다 VBAK(Sales Order Header) 테이블에서 필요한 필드를 발췌하여 만들었습니다.

Function Module : Changing Tab 위한 Str 생성

단, 외부 전송할 때는, 저는 보통 Charater 필드를 사용한다고 했습니다. 그렇기 때문에, Char형식이 아닌 NETWR(정가)와 WAERK(통화)필드는 CHAR로 자리수를 맞추어 바꿔주도록 하겠습니다.

Function Module : Changing Tab 위한 Str 생성
Function Module : Changing Tab 위한 테이블유형 생성
Function Module : Changing Tab 위한 테이블유형 생성
Function Module : Changing Tab 위한 테이블유형 생성
Function Module : Changing Tab 설정


STEP 6. Function Module - Source Code 세팅

Function Module : Source Code TAB

단, 여기서 LT_VBAK의 데이터를 Remote Interface를 하기 위해서 전송해주면 되지만, SAP에서 TABLE에 저장되어있는 NETWR과 같은 데이터는 -가 숫자의 뒤에 위치합니다.(쉽게 검색할 수 있습니다).

예를 들어 SO의 금액이 -금액인 경우, -1000이 Table에 들어가 있는 것이 아닌 1000- 가 들어가는 것입니다. 이때, 실제 SAP 함수를 이용하여 -금액을 앞으로 보낼 수 있습니다.

CLOI_PUT_SIGN_IN_FRONT
CLOI_PUT_SIGN_IN_FRONT : Changing Tab 설정

Changing Parameter에 VALUE의 Type를 보면 CLIKE 유형이라고 적혀있습니다. 이 의미는 Char, Numc 등을 포함하여 Char형식의 Data Type만 VALUE 값에 넣어야한다는 뜻입니다. 이는 F, P 타입의 숫자 형식을 넣으면 바로 함수가 Dump를 일으킨다는 것을 확인할 수 있습니다.

함수를 호출하는 것은 Ctrl + F6를 누르면 됩니다.

Ctrl + F6 : 패턴 선택


Function Module : Source Code TAB

STEP 7. Function Module - 실행

해당 함수를 SE37에서 정상적으로 입력해보고 실행시켜 봅니다.
보면 IV_ERDAT_FROM은 ERDAT / IV_ERDAT_TO는 CHAR8로 했기 때문에 Char 두자리입력하는 것만큼 Input 필드의 차이가 있는 것을 확인 할 수 있습니다.

TEST 정상 CASE
TEST 정상 결과
CT_SO 결과

이럴때는 반드시 내가 유효성 체크하여 E로 처리한 경우도 확인해야합니다.

1) 날짜 입력안하였을 때

Error Test 1

2) 데이터가 존재하지 않을 때

Error Test 2


물론, 정말 단순한 RFC를 만들어 본 것입니다.
ABAP 문법 또한 HANA의 New Syntax를 쓰지않고 ECC 버젼의 ABAP을 사용하였습니다.

유효성 체크 또한 더 자세히 해야하나, 예시 형식으로 단순하게 작성해보았습니다.앞서서 제가 쓴 Function Module에 대한 이해를 돕기 위해 단순하게 만들어봤으니 도움이 되었으면 좋겠습니다.

FUNCTION ZSD_SO_RFC1.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(IV_ERDAT_FROM) TYPE  ERDAT OPTIONAL
*"     VALUE(IV_ERDAT_TO) TYPE  CHAR8 OPTIONAL
*"  EXPORTING
*"     VALUE(EV_TYPE) TYPE  CHAR1
*"     VALUE(EV_MESSAGE) TYPE  CHAR30
*"  CHANGING
*"     VALUE(CT_SO) TYPE  ZTY_T_SO_RFC1 OPTIONAL
*"----------------------------------------------------------------------

* 1) 데이터 선언 부
  RANGES : LR_ERDAT FOR VBAK-ERDAT. "ERDAT를 참조로하는 RANGE 변수 선언

  DATA : BEGIN OF LS_VBAK, "데이터를 처리할 Structue 선언
    VBELN TYPE VBAK-VBELN,
    ERDAT TYPE VBAK-ERDAT,
    NETWR TYPE VBAK-NETWR,
    WAERK TYPE VBAK-WAERK,
    VKORG TYPE VBAK-VKORG,
    VTWEG TYPE VBAK-VTWEG,
    SPART TYPE VBAK-SPART,
    KUNNR TYPE VBAK-KUNNR,
            END OF LS_VBAK.
  DATA : LT_VBAK LIKE TABLE OF LS_VBAK. "데이터를 담을 internaal Table 선언

  DATA : LS_SO TYPE LINE OF ZTY_T_SO_RFC1.

* 2) 입력된 Import Parmeter에 따른 Range 처리
* 2-1)둘 중 하나라도 없으면 Error 처리
  IF IV_ERDAT_FROM IS INITIAL OR IV_ERDAT_TO IS INITIAL.

    EV_TYPE = 'E'.
    EV_MESSAGE = 'FROM & TO 날짜를 입력하십시오'.
    EXIT.

  ENDIF.

* 2-1) Import Parameter RANGE 처리

  LR_ERDAT-SIGN = 'I'.
  LR_ERDAT-OPTION = 'BT'.
  LR_ERDAT-LOW = IV_ERDAT_FROM.
  LR_ERDAT-HIGH = IV_ERDAT_TO.

  APPEND LR_ERDAT. CLEAR LR_ERDAT.


* 3) DATA SELECT

  SELECT VBELN ERDAT NETWR WAERK VKORG VTWEG SPART KUNNR
     FROM VBAK
     INTO CORRESPONDING FIELDS OF TABLE LT_VBAK
     WHERE ERDAT IN LR_ERDAT
         AND VBTYP = 'C'. " SD 문서범주 C가 SO를 의미

  IF LT_VBAK IS INITIAL.

    EV_TYPE = 'E'.
    EV_MESSAGE = '조회되는 데이터가 없습니다'.
    EXIT.

  ENDIF.

* 4) 전송할 데이터로 핸들링하기

  LOOP AT LT_VBAK INTO LS_VBAK.

    MOVE-CORRESPONDING LS_VBAK TO LS_SO.

    CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
      CHANGING
        value         = LS_SO-NETWR. "Char로 lt_vbak의 netwr을 받은 ls_so의 netwr을 입력

    APPEND LS_SO TO CT_SO.
    CLEAR : LS_SO.

  ENDLOOP.

  IF CT_SO IS NOT INITIAL.

    EV_TYPE = 'S'.
    EV_MESSAGE = '데이터를 전송합니다'.
    EXIT.

  ENDIF.

ENDFUNCTION.
반응형