Sunteți pe pagina 1din 3

METHOD if_ex_ckml_cost_split~get_cost_split.

* Sample Implementation:
* Apportionment according to actual output quantities of run period.

TYPES:
BEGIN OF output_list_str,
matnr TYPE matnr,
menge TYPE ckml_outmenge,
meinh TYPE meinh,
END OF output_list_str,
BEGIN OF meinh_str,
meinh TYPE meinh,
END OF meinh_str.

DATA:
s_output_list TYPE output_list_str,
s_meinh_list TYPE meinh_str,
t_sel_result TYPE STANDARD TABLE OF output_list_str,
t_output_list TYPE STANDARD TABLE OF output_list_str,
t_meinh_list TYPE STANDARD TABLE OF meinh_str,
lines LIKE sy-index,
s_split_aqzif TYPE ckml_s_bai_split_aqzif,
s_runperiod TYPE ckml_run_period_data,
s_mkal TYPE mkal,
s_makv TYPE makv,
t_makz TYPE STANDARD TABLE OF makz,
csplt TYPE csplit,
msgv1 LIKE sy-msgv1,
msgv2 LIKE sy-msgv1,
message TYPE symsgli.

* Check if an apportionment structure is maintained in


* material master. In this case don't use the BAdI.
IF NOT verid IS INITIAL.
* Read apportionment structure from version first.
CALL FUNCTION 'CK31_PRODUCTION_VERSION_READ'
EXPORTING
matnr = matnr_process
werks = werks_process
verid = verid
IMPORTING
mkal_exp = s_mkal
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
csplt = s_mkal-csplt.
ENDIF.
ENDIF.
CLEAR s_makv.
REFRESH t_makz.
CALL FUNCTION 'MATERIAL_COSTS_SPLIT_READ'
EXPORTING
matnr = matnr_process
werks = werks_process
csplit = csplt
datum = datum
refresh_buffer = 'X'
IMPORTING
makv_exp = s_makv
TABLES
tmakz = t_makz
EXCEPTIONS
costs_split_not_found = 01.
IF sy-subrc = 0 AND NOT t_makz IS INITIAL.
* Apportionmant structure found. So don't use BAdI.
EXIT.
ENDIF.

* Get costing run information.


CALL FUNCTION 'CKML_RUN_PERIOD_GET'
EXPORTING
i_run_id = run_id
IMPORTING
es_runperiod = s_runperiod.

* Get list of output materials with actual quantities


SELECT matnr
out_menge AS menge
meinh
FROM ckmlmv003
INTO CORRESPONDING FIELDS OF TABLE t_sel_result
WHERE mgtyp = s_runperiod-mgtyp
AND kalnr_in = procnr
AND last_pday = s_runperiod-last_day.
CHECK NOT t_sel_result[] IS INITIAL.
LOOP AT t_sel_result INTO s_output_list.
COLLECT s_output_list INTO t_output_list.
MOVE-CORRESPONDING s_output_list TO s_meinh_list.
COLLECT s_meinh_list INTO t_meinh_list.
ENDLOOP.

* Check if quantitiy unit is the same for all outputs.


DESCRIBE TABLE t_meinh_list LINES lines.
IF lines > 1.
* Different quantity units occur in output list. This is not
* supported in this version.
READ TABLE t_meinh_list INTO s_meinh_list INDEX 1.
MOVE s_meinh_list-meinh TO msgv1.
READ TABLE t_meinh_list INTO s_meinh_list INDEX 2.
MOVE s_meinh_list-meinh TO msgv2.
CALL FUNCTION 'CM_F_MESSAGE'
EXPORTING
arbgb = '61'
msgnr = '551'
msgty = 'W'
msgv1 = msgv1
msgv2 = msgv2
object_dependent = 'X'
EXCEPTIONS
OTHERS = 0.
MESSAGE w551(61) WITH msgv1 msgv2 INTO message.
EXIT.
ENDIF.

* Fill apportionment structure.


es_split-csplit = 'BADI'.
LOOP AT t_output_list INTO s_output_list.
s_split_aqzif-kuppl = s_output_list-matnr.
s_split_aqzif-aqzif = s_output_list-menge.
INSERT s_split_aqzif INTO TABLE et_split_aqzif.
ENDLOOP.

ENDMETHOD.

S-ar putea să vă placă și