IT WORK/SAP FI and ABAP

[SAP FI] BAPI_ACC_DOCUMENT_POST 펑션을 이용한 비용 전표 전기

Bathildis 2025. 4. 21. 16:19
반응형
REPORT YTEST.

* 1. 데이터 선언
DATA:
  LS_HEAD   TYPE BAPIACHE09,
  LT_GL     TYPE STANDARD TABLE OF BAPIACGL09 WITH EMPTY KEY,
  LT_AP     TYPE STANDARD TABLE OF BAPIACAP09 WITH EMPTY KEY,
  LT_CURR   TYPE STANDARD TABLE OF BAPIACCR09 WITH EMPTY KEY,
  LT_RETURN TYPE STANDARD TABLE OF BAPIRET2 WITH EMPTY KEY.

* 2. 문서 헤더 데이터 초기화
LS_HEAD = VALUE #(
  HEADER_TXT = '테스트 전표 생성'
  COMP_CODE  = '1000'
  DOC_DATE   = SY-DATUM
  PSTNG_DATE = SY-DATUM
  DOC_TYPE   = 'SA'
  USERNAME   = SY-UNAME
).

* 3. GL 계정 라인 데이터 (차변)
LT_GL = VALUE #(
  ( ITEMNO_ACC = '1'
    GL_ACCOUNT = '0052050101'
    ITEM_TEXT  = '비용라인'
    COSTCENTER = '0000100000'
    COMP_CODE  = '1000' )
).

* 4. AP 계정 라인 데이터 (대변)
LT_AP = VALUE #(
  ( ITEMNO_ACC = '2'
    VENDOR_NO  = '0010100001'
    PMNTTRMS   = 'N000'
    BLINE_DATE = SY-DATUM )
).

* 5. 금액 데이터
LT_CURR = VALUE #(
  ( ITEMNO_ACC = '1' CURRENCY = 'KRW' AMT_DOCCUR = '10000'  )
  ( ITEMNO_ACC = '2' CURRENCY = 'KRW' AMT_DOCCUR = '-10000' )
).

* 6. 체크 로직 추가
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
  EXPORTING
    DOCUMENTHEADER = LS_HEAD
  TABLES
    ACCOUNTGL      = LT_GL
    ACCOUNTPAYABLE = LT_AP
    CURRENCYAMOUNT = LT_CURR
    RETURN         = LT_RETURN.

* 7. 체크 결과 처리
IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ).
  LOOP AT LT_RETURN ASSIGNING FIELD-SYMBOL(<FS_ERR>) WHERE TYPE = 'E'.
    WRITE: / '체크 오류:', <FS_ERR>-MESSAGE.
  ENDLOOP.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
* 8. 실제 전표 생성
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      DOCUMENTHEADER = LS_HEAD
    TABLES
      ACCOUNTGL      = LT_GL
      ACCOUNTPAYABLE = LT_AP
      CURRENCYAMOUNT = LT_CURR
      RETURN         = LT_RETURN.

* 9. 실행 결과 처리
  IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ).
    LOOP AT LT_RETURN ASSIGNING <FS_ERR> WHERE TYPE = 'E'.
      WRITE: / '실행 오류:', <FS_ERR>-MESSAGE.
    ENDLOOP.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = ABAP_TRUE.

    DATA(LV_DOC_NUM) = VALUE STRING( ).
    LOOP AT LT_RETURN ASSIGNING FIELD-SYMBOL(<FS_MSG>) WHERE TYPE = 'S'.
      LV_DOC_NUM = <FS_MSG>-MESSAGE_V2+0(10).  " 앞 10자리 자르기
      CONDENSE LV_DOC_NUM NO-GAPS.            " 공백 제거
      EXIT.
    ENDLOOP.

    WRITE: / '전표 생성 성공:', LV_DOC_NUM.
  ENDIF.
ENDIF.

 

 

AR은 테이블에서 ACCOUNTRECEIVABLE를 사용하면 됨.

반응형