IT WORK/SAP FI and ABAP

[SAP FI / ABAP] oData를 이용하여 비용전표 전기하기

Bathildis 2025. 2. 19. 17:13
반응형

 

보통 전표는 헤더/라인아이템으로 이루어져있기 때문에, 테이블이 포함된 구조인 Deep Structure를 미리 생성한다.

 

전표 라인 Structure인 YDOCITEM을 먼저 생성

 

그리고 해당 Line type을 이용하여 테이블유형 YDOCITEMS 생성

 

그리고 YDOCITEMS를 포함한 헤더 구조인 YDOCHEADER를 생성했다.

 

SEGW로 가서 신규 프로젝트를 생성해준다.

패키지에 포함시키거나 로컬오브젝트 모두 가능

 

 

 

생성이 되면 Data Model 폴더에서 임포트 -> DDIC 구조 선택

 

사용할 이름을 정해주고, 아까 만든 HEADER를 ABAP Structure에 넣어주고 다음.

 

이렇게 Table 구조로 나와야 Deep Structure인 것입니다..

 

모든 필드가 정상적으로 불려와있는지 확인한다. 여기서 Is Key는 그냥 한개씩만 있으면 되고 필수값이라고 한다. 달라도 멀쩡하게 잘 되기 때문에 정말 key가 있는 상태가 아니라면 아무거나 하나씩 지정해줘도 됨.

 

이제 헤더와 아이템을 연결해주기 위해 Associations 폴더 우클릭 후 생성

 

연관성 이름은 알아서 지어주고, 왼쪽에 Header타입 가져올 때 사용한 이름을, 오른쪽은 아이템 라인을 지정해준다. (F4누르면 있음) 헤더 1 : 라인 n이기 때문에 카디널리티는 위 화면처럼 주었음.

 

그냥 각각 맨 처음 컬럼 지정해주었음.

 

Finish

 

이제 지정이 끝났으면 오브젝트 생성을 해준다. 여기에 나오는 이름은 변경해도 무방하지만 그냥 그대로 써준다.

 

이제 서비스를 올리러 가줘야 하는데 서비스 이름이 기억이 안난다면 Runtime Artfacts 폴더에 *SRV로 끝나는 것을 복사

 

/IWFND/MAINT_SERVICE - 서비스 활성화 및 유지보수로 이동해서 "서비스 추가"

 

앞에서 생성한 GW이름과 시스템 별칭 입력 후 서비스 가져오기 -> 체크 후 선택한 서비스 추가 (시스템 별칭은 시스템마다 다르기 때문에 본인 시스템 별칭은 본인이 찾기)

 

위와 같이 뜨면 확인

 

상태가 정상적으로 올라왔으면 SAPGateway클라이언트를 클릭 

 

생성한 서비스의 메타데이터 가져오게 한 뒤 status_code가 200이면 정상적으로 뜬것임.

 

PUT 쓸때는 토큰 오류 발생하는데 SICF가서 계증구조유형 SERVICE로 실행한 뒤 저 위의 경로로 가서 GUI구성에

매개변수 이름: ~CHECK_CSRF_TOKEN, 값 0을 추가해준다.

SEGW에서 DPC_EXT를 더블클릭하거나 해당 이름을 복사 후 SE24 클래스 빌더에서 편집실행

 

 

/IWBEP/IF/MGW_APPL_SRV_RUNTIME에서 CREATE_DEEP_ENTITY 우클릭해서 Redefine (캡쳐 잘못됐지만 넘어갑시다....)

이건 Deep Structure를 썼기 때문에 위의 메소드를 상속받는 거지만 일반 구조의 경우는 Methods(방법) -> Inherited Methods -> DOCU_POSTSET_CREATE_ENTITY(DOCU_POSTSET은 본인이 지정한 Entity 이름임)을 상속받아야 함.

    TYPES : BEGIN OF TS_DATA,
              BUKRS    TYPE YDOCHEADER-BUKRS,
              BLART    TYPE YDOCHEADER-BLART,
              BUDAT    TYPE YDOCHEADER-BUDAT,
              BLDAT    TYPE YDOCHEADER-BLDAT,
              WAERS    TYPE YDOCHEADER-WAERS,
              BKTXT    TYPE YDOCHEADER-BKTXT,
              ITEMSSET TYPE STANDARD TABLE OF YDOCITEM WITH DEFAULT KEY,
              MSGTYP   TYPE YDOCHEADER-MSGTYP,
              MSG      TYPE YDOCHEADER-MSG,
            END OF TS_DATA.

    DATA : LS_DEEP TYPE TS_DATA.

    DATA : LS_HD00   TYPE YDOCHEADER,
           LS_ITEM00 TYPE YDOCITEM,
           LT_ITEM00 TYPE TABLE OF YDOCITEM.

    DATA: LV_BUKRS TYPE BUKRS,
          LV_BELNR TYPE BELNR_D,
          LV_GJAHR TYPE GJAHR.

    DATA: LS_BKPF TYPE BBKPF,
          LS_BSEG TYPE BBSEG.

    DATA: LT_BKPF TYPE TABLE OF BBKPF,
          LT_BSEG TYPE TABLE OF BBSEG,
          LT_MESG	TYPE TABLE OF FIMSG.

    DATA: LV_DAMT TYPE I,
          LV_CAMT TYPE I.

    IF IV_SOURCE_NAME = 'DOCU_POST'. "DATA를 받아주기 위한 METHOD
      TRY.
          CALL METHOD IO_DATA_PROVIDER->READ_ENTRY_DATA
            IMPORTING
              ES_DATA = LS_DEEP.
        CATCH /IWBEP/CX_MGW_TECH_EXCEPTION.
      ENDTRY.


      MOVE-CORRESPONDING LS_DEEP TO LS_HD00.
      MOVE-CORRESPONDING LS_DEEP-ITEMSSET TO LT_ITEM00.

    ENDIF.

    CLEAR: LS_BKPF, LT_BKPF.
    LS_BKPF-TCODE = 'FBV1'.
    LS_BKPF-BUKRS = LS_DEEP-BUKRS.
    LS_BKPF-BLART = LS_DEEP-BLART.
    LS_BKPF-BLDAT = LS_DEEP-BLDAT.
    LS_BKPF-BUDAT = LS_DEEP-BUDAT.
    LS_BKPF-WAERS = LS_DEEP-WAERS.
    LS_BKPF-BKTXT = LS_DEEP-BKTXT.
    APPEND LS_BKPF TO LT_BKPF.

    CLEAR: LV_DAMT, LV_CAMT.
    CLEAR: LS_BSEG, LT_BSEG.
    LOOP AT LT_ITEM00 INTO LS_ITEM00.
      CLEAR LS_BSEG.

      " 전기키 및 계정
      IF LS_ITEM00-LIFNR IS NOT INITIAL.
        IF LS_ITEM00-WRBTR GT 0.
          LS_BSEG-NEWBS = '31'.
          ADD LS_ITEM00-WRBTR TO LV_CAMT.
        ELSE.
          LS_BSEG-NEWBS = '21'.
          ADD LS_ITEM00-WRBTR TO LV_DAMT.
        ENDIF.
        LS_BSEG-NEWKO = LS_ITEM00-LIFNR.
      ELSE.
        IF LS_ITEM00-WRBTR GT 0.
          LS_BSEG-NEWBS = '40'.
          ADD LS_ITEM00-WRBTR TO LV_DAMT.
        ELSE.
          LS_BSEG-NEWBS = '50'.
          ADD LS_ITEM00-WRBTR TO LV_CAMT.
        ENDIF.
        LS_BSEG-HKONT = LS_ITEM00-HKONT.
        LS_BSEG-KOSTL = LS_ITEM00-KOSTL.
      ENDIF.

      LS_BSEG-MWSKZ = LS_ITEM00-MWSKZ.
      LS_BSEG-BUPLA = LS_ITEM00-BUPLA.
      LS_BSEG-GSBER = LS_ITEM00-GSBER.
      LS_BSEG-WRBTR = ABS( LS_ITEM00-WRBTR ).
      LS_BSEG-SGTXT = LS_ITEM00-SGTXT.

      APPEND LS_BSEG TO LT_BSEG.
    ENDLOOP.

    IF LV_DAMT EQ LV_CAMT.

      CALL FUNCTION 'YZZFI_DOCUMENT_POSTING'
        EXPORTING
          I_POST_TYPE = 'C'
          I_BDC_MODE  = 'N'
        IMPORTING
          E_BUKRS     = LV_BUKRS
          E_BELNR     = LV_BELNR
          E_GJAHR     = LV_GJAHR
        TABLES
          T_BBKPF     = LT_BKPF
          T_BBSEG     = LT_BSEG
          T_MESSTAB   = LT_MESG.

      IF LV_BELNR IS NOT INITIAL.
        LS_DEEP-MSGTYP = 'S'.
        LS_DEEP-MSG    = LV_BELNR.
      ELSE.
        READ TABLE LT_MESG ASSIGNING FIELD-SYMBOL(<FS>) WITH KEY MSGTY = 'E'.
        IF SY-SUBRC NE 0.
          READ TABLE LT_MESG ASSIGNING <FS> INDEX 1.
        ENDIF.

        IF <FS> IS ASSIGNED.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = <FS>-MSGID
              MSGNR               = <FS>-MSGNO
              MSGV1               = <FS>-MSGV1
              MSGV2               = <FS>-MSGV2
              MSGV3               = <FS>-MSGV3
              MSGV4               = <FS>-MSGV4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LS_DEEP-MSG.
          LS_DEEP-MSGTYP = 'E'.
        ENDIF.

      ENDIF.
    ELSE.
      LS_DEEP-MSGTYP = 'E'.
      LS_DEEP-MSG = '미지급금과 비용의 합이 일치하지 않아 전기할 수 없습니다.'.
    ENDIF.

    CALL METHOD ME->COPY_DATA_TO_REF "RETURN METHOD
      EXPORTING
        IS_DATA = LS_DEEP
      CHANGING
        CR_DATA = ER_DEEP_ENTITY.

CREATE_DEEP_ENTITY에 대충 위처럼 전기해줍니다... 대충 짠겁니다....

전표전기 포스팅 펑션 본인 사이트에 없으면 대충 bdc나 기타 전표전기 펑션 사용하세요....

 

다시 SAP Gateway Client로 돌아와서 Entity Set에서 DOCU_POSTSet (헤더세트)를 선택하고 메소드는 POST , HTTP Request를 json으로 변경한 다음에 좌측 하단에 아래와 같이 대략 입력해주면 전표 생성이 됩니다. (마스터는 본인 회사꺼 사용하세요.)

{
  "Bukrs" : "1000",
  "Blart" : "SA",
  "Budat" : "20250218",
  "Bldat" : "20250218",
  "Waers" : "KRW",
  "Bktxt" : "TEST",
  "ItemsSet" : [
     {
      "Lifnr" : "7000116",
      "Wrbtr" : "10000"
     },
     {
      "Hkont" : "53330101",
      "Kostl" : "1000_A",
      "Wrbtr" : "10000"
     }
   ]
}

 

전표가 원하는대로 기표가 잘 됐군요.....

 

 

참고한 사이트.

A Step by Step process to Post Odata services in S... - SAP Community

 

A Step by Step process to Post Odata services in SAP / SAP HANA system

Hi All, I had gone through multiple blogs post for post Odata service. In those documents it was given very high level steps. For beginner, its difficult to know how exactly these steps has been executed. In my previous blog Post , We had learn about how t

community.sap.com

 

OData and SAP Netweaver Gateway. Part I. Introduction |

 

OData and SAP Netweaver Gateway. Part I. Introduction |

SAP HANA as the database, S/4 HANA and then SAP ABAP on HANA for technical folks like us is one area which we need to keep ourselves abreast with. But there is another cluster of OData, SAP NetWeaver Gateway, SAPUI5 and SAP Fiori which every ABAPer will st

www.zapyard.com

 

[ABAP]SAP ODATA(1)

 

[ABAP]SAP ODATA(1)

ABAP 개발자가 된지 6개월이 되었을 때 참여한 유지보수에서 ODATA라는 것을 처음 접하였습니다. 관련 자료도 한정적이고, 공부할 때 꽤나 애 먹었던 부분이라 공부 했던 것을 다시 정리할겸, ODATA

hsto.tistory.com

 

 

반응형