728x90

 

> 선급비용 마스터 생성 함수 (Manual Accrual) <

 

선급비용 마스터를 생성하는 함수를 만들어봄 (버전은 S4CORE 108-0002)

FUNCTION zfi_create_acac_object.
*"----------------------------------------------------------------------
*"*"로컬 인터페이스:
*"  IMPORTING
*"     VALUE(I_BUKRS) TYPE  ACE_BUKRS
*"     VALUE(I_OBJTYPE) TYPE  ACAC_OBJTYPE
*"     VALUE(I_RESPERSON) TYPE  ACAC_RESPERSON OPTIONAL
*"     VALUE(I_TEXT) TYPE  ACAC_TEXT OPTIONAL
*"     VALUE(I_STARTDATE) TYPE  ACE_LIFE_START_DATE
*"     VALUE(I_ENDDATE) TYPE  ACE_LIFE_END_DATE
*"     VALUE(I_WAERS) TYPE  FINS_CURRW
*"     VALUE(I_AMOUNT) TYPE  ACE_TOTAL_PER_ACCR_AMNT_WCURR
*"     VALUE(I_ITEM) TYPE  ACE_ITEMTYPE DEFAULT 'COSTSP'
*"     VALUE(I_METHOD) TYPE  ACEDS_ACRMETHOD DEFAULT 'LINEAR'
*"     VALUE(I_FISTL) TYPE  FISTL OPTIONAL
*"     VALUE(I_KOSTL) TYPE  KOSTL
*"     VALUE(I_PROJK) TYPE  PS_PSP_PNR
*"     VALUE(IS_PARAM) TYPE  ACAC_PARAMETERS OPTIONAL
*"     VALUE(I_TEST) TYPE  CHAR01 OPTIONAL
*"  EXPORTING
*"     VALUE(E_STATUS) TYPE  MSGTY
*"     VALUE(E_MSG) TYPE  BAPI_MSG
*"     VALUE(E_OBJNUMBER) TYPE  ACAC_OBJNUMBER
*"  TABLES
*"      ET_MSGTAB TYPE  ACE_MESSAGE_HANDLER_T OPTIONAL
*"----------------------------------------------------------------------


************************************************************************
*  개발시 참고프로그램 --> ACAC_D_TRANS_EXAMPLE_S4
************************************************************************

  DATA: lo_acac_mdo_subobj  TYPE REF TO cl_acac_mdo_subobj,
        lo_ace_mdo_subobj   TYPE REF TO if_ace_mdo_subobj,

        ls_acesobj_key      TYPE acesobj_key,
        lt_items_ti         TYPE acesobj_item_ext_t,
        ls_items_ti         TYPE acesobj_item_ext,
        lt_param            TYPE aceds_param_t,
        ls_param            TYPE aceds_param,
        ls_acesobj_assgmt   TYPE acesobj_assgmt_attributes,
        ls_posting_params   TYPE ace_posting_params,

        ld_header_objnumber TYPE acac_objnumber,
        ld_header_text      TYPE acac_text,
        lv_mdo_activity     TYPE if_ace_mdo_types=>ty_activity,
        lt_result           TYPE ace_mdo_subobj_result_table,
        lt_message          TYPE ace_message_handler_t,
        lv_objnumber        TYPE acac_objnumber,
        lv_datum            LIKE sy-datum,
        lv_uzeit            LIKE sy-uzeit,

        gv_savemode         TYPE ace_savemode,
        lv_budat            TYPE dats.

  CALL FUNCTION 'DATE_GET_MONTH_LASTDAY'
    EXPORTING
      i_date = i_startdate
    IMPORTING
      e_date = lv_budat.

*-- 저장모드 (C:저장, T:테스트)
  gv_savemode = COND #( WHEN i_test = 'X' THEN 'T' ELSE 'C' ).

  CLEAR: ls_acesobj_key, lo_ace_mdo_subobj, lv_objnumber.
  REFRESH: lt_items_ti, lt_param, lt_result, lt_message.

  TRY.

*---- 오브젝트 생성.
      ls_acesobj_key-bukrs = i_bukrs.
      ls_acesobj_key-comp  = 'ACAC'.
      lo_ace_mdo_subobj = cl_ace_mdo_subobj_factory=>get_mdo_subobj_instance( is_acesobj_key                 = ls_acesobj_key
                                                                              iv_detdate                     = sy-datum
                                                                              ib_save_flag                   = abap_false
                                                                              iv_activity                    = CONV #( if_ace_mdo_types=>act_change )
                                                                              ib_initialize_new_if_not_exist = abap_true ).
      CHECK lo_ace_mdo_subobj IS BOUND.
      lo_acac_mdo_subobj ?= lo_ace_mdo_subobj.
      lv_mdo_activity = lo_ace_mdo_subobj->get_mdo_activity( ).

*---- 헤더데이터.
      ld_header_text = i_text.
      lo_acac_mdo_subobj->acac_header_set(
        EXPORTING
          id_objtype   = i_objtype            "-- 발생오브젝트유형.
          id_objnumber = ld_header_objnumber  "-- 발생오브젝트번호 (외부번호의 경우 입력, 내부번호는 공백)
          id_text      = ld_header_text       "-- 제목.
          id_resperson = i_resperson          "-- 책임자.
      ).

*---- 항목데이터.
      ls_items_ti-rldnr               = '0L'.         "-- 장부.
      ls_items_ti-life_start_date     = i_startdate.  "-- 시작일.
      ls_items_ti-life_end_date       = i_enddate.    "-- 종료일.
      ls_items_ti-total_accr_amnt_wsl = i_amount.     "-- 금액.
      ls_items_ti-rwcurttl            = i_waers.      "-- 통화.
      ls_items_ti-itemtype            = i_item.       "-- 발생항목유형.
      ls_items_ti-acrmethod           = i_method.     "-- 계산방법.
      APPEND ls_items_ti TO lt_items_ti.

      lo_acac_mdo_subobj->items_modify(
         EXPORTING
          it_items_ti =   lt_items_ti
          id_datefrom =   '00010101'
       ).

*---- 계정지정.
      ls_acesobj_assgmt-fistl      = i_fistl.     "-- Fund Center.
      ls_acesobj_assgmt-kostl      = i_kostl.     "-- Cost Center.
      ls_acesobj_assgmt-ps_psp_pnr = i_projk.     "-- WBS.
      lo_acac_mdo_subobj->assignments_modify(
          EXPORTING
            id_datefrom    = '00010101'
            is_assignments = ls_acesobj_assgmt
            id_testrun     = space
        ).

*---- 매개변수1:사전품의번호.
      IF is_param-z_pre_no IS NOT INITIAL.
        ls_param-param_name = 'Z_PRE_NO'.
        ls_param-content = is_param-z_pre_no.
        APPEND ls_param TO lt_param.
      ENDIF.

*---- 매개변수2:비용전표번호.
      IF is_param-z_costdoc IS NOT INITIAL.
        ls_param-param_name = 'Z_COSTDOC'.
        ls_param-content = is_param-z_costdoc.
        APPEND ls_param TO lt_param.
      ENDIF.

*---- 매개변수3:선급비용대체전표번호.
      IF is_param-z_trndoc IS NOT INITIAL.
        ls_param-param_name = 'Z_TRNDOC'.
        ls_param-content = is_param-z_trndoc.
        APPEND ls_param TO lt_param.
      ENDIF.

*---- 매개변수 반영.
      lo_acac_mdo_subobj->parameters_modify(
          EXPORTING
            id_datefrom    = '00010101'
            it_params      = lt_param
            id_testrun     = space
        ).

*---- 전기정보.
      ls_posting_params-bldat   = ls_items_ti-life_start_date.
      ls_posting_params-gjahr   = lv_budat(4).
      ls_posting_params-poper   = lv_budat+4(2).
      ls_posting_params-budat   = lv_budat.
      ls_posting_params-keydate = lv_budat.

      cl_ace_mdo_subobj_factory=>change_save_parameters( is_subobj_key     = ls_acesobj_key
                                                         ib_save_flag      = abap_true
                                                         is_posting_params = ls_posting_params ).

*---- 저장.
      GET TIME.
      lv_datum = sy-datum.
      lv_uzeit = sy-uzeit.
      lt_result = cl_ace_mdo_subobj_factory=>save( id_savemode = gv_savemode ).
      lt_message = cl_ace_message_handler=>get_instance( )->export( ).

*---- 결과확인.
      READ TABLE lt_result INTO DATA(ls_result) WITH KEY status = 'E'.

*---- 오류의 경우.
      IF sy-subrc = 0.
        e_status = 'E'.
        READ TABLE lt_message INTO DATA(ls_msgtab) WITH KEY msgty = 'E'.
        e_msg = ls_msgtab-message.
*---- 성공의 경우.
      ELSE.
        e_status = 'S'.

*------ 갱신실행시.
        IF gv_savemode = 'C'.
          COMMIT WORK AND WAIT.

          DO 5 TIMES.   "-- 5초동안 확인.
*-------- 선급비용번호확인 (매개변수 중 비용전표번호로 확인).
            IF is_param-z_costdoc IS NOT INITIAL.
              SELECT SINGLE b~acac_objnumber
                INTO @lv_objnumber
                FROM acesobj_param AS a
                     INNER JOIN acac_objects AS b ON b~ref_key    = a~ref_key
                                                 AND b~ref_subkey = a~ref_subkey
                     INNER JOIN acesobj AS c      ON c~comp       = a~comp
                                                 AND c~bukrs      = a~bukrs
                                                 AND c~ref_key    = a~ref_key
                                                 AND c~ref_subkey = a~ref_subkey
               WHERE a~comp         = 'ACAC'
                 AND a~bukrs        = @i_bukrs
                 AND a~param_name   = 'Z_COSTDOC'
                 AND a~content      = @is_param-z_costdoc
                 AND c~createdby    = @sy-uname
                 AND ( c~createdon  > @lv_datum OR
                     ( c~createdon  = @lv_datum AND
                       c~createdat >= @lv_uzeit ) ).

*-------- 선급비용번호확인 (매개변수 중 선급비용대체전표번호로 확인).
            ELSEIF is_param-z_trndoc IS NOT INITIAL.
              SELECT SINGLE b~acac_objnumber
                INTO @lv_objnumber
                FROM acesobj_param AS a
                     INNER JOIN acac_objects AS b ON b~ref_key    = a~ref_key
                                                 AND b~ref_subkey = a~ref_subkey
                     INNER JOIN acesobj AS c      ON c~comp       = a~comp
                                                 AND c~bukrs      = a~bukrs
                                                 AND c~ref_key    = a~ref_key
                                                 AND c~ref_subkey = a~ref_subkey
               WHERE a~comp         = 'ACAC'
                 AND a~bukrs        = @i_bukrs
                 AND a~param_name   = 'Z_TRNDOC'
                 AND a~content      = @is_param-z_trndoc
                 AND c~createdby    = @sy-uname
                 AND ( c~createdon  > @lv_datum OR
                     ( c~createdon  = @lv_datum AND
                       c~createdat >= @lv_uzeit ) ).
            ENDIF.

            IF lv_objnumber IS NOT INITIAL.
              e_objnumber = lv_objnumber.
              EXIT.
            ELSE.
              WAIT UP TO 1 SECONDS.
            ENDIF.
          ENDDO.

*-------- 매개변수로 번호를 찾지 못한 경우 가장 최근 발생된 데이터로 확인.
          IF lv_objnumber IS NOT INITIAL.
            CLEAR lv_objnumber.

            SELECT b~acac_objnumber, a~createdon, a~createdat
              FROM acesobj AS a
                   INNER JOIN acac_objects AS b ON b~ref_key    = a~ref_key
                                               AND b~ref_subkey = a~ref_subkey
                   INNER JOIN acesobj_item AS c ON c~comp       = a~comp
                                               AND c~bukrs      = a~bukrs
                                               AND c~ref_key    = a~ref_key
                                               AND c~ref_subkey = a~ref_subkey
             WHERE a~comp                EQ 'ACAC'
               AND a~bukrs               EQ @i_bukrs
               AND a~createdby           EQ @sy-uname
               AND ( a~createdon         GT @lv_datum OR
                   ( a~createdon         EQ @lv_datum AND
                     a~createdat         GE @lv_uzeit ) )
               AND b~acac_objtype        EQ @i_objtype
               AND c~itemtype            EQ @i_item
               AND c~rldnr               EQ '0L'
               AND c~life_start_date     EQ @i_startdate
               AND c~life_end_date       EQ @i_enddate
               AND c~rwcurttl            EQ @i_waers
               AND c~total_accr_amnt_wsl EQ @i_amount
                   ORDER BY a~createdon DESCENDING, a~createdat DESCENDING
              INTO (@lv_objnumber, @DATA(lv_cdate), @DATA(lv_ctime)).

              EXIT.
            ENDSELECT.

            IF sy-subrc = 0 AND lv_objnumber IS NOT INITIAL.
              e_objnumber = lv_objnumber.
            ENDIF.
          ENDIF.

*------ 테스트실행시.
        ELSE.
          ROLLBACK WORK.
          e_msg = '테스트실행결과 오류가 발견되지 않았습니다..'.
        ENDIF.
      ENDIF.

    CATCH cx_ace INTO DATA(lx_ace).

      cl_ace_message_handler=>get_instance( )->add_message_inst( lx_ace ).
      lt_message = cl_ace_message_handler=>get_instance( )->export( ).
      DATA(lv_text) = lx_ace->get_text( ).
      e_status = 'E'.
      e_msg = lv_text.

  ENDTRY.

*-- 메시지테이블리턴.
  LOOP AT lt_message INTO ls_msgtab.
    MOVE-CORRESPONDING ls_msgtab TO et_msgtab.
    APPEND et_msgtab.
    CLEAR et_msgtab.
  ENDLOOP.

ENDFUNCTION.

 

끝.

 

 

Posted by Gomtui
,