> 선급비용 마스터 생성 함수 (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.
끝.

