La seguente BAPI effettua il calcolo dei costi su materiali. Inoltre è possibile trovare all'interno del codice, anche la BAPI per effettuare l'esplosione dei costi sui materiali.
DATA: ls_matnr LIKE LINE OF s_matnr,
ls_var LIKE LINE OF s_var,
lv_klvar TYPE keko-klvar,
lv_matnr TYPE mara-matnr,
lv_werks TYPE marc-werks,
lv_losgr TYPE keko-losgr,
lv_tvers TYPE keko-tvers,
lv_stlan TYPE cki64a-stlan,
lv_stalt TYPE cki64a-stalt,
lv_plnty TYPE cki64a-plnty,
lv_plnnr TYPE cki64a-plnnr,
lv_plnal TYPE cki64a-plnal,
lv_kadat TYPE cki64a-kadat,
lv_bidat TYPE cki64a-bidat,
lv_aldat TYPE cki64a-aldat,
lv_bwdat TYPE cki64a-bwdat,
lv_uebid TYPE cki64a-uebid,
lv_kalnr_ba TYPE cki64a-kalnr_ba,
lv_kalsm TYPE keko-kalsm,
lv_s_dunkel TYPE c,
lv_s_update TYPE c,
lv_s_no_commit TYPE c,
lv_s_repetitive TYPE c,
lv_s_sngl_lock TYPE c,
lv_u_kalsm TYPE xfeld,
lv_f_keko_exp TYPE keko,
lt_keph_exp TYPE STANDARD TABLE OF keph,
ls_keph_exp LIKE LINE OF lt_keph_exp,
ls_keko TYPE keko,
lv_ok TYPE i,
lv_ko TYPE i,
lt_newline TYPE REF TO data.
DATA: lv_referenceobject TYPE bapicostre-ref_object,
lv_costingnumber TYPE bapicostre-cstg_num,
lv_costingtype TYPE bapicostre-cstg_type,
lv_costingdate TYPE bapicostre-cstg_date,
lv_costingversion TYPE bapicostre-version,
lv_valuationvariant TYPE bapicostre-vltn_vrnt,
lv_enteredmanually TYPE bapicostre-enter_man,
lv_cost_component_view TYPE bapicostes-view,
lv_explosion_depth TYPE bapicostes-explosion_depth,
lv_lot_size TYPE bapicostes-lotsize,
lv_explode_kf_too TYPE xfeld,
lv_explosion_incomplete TYPE bapicostes-explosion_incp,
lv_return TYPE bapireturn,
lt_explosion_list TYPE STANDARD TABLE OF bapiexplosionlist,
ls_explosion_list TYPE bapiexplosionlist.
FIELD-SYMBOLS: <matnr> TYPE any,
<var> TYPE any,
<var_old> TYPE any,
<var_new> TYPE any.
CALL METHOD create_fieldcat( ).
REFRESH: lt_keph_exp, lt_explosion_list.
CLEAR: ls_keko.
LOOP AT s_var INTO ls_var.
LOOP AT s_matnr INTO ls_matnr.
lv_klvar = ls_var-low.
lv_matnr = ls_matnr-low.
lv_werks = p_werks.
lv_kadat = p_kadat.
lv_bidat = p_bidat.
lv_aldat = p_aldat.
lv_bwdat = p_bwdat.
lv_tvers = p_tvers.
lv_losgr = p_losgr.
"Effettuo il calcolo del materiale in input (la BAPI effettua la chiamata in background (s_dunkel = abap_true) della trans. CK11N
CALL FUNCTION 'CK_F_MATERIAL_CALC'
EXPORTING
klvar = lv_klvar
matnr = lv_matnr
werks = lv_werks
losgr = lv_losgr
tvers = lv_tvers
kadat = lv_kadat
bidat = lv_bidat
aldat = lv_aldat
bwdat = lv_bwdat
s_dunkel = abap_true
s_no_commit = abap_true
IMPORTING
f_keko_exp = ls_keko
TABLES
t_keph_exp = lt_keph_exp
EXCEPTIONS
wrong_call = 1
keph_not_found = 2
locked = 3
OTHERS = 4.
IF sy-subrc IS INITIAL.
"Effettuo l'esplosione dei costi sul materiale in input
lv_referenceobject = ls_keko-bzobj.
lv_costingnumber = ls_keko-kalnr.
lv_costingtype = ls_keko-kalka.
lv_costingdate = ls_keko-kadky.
lv_costingversion = ls_keko-tvers.
lv_valuationvariant = ls_keko-bwvar.
lv_enteredmanually = ls_keko-kkzma.
lv_cost_component_view = '1'.
CALL FUNCTION 'BAPI_COSTESTIMATE_GETEXPLOSION'
EXPORTING
referenceobject = lv_referenceobject
costingnumber = lv_costingnumber
costingtype = lv_costingtype
costingdate = lv_costingdate
costingversion = lv_costingversion
valuationvariant = lv_valuationvariant
enteredmanually = lv_enteredmanually
cost_component_view = lv_cost_component_view
IMPORTING
explosion_incomplete = lv_explosion_incomplete
return = lv_return
TABLES
explosion_list = lt_explosion_list.
IF lt_explosion_list IS NOT INITIAL.
LOOP AT lt_explosion_list INTO ls_explosion_list.
CLEAR: lv_klvar, lv_matnr, lv_werks, lv_kadat, lv_bidat, lv_aldat, lv_bwdat, lv_tvers, lv_losgr.
"Ri-effettuo il calcolo costi sui materiale figli
lv_klvar = ls_explosion_list-costing_variant.
lv_matnr = ls_explosion_list-material.
lv_werks = ls_explosion_list-plant.
lv_kadat = p_kadat.
lv_bidat = p_bidat.
lv_aldat = p_aldat.
lv_bwdat = ls_explosion_list-vltn_date.
lv_tvers = ls_explosion_list-version.
lv_losgr = ls_explosion_list-lotsize.
CALL FUNCTION 'CK_F_MATERIAL_CALC'
EXPORTING
klvar = lv_klvar
matnr = lv_matnr
werks = lv_werks
losgr = lv_losgr
tvers = lv_tvers
kadat = lv_kadat
bidat = lv_bidat
aldat = lv_aldat
bwdat = lv_bwdat
s_dunkel = abap_true
s_no_commit = abap_true
IMPORTING
f_keko_exp = ls_keko
TABLES
t_keph_exp = lt_keph_exp
EXCEPTIONS
wrong_call = 1
keph_not_found = 2
locked = 3
OTHERS = 4.
"Controllo se il calcolo ha restituito errori (KA = Calcolato senza errori / KF = calcolato con errori)
IF ls_keko-feh_sta EQ 'KA'.
ADD 1 TO lv_ok.
ELSEIF ls_keko-feh_sta EQ 'KF'.
ADD 1 TO lv_ko.
ENDIF.
CLEAR: ls_keko.
ENDLOOP.
ENDIF.