ABAP

BAPI_COSTACTPLN_POSTPRIMCOST 비용계획(KP06)

닉넴항상고민 2025. 2. 19. 14:21
반응형

 선언부.  

DATA: LS_HEADERINFO     TYPE BAPIPLNHDR,
      LS_INDEXSTRUCTURE TYPE BAPIACPSTRU,
      LT_INDEXSTRUCTURE TYPE TABLE OF BAPIACPSTRU,
      LS_COOBJECT       TYPE BAPIPCPOBJ,
      LT_COOBJECT       TYPE TABLE OF BAPIPCPOBJ,
      LS_PERVALUE       TYPE BAPIPCPVAL,
      LT_PERVALUE       TYPE TABLE OF BAPIPCPVAL,
      LT_RETURN         TYPE TABLE OF BAPIRET2,
      LV_RETMSG         TYPE SY-LISEL,
      LV_MESSAGE        TYPE BAPI_MSG,
      LV_OBJ_INDX       TYPE BAPIACISTRU-OBJECT_INDEX,
      LV_VAL_INDX       TYPE BAPIACISTRU-VALUE_INDEX.

DATA: LV_INDEX   TYPE N LENGTH 2,
      LV_MINDEX TYPE I,
      LV_FNAME1  TYPE FIELDNAME,
      LV_FNAME2  TYPE FIELDNAME,
      LV_FIX_VAL TYPE BAPIPCPVAL-FIX_VAL_PER01.

FIELD-SYMBOLS: <FS1>, <FS2>.

 

CURRENCY TYPE은 3가지 종류가 있다.

PLAN_CURRTYPE = 'C' : 관리회계 영역 통화

PLAN_CURRTYPE = 'O' : 오브젝트 통화

PLAN_CURRTYPE = 'T' : 거래 통화

헤더.  

    "HEADER
    LS_HEADERINFO-CO_AREA       = P_KOKRS.  "관리회계영역
    LS_HEADERINFO-VERSION       = P_VERSN.  "버전
    LS_HEADERINFO-FISC_YEAR     = P_GJAHR.  "연도
    LS_HEADERINFO-PERIOD_FROM   = S_PERBL-LOW.  "기간 FROM
    LS_HEADERINFO-PERIOD_TO     = S_PERBL-HIGH.  "기간 TO
    LS_HEADERINFO-PLAN_CURRTYPE = 'O'.  "통화

 

CO OBJECT.  

    "COOBJECT
    LV_OBJ_INDX += 1.

    LS_COOBJECT-OBJECT_INDEX = LV_OBJ_INDX.
    LS_COOBJECT-COSTCENTER   = <FS_LIST>-KOSTL.  "코스트센터

    APPEND LS_COOBJECT TO LT_COOBJECT.

 

INDEX STRUCTURE.  

    "INDEXSTRUCTURE
    LV_VAL_INDX += 1.

    LS_INDEXSTRUCTURE-OBJECT_INDEX = LV_OBJ_INDX.
    LS_INDEXSTRUCTURE-VALUE_INDEX  = LV_VAL_INDX.

    APPEND LS_INDEXSTRUCTURE TO LT_INDEXSTRUCTURE.

 

PERVALUE.  CURRNECY 변환은 생략 가능.

    "PERVALUE
    LV_INDEX = 01.
    DO 12 TIMES.
      LV_FNAME1 = |LS_PERVALUE-FIX_VAL_PER{ LV_INDEX }|.
      ASSIGN (LV_FNAME1) TO <FS1>.

      LV_FNAME2 = |<FS_LIST>-WOG0{ LV_INDEX }|.
      ASSIGN (LV_FNAME2) TO <FS2>.

      PERFORM CONVERSION_CURRENCY USING 'E' <FS_LIST>-WAERS <FS2> CHANGING LV_FIX_VAL.

      <FS1> = LV_FIX_VAL.
      LV_INDEX += 1.
    ENDDO.

    LS_PERVALUE-COST_ELEM   = <FS_LIST>-KSTAR.  "원가요소
    LS_PERVALUE-VALUE_INDEX = LV_VAL_INDX.
    LS_PERVALUE-TRANS_CURR  = <FS_LIST>-WAERS.

    APPEND LS_PERVALUE TO LT_PERVALUE.

 

이미 있는 계획 값에 값을 더해주는 방식으로 BAPI를 수행하려면 DELTA 지시자에 'X'로 변경해준다.

SPACE라면 LT_PERVALUE의 값으로 대체한다.

 

BAPI 실행. 

CALL FUNCTION 'BAPI_COSTACTPLN_POSTPRIMCOST'
  EXPORTING
    HEADERINFO     = LS_HEADERINFO
    DELTA          = SPACE
  TABLES
    INDEXSTRUCTURE = LT_INDEXSTRUCTURE
    COOBJECT       = LT_COOBJECT
    PERVALUE       = LT_PERVALUE
    RETURN         = LT_RETURN.

IF LT_RETURN IS INITIAL.

  <FS_LIST>-ICON    = ICON_GREEN_LIGHT.
  <FS_LIST>-MESSAGE = '전기 되었습니다.'.
  MESSAGE S109.

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT = 'X'.
ELSE.
  LOOP AT LT_RETURN ASSIGNING FIELD-SYMBOL(<FS_RETURN>) WHERE TYPE = 'E'.
    LV_MINDEX += 1.

    CALL FUNCTION 'RPY_MESSAGE_COMPOSE'
      EXPORTING
        MESSAGE_ID     = <FS_RETURN>-ID
        MESSAGE_NUMBER = <FS_RETURN>-NUMBER
        MESSAGE_VAR1   = <FS_RETURN>-MESSAGE_V1
        MESSAGE_VAR2   = <FS_RETURN>-MESSAGE_V2
        MESSAGE_VAR3   = <FS_RETURN>-MESSAGE_V3
        MESSAGE_VAR4   = <FS_RETURN>-MESSAGE_V4
      IMPORTING
        MESSAGE_TEXT   = LV_RETMSG.
    
    LV_RETMSG = | ({ LV_MINDEX }).{ LV_RETMSG }|.
    LV_MESSAGE = LV_MESSAGE && LV_RETMSG.

    IF LV_MINDEX = 1.
      SHIFT LV_MESSAGE.
    ENDIF.
  ENDLOOP.

  <FS_LIST>-ICON = ICON_RED_LIGHT.
  READ TABLE LT_RETURN ASSIGNING FIELD-SYMBOL(<FS_RETURN>) WITH KEY TYPE = 'E' BINARY SEARCH.
  IF SY-SUBRC = 0.
    <FS_LIST>-MESSAGE = LV_MESSAGE.
  ENDIF.
  MESSAGE S102 DISPLAY LIKE 'E'.

  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

CLEAR: LS_HEADERINFO, LS_COOBJECT, LS_INDEXSTRUCTURE, LS_PERVALUE,
       LT_COOBJECT, LT_INDEXSTRUCTURE, LT_PERVALUE,
       LV_OBJ_INDX, LV_VAL_INDX.

 

OBJECT_INDEX, VALUE_INDEX 예시

코스트센터 원가요소 1월 2월 3월 OBJECT_INDEX VALUE_INDEX
A00001 5000001 10,000 20,000 30,000 000001 000001
A00001 5000002 10,000 20,000 30,000 000001 000002
A00001 5000003 10,000 20,000 30,000 000001 000003
A00002 5000001 10,000 20,000 30,000 000002 000001
A00002 5000002 10,000 20,000 30,000 000002 000002

 

 

참고) 통화변환

*&---------------------------------------------------------------------*
*& Form CONVERSION_CURRENCY
*&---------------------------------------------------------------------*
*& INTERNAL : DB에 저장
*& EXTERNAL : 화면에 표시
*&---------------------------------------------------------------------*
FORM CONVERSION_CURRENCY  USING  PV_INEX
                                 PV_CURRNECY
                                 PV_INTERNAL
                        CHANGING PV_EXTERNAL.

  CASE PV_INEX.
    WHEN 'I'.
      CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
        EXPORTING
          CURRENCY             = PV_CURRNECY
          AMOUNT_EXTERNAL      = CONV BAPICURR-BAPICURR( PV_INTERNAL )
          MAX_NUMBER_OF_DIGITS = 23
        IMPORTING
          AMOUNT_INTERNAL      = PV_EXTERNAL.

    WHEN 'E'.
      CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
        EXPORTING
          CURRENCY        = PV_CURRNECY
          AMOUNT_INTERNAL = CONV BAPICURR-BAPICURR( PV_INTERNAL )
        IMPORTING
          AMOUNT_EXTERNAL = PV_EXTERNAL.
  ENDCASE.

ENDFORM.
반응형