
report zab_comp_allocation.
type-pools: cpsc,cmcl, slis.
tables: mapl.
types: begin of ty_assignment,
matnr like mapl-matnr,
werks type werks_d,
plnnr type plnnr,
plnfl type plnfolge,
plnal type plnal,
plnty type plnty,
vornr type vornr,
stlnr type stko-stlnr,
stlal type stlal,
stlan type stlan,
posnr type sposn,
idnrk type stpo-idnrk,
stlst type plmz-stlst,
end of ty_assignment.
types: begin of ty_plan,
matnr like marc-matnr,
werks like marc-werks,
stlal like mast-stlal,
stlan like mast-stlan,
plnty like plko-plnty,
plnnr like plko-plnnr,
plnal like plko-plnal,
plnfl type plnfolge,
end of ty_plan.
constants: begin of c_log,
read type balognr value 'READ',
delete type balognr value 'DELETE',
create type balognr value 'CREATE',
end of c_log.
data: gt_plan type standard table of ty_plan.
data: gt_assignment type standard table of ty_assignment.
data: gt_return type bapiret2_t.
data: gs_return type bapiret2.
data: g_error type c.
field-symbols: <assign> like line of gt_assignment.
field-symbols: <plan> like line of gt_plan.
selection-screen begin of block exc with frame title text-exc.
parameters: p_path type localfile lower case modif id exc.
parameters: p_rows type i modif id exc.
selection-screen end of block exc.
selection-screen begin of block oth with frame title text-oth.
** parameters: p_delexi as checkbox. "delete exisiting assigment
parameters: p_test as checkbox.
select-options: s_matnr for mapl-matnr.
select-options: s_werks for mapl-werks.
select-options: s_plnnr for mapl-plnnr.
selection-screen end of block oth.
at selection-screen on value-request for p_path.
perform open_file_dialog changing p_path.
initialization.
start-of-selection.
refresh: gt_plan[], gt_assignment[], gt_return[].
perform check_entries.
check g_error is initial.
perform load_excel.
end-of-selection.
check g_error is initial.
perform display_log.
*&---------------------------------------------------------------------*
*& Form open_file_dialog
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_PATH text
*----------------------------------------------------------------------*
form open_file_dialog changing p_path.
data: ft_filetable type filetable with header line.
data: f_rc type sy-subrc.
cl_gui_frontend_services=>file_open_dialog(
exporting
* window_title = window_title
default_extension = 'XLS'
* default_filename = default_filename
* file_filter = file_filter
* with_encoding = with_encoding
* initial_directory = initial_directory
multiselection = space
changing
file_table = ft_filetable[]
rc = f_rc
* user_action = user_action
* file_encoding = file_encoding
exceptions
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5
).
if sy-subrc eq 0.
read table ft_filetable index 1.
if sy-subrc eq 0.
p_path = ft_filetable.
endif.
endif.
endform. "open_file_dialog
*&---------------------------------------------------------------------*
*& Form check_entries
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form check_entries.
clear g_error.
if p_path is initial .
message s001(00) with 'Fill path!' display like 'E'.
g_error = 'X'.
elseif p_rows lt 2.
message s001(00) with 'Last row number must be greater than 1!' display like 'E'.
g_error = 'X'.
endif.
endform. "check_entries
*&---------------------------------------------------------------------*
*& Form load_task_list2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_PLNTY text
* -->I_PLNNR text
* -->I_PLNAL text
* -->I_STTAG text
* -->FS_ALV text
*----------------------------------------------------------------------*
form load_task_list using i_matnr like marc-matnr
i_werks like marc-werks
i_plnty like plko-plnty
i_plnnr like plko-plnnr
i_plnal like plko-plnal
i_sttag like plko-datuv.
data: fs_classes_in_workarea like classes_in_workarea,
fs_tsk_plnty_selection type cpsc_plnty_type,
ft_tsk_plnty_selection type cpsc_plnty_type occurs 0,
fs_tsk_plnnr_selection type cpsc_plnnr_type,
ft_tsk_plnnr_selection type cpsc_plnnr_type occurs 0,
fs_tsk_plnal_selection type cpsc_plnal_type,
ft_tsk_plnal_selection type cpsc_plnal_type occurs 0,
fs_tsk_selection type cpsc_tsk_sel_type,
fs_mbm_sel_type type cpsc_mbm_sel_type,
fs_mbm_matnr type cpsc_matnr_type ,
fs_mbm_werks type cpsc_werks_type ,
fs_mbm_vbeln type cpsc_vbeln_type ,
fs_mbm_vbpos type cpsc_posnr_type .
concatenate 'I' 'EQ' i_matnr into fs_mbm_matnr.
append fs_mbm_matnr to fs_mbm_sel_type-matnr.
concatenate 'I' 'EQ' i_werks into fs_mbm_werks.
append fs_mbm_werks to fs_mbm_sel_type-werks.
* objects for loading
fs_classes_in_workarea-mtk_inarea = 'X'.
fs_classes_in_workarea-tsk_inarea = 'X'.
fs_classes_in_workarea-seq_inarea = 'X'.
fs_classes_in_workarea-opr_inarea = 'X'.
fs_classes_in_workarea-suo_inarea = 'X'.
fs_classes_in_workarea-prt_inarea = 'X'.
fs_classes_in_workarea-com_inarea = 'X'.
fs_classes_in_workarea-itm_inarea = 'X'.
fs_classes_in_workarea-bom_inarea = 'X'.
* fill selection conditions - PLNTY
concatenate 'I' 'EQ' i_plnty into fs_tsk_plnty_selection.
append fs_tsk_plnty_selection to ft_tsk_plnty_selection.
fs_tsk_selection-plnty = ft_tsk_plnty_selection.
concatenate 'I' 'EQ' i_plnnr into fs_tsk_plnnr_selection.
append fs_tsk_plnnr_selection to ft_tsk_plnnr_selection.
fs_tsk_selection-plnnr = ft_tsk_plnnr_selection.
concatenate 'I' 'EQ' i_plnal into fs_tsk_plnal_selection.
append fs_tsk_plnal_selection to ft_tsk_plnal_selection.
fs_tsk_selection-plnal = ft_tsk_plnal_selection.
* load objects into EWB
call function 'CP_CC_S_LOAD_COMPLEX_BY_TSK'
exporting
i_class = 'P'
i_classes_in_workarea = fs_classes_in_workarea
i_cpsc_tsk_sel = fs_tsk_selection
i_date_from = i_sttag
i_date_to = i_sttag
exceptions
workarea_not_found = 1
workarea_wrong_type = 2
class_in_workarea_inconsistent = 3
workarea_not_specified = 4
opr_not_found = 5
no_selection_criteria = 6
invalid_selection_period = 7
key_date_required_for_ecm = 8
others = 9.
if sy-subrc ne 0.
endif.
call function 'CP_CC_S_LOAD_COMPLEX_BY_BOM'
exporting
i_class = 'P'
* I_PROFILE = I_PROFILE
* I_WORK_AREA = I_WORK_AREA
i_classes_in_workarea = fs_classes_in_workarea
* I_CPSC_MTK_SEL = I_CPSC_MTK_SEL
* I_CPSC_COM_SEL = I_CPSC_COM_SEL
* I_CPSC_TSK_SEL = I_CPSC_TSK_SEL
* I_CPSC_OPR_SEL = I_CPSC_OPR_SEL
* I_CPSC_SUO_SEL = I_CPSC_SUO_SEL
i_cpsc_mbm_sel = fs_mbm_sel_type
* I_CPSC_BOM_SEL = I_CPSC_BOM_SEL
* I_CPSC_ITM_SEL = I_CPSC_ITM_SEL
* I_CPSC_SUI_SEL = I_CPSC_SUI_SEL
* I_CPSC_PRT_SEL = I_CPSC_PRT_SEL
* I_CPSC_PAC_SEL = I_CPSC_PAC_SEL
* I_CPSC_CHA_SEL = I_CPSC_CHA_SEL
* I_CPSC_MST_SEL = I_CPSC_MST_SEL
* I_CPSC_ODP_SEL = I_CPSC_ODP_SEL
* I_CPSC_CLA_SEL = I_CPSC_CLA_SEL
* I_CPSC_ECN_SEL = I_CPSC_ECN_SEL
* I_SEL_OPR_IDENT = I_SEL_OPR_IDENT
i_date_from = i_sttag
i_date_to = i_sttag
* I_MESSAGE_HANDLER = 'X'
* I_SAVE_PROTOCOLL = ' '
* IMPORTING
* E_BOM_IDENT = E_BOM_IDENT
* E_BOM_LOCK = E_BOM_LOCK
* E_ITM_LOCK = E_ITM_LOCK
* E_TSK_LOCK = E_TSK_LOCK
* E_SEQ_LOCK = E_SEQ_LOCK
* E_OPR_LOCK = E_OPR_LOCK
* E_WORKAREA = E_WORKAREA
* E_PROFILE = E_PROFILE
* E_DATE_FROM = E_DATE_FROM
* E_DATE_TO = E_DATE_TO
* E_FLG_ECM_EVALUATION = E_FLG_ECM_EVALUATION
exceptions
workarea_not_found = 1
class_wrong_type = 2
workarea_wrong_type = 3
class_in_workarea_inconsistent = 4
workarea_not_specified = 5
bom_not_found = 6
no_selection_criteria = 7
invalid_selection_period = 8
key_date_required_for_ecm = 9
others = 10
.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.
endform. " LOAD_TASK_LIST
*&---------------------------------------------------------------------*
*& Form componentallocation_ewb
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FS_ALV text
* -->F_PLNNR text
* -->F_PLNAL text
* -->FT_COMALL text
* -->F_ONLY_OPTION text
*----------------------------------------------------------------------*
form componentallocation_ewb using i_matnr like marc-matnr
i_werks like marc-werks
i_stlan like mast-stlan
i_stlal like mast-stlal
i_plnnr type plnnr
i_plnal type plnal
i_plnty like plpo-plnty
i_plnfl type plnfolge.
data: ft_opr_class_data type standard table of opr_class_data.
data: ft_itm_tree_data type standard table of itm_tree_class_data.
data: ft_com_class_data type standard table of com_class_data.
data: ft_opr_all_data_del type cpcl_opr_tab_type.
data: fs_com_ident_delete type cmcl_com_ident_type.
data: fs_itm_ident type cscl_itm_id_xt_type.
data: fs_opr_ident_new type cpcl_opr_type.
data: ft_opr_ident type cpcl_opr_tab_type.
data: ft_opr_ref type cpcl_opr_ref_set_tab_type.
data: ft_ident_delete_tab type cmcl_com_tab_type.
data: fs_com_data type com_class_data.
data: f_error type c.
field-symbols: <opr_all_dell> like line of ft_opr_all_data_del.
field-symbols: <com_class_data> like line of ft_com_class_data.
field-symbols: <oprdata> like line of ft_opr_class_data.
field-symbols: <itmdata> like line of ft_itm_tree_data.
"read BOM and ROUTING data to memory
perform load_task_list
using i_matnr
i_werks
i_plnty
i_plnnr
i_plnal
sy-datum.
"get items tree
call function 'CP_CC_S_PROVIDE_ITM_BY_AS_PATH'
exporting
i_key_date_s = sy-datum
i_application = 'PP01'
i_material_root = i_matnr
i_plant_root = i_werks
i_usage_root = i_stlan
i_alternative_root = i_stlal
* I_SALES_ORDER_ROOT = I_SALES_ORDER_ROOT
* I_SALES_ORDER_ITEM_ROOT = I_SALES_ORDER_ITEM_ROOT
* I_REQUIRED_QUANTITY_ROOT = 1
* I_PATH = ' '
* I_FLG_PATH_PROVIDE_ONLY = ' '
i_flg_path_expand_totally = 'X'
* I_FILTER_EXPRESSION = I_FILTER_EXPRESSION
* I_VERID = I_VERID
* IMPORTING
* E_WORKAREA = E_WORKAREA
* E_DATE_FROM = E_DATE_FROM
* E_DATE_TO = E_DATE_TO
* E_FLG_ECM_EVALUATION = E_FLG_ECM_EVALUATION
tables
c_itm_tree_class_data = ft_itm_tree_data
exceptions
key_date_required_for_ecm = 1
others = 2
.
if sy-subrc eq 0.
"after getting BOM we need to check it ant rework a little
perform item_check tables ft_itm_tree_data.
"get operations data
call function 'CP_CC_S_PROVIDE_COM_BY_OPR'
exporting
i_date_from = sy-datum
i_date_to = sy-datum
i_application = 'PP01'
i_material_root = i_matnr
i_plant_root = i_werks
i_usage_root = i_stlan
i_alternative_root = i_stlal
* I_SALES_ORDER_ROOT = I_SALES_ORDER_ROOT
* I_SALES_ORDER_ITEM_ROOT = I_SALES_ORDER_ITEM_ROOT
* I_REQUIRED_QUANTITY_ROOT = I_REQUIRED_QUANTITY_ROOT
i_plnty = i_plnty
i_plnnr = i_plnnr
i_plnal = i_plnal
i_plnfl = i_plnfl
* I_PLNKN = I_PLNKN
* I_IDENT_OPR = I_IDENT_OPR
* I_IDENT_REF_OPR = I_IDENT_REF_OPR
* I_VORNR_OPR = I_VORNR_OPR
* I_IDENT_ITM = I_IDENT_ITM
* I_FILTER_EXPRESSION = I_FILTER_EXPRESSION
* I_VERID = I_VERID
tables
e_com_class_data = ft_com_class_data
exceptions
no_authority = 1
wrong_key = 2
bom_not_found = 3
no_valid_bom = 4
bom_not_active = 5
others = 6
.
if sy-subrc eq 0.
"delete current assignment of components by setting LOEKZ on PLMZ (save directly after)
clear f_error .
loop at ft_com_class_data assigning <com_class_data>.
call function 'CP_CL_P_OPR_ALLOCATION_PROVIDE'
exporting
i_date_from = sy-datum
i_plnty = <com_class_data>-plnty
i_plnnr = <com_class_data>-plnnr
i_plnkn = <com_class_data>-plnkn
importing
e_opr_ident = ft_opr_all_data_del
exceptions
wrong_key = 1.
if sy-subrc eq 0.
move-corresponding <com_class_data> to fs_com_ident_delete.
* delete current component allocation
call function 'CM_CL_P_COM_DELETE'
exporting "i_ecn_s = i_ecn_s
i_key_date_s = sy-datum
i_com_ident = fs_com_ident_delete
i_opr_alloc_data = ft_opr_all_data_del[]
exceptions
no_valid_com = 1
path_incomplete = 2.
if sy-subrc ne 0.
f_error = 'X'.
perform add_message
using
'W'
'001'
'00'
'Could not delete allocation.'
space
space
space
i_matnr
i_werks
<com_class_data>-plnnr
<com_class_data>-plnal
<com_class_data>-idnrk
c_log-delete.
endif.
endif.
endloop.
"save data (deletion of current assignment)
call function 'CP_CC_S_SAVE'.
if p_test is initial .
commit work.
else.
rollback work.
endif.
endif.
else.
perform add_message
using
'E'
'001'
'00'
'Could not find BOM for'
i_matnr
i_werks
space
i_matnr
i_werks
i_plnnr
i_plnal
space
c_log-create.
endif.
"read operation data
call function 'CP_CC_S_OPR_PROVIDE_BY_MTK'
exporting
i_date_from = sy-datum
i_date_to = sy-datum
i_material = i_matnr
i_plant = i_werks
* I_SALES_ORDER = I_SALES_ORDER
* I_SALES_ORDER_ITEM = I_SALES_ORDER_ITEM
i_plnty = i_plnty
i_plnnr = i_plnnr
i_plnal = i_plnal
i_plnfl = i_plnfl
* I_PLNKN = I_PLNKN
* I_IDENT = I_IDENT
* I_VORNR = I_VORNR
* I_FLG_SUB_OPR_PROVIDE = ' '
* I_FLG_TSK_GROUP_TYPE_PROVIDE = ' '
* I_FLG_PROVIDE_INV = ' '
* I_FILTER_EXPRESSION = I_FILTER_EXPRESSION
* IMPORTING
* E_OPR_INV = E_OPR_INV
tables
e_opr_class_data = ft_opr_class_data
exceptions
wrong_key = 1
others = 2
.
if sy-subrc eq 0.
sort ft_opr_class_data by plnal plnfl plnty plnnr vornr.
endif.
"create components allocation
loop at ft_itm_tree_data assigning <itmdata>.
clear fs_com_data.
if <itmdata>-sortf eq 'SKIP'. "skip components of sub-assemblies which are not phantoms
continue.
endif.
move-corresponding <itmdata> to fs_com_data.
move <itmdata>-stufe_k to fs_com_data-stlst. "order level
if <itmdata>-dumps ne 'X' and fs_com_data-stlst is not initial and
<itmdata>-stlnr_w eq <itmdata>-stlnr.
"we have to calculate proper order level manually....
subtract 1 from fs_com_data-stlst.
endif.
"read if we have assignment to operation in out internal table
"if yes the we create assignment
read table gt_assignment assigning <assign> with key matnr = i_matnr
werks = i_werks
plnnr = i_plnnr
plnfl = i_plnfl
plnal = i_plnal
plnty = i_plnty
stlnr = fs_com_data-stlnr
stlal = fs_com_data-stlal
stlan = i_stlan
posnr = fs_com_data-posnr
idnrk = fs_com_data-idnrk
stlst = fs_com_data-stlst
binary search.
if sy-subrc eq 0.
"read operation data
read table ft_opr_class_data assigning <oprdata> with key plnal = <assign>-plnal
plnfl = <assign>-plnfl
plnty = <assign>-plnty
plnnr = <assign>-plnnr
vornr = <assign>-vornr
binary search.
if sy-subrc eq 0.
"move proper data from operation and item data to component allocation structure
move-corresponding <oprdata> to fs_com_data.
move: <oprdata>-ident to fs_com_data-ident.
move: <itmdata>-ident to fs_com_data-ident_itm.
move: <itmdata>-kante_v to fs_com_data-kante.
move: <itmdata>-kante_v to fs_com_data-kante_v.
move: <itmdata>-stlty to fs_com_data-stlty.
move: <itmdata>-stlnr to fs_com_data-stlnr.
move: <itmdata>-stlal to fs_com_data-stlal.
move: <itmdata>-stvkn to fs_com_data-stlkn.
move: i_matnr to fs_com_data-bomat.
move: i_werks to fs_com_data-werk_stl.
if fs_com_data-vornr is not initial.
"create allocation
call function 'CP_CC_S_CREATE_COM'
exporting
* I_ECN_S = ' '
i_key_date_s = sy-datum
i_com_class_data = fs_com_data
* IMPORTING
* E_ITM_LOCK = E_ITM_LOCK
* E_OPR_LOCK = E_OPR_LOCK
* E_OPR_IDENT_ALLOC_INV = E_OPR_IDENT_ALLOC_INV
* E_ZUONR = E_ZUONR
* E_COM_HANDLE_DEL_TAB = E_COM_HANDLE_DEL_TAB
* E_ECM_DATA_ERROR_TYPE = E_ECM_DATA_ERROR_TYPE
exceptions
no_authority = 1
no_valid_operation = 2
no_valid_item = 3
operation_already_locked = 4
item_already_locked = 5
operation_not_locked = 6
item_not_locked = 7
item_not_specified = 8
operation_not_specified = 9
ecm_data_not_suitable = 10
allocation_not_valid = 11
link_to_ref_set_of_opr = 12
link_to_wc_ref_set_of_opr = 13
others = 14
.
if sy-subrc <> 0.
f_error = 'X'.
perform add_message
using
'E'
'001'
'00'
'Could not create assignment'
i_matnr
i_werks
i_plnnr
i_matnr
i_werks
i_plnnr
i_plnal
fs_com_data-idnrk
c_log-create.
endif.
endif.
else.
perform add_message
using
'E'
'001'
'00'
'Could not find operation'
<assign>-vornr
i_plnnr
i_plnal
i_matnr
i_werks
i_plnnr
i_plnal
fs_com_data-idnrk
c_log-create.
endif.
endif.
endloop.
call function 'CP_CC_S_SAVE'.
if p_test is initial and f_error is initial.
"save only in case of no error appeared
commit work.
else.
rollback work.
endif.
endform. " COMPONENTALLOCATION_EWB
*&---------------------------------------------------------------------*
*& Form load_excel
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form load_excel.
"ole copy of excel data,
data: ft_excel type standard table of alsmex_tabline.
field-symbols: <excel> like line of ft_excel.
data: f_rows type i.
" Excel columns in proper order.
"MATNR WERKS PLNNR PLNFL PLNAL PLNTY VORNR STLNR STLAL STLAN POSNR IDNRK STLST
call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
exporting
filename = p_path
i_begin_col = 1
i_begin_row = 2
i_end_col = 13
i_end_row = p_rows
tables
intern = ft_excel
exceptions
inconsistent_parameters = 1
upload_ole = 2
others = 3.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
data: fs_assign type ty_assignment.
data: fs_plan type ty_plan.
loop at ft_excel assigning <excel>.
case <excel>-col.
when 1.
clear: fs_assign, fs_plan.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-matnr.
fs_plan-matnr = fs_assign-matnr.
when 2.
fs_assign-werks = <excel>-value.
fs_plan-werks = <excel>-value.
when 3.
fs_assign-plnnr = <excel>-value.
fs_plan-plnnr = <excel>-value.
when 4.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-plnfl.
fs_plan-plnfl = fs_assign-plnfl.
when 5.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-plnal.
fs_plan-plnal = fs_assign-plnal.
when 6.
fs_assign-plnty = <excel>-value.
fs_plan-plnty = <excel>-value.
when 7.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-vornr.
when 8.
fs_assign-stlnr = <excel>-value.
when 9.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-stlal.
fs_plan-stlal = fs_assign-stlal.
when 10.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-stlan.
fs_plan-stlan = fs_assign-stlan.
when 11.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-posnr.
when 12.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-idnrk.
if fs_plan-matnr in s_matnr and
fs_plan-werks in s_werks and
fs_plan-plnnr in s_plnnr .
endif.
when 13.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
exporting
input = <excel>-value
importing
output = fs_assign-stlst.
"collect data it's the last cell so we append row to table
collect fs_plan into gt_plan.
append fs_assign to gt_assignment.
endcase.
delete table ft_excel from <excel>.
endloop.
delete gt_assignment where matnr is initial.
"checks of data.
loop at gt_assignment assigning <assign>.
"check if material exists in plant
select single matnr into <assign>-matnr
from marc
where matnr eq <assign>-matnr
and werks eq <assign>-werks.
if sy-subrc ne 0. "material not opened in plant
"error message here
"stop processing "continue to next routing
perform add_message
using
'E'
'001'
'00'
'Material: '
<assign>-matnr
'not opened on plant: '
<assign>-werks
<assign>-matnr
<assign>-werks
<assign>-plnnr
<assign>-plnal
space
c_log-read.
delete gt_assignment where matnr = <assign>-matnr
and werks = <assign>-werks
and plnty = <assign>-plnty
and plnnr = <assign>-plnnr
and plnal = <assign>-plnal
and plnfl = <assign>-plnfl.
continue.
endif.
"check if material exists in plant
select single matnr into <assign>-idnrk
from marc
where matnr eq <assign>-idnrk
and werks eq <assign>-werks.
if sy-subrc ne 0. "material not opened in plant
"error message here
"stop processing "continue to next routing
perform add_message
using
'E'
'001'
'00'
'Component: '
<assign>-idnrk
'not opened on plant: '
<assign>-werks
<assign>-matnr
<assign>-werks
<assign>-plnnr
<assign>-plnal
space
c_log-read.
delete gt_assignment where matnr = <assign>-matnr
and werks = <assign>-werks
and plnty = <assign>-plnty
and plnnr = <assign>-plnnr
and plnal = <assign>-plnal
and plnfl = <assign>-plnfl.
continue.
endif.
"check if routing exist in plant
select single matnr into <assign>-matnr
from mapl
where matnr eq <assign>-matnr
and werks eq <assign>-werks
and plnty eq <assign>-plnty
and plnnr eq <assign>-plnnr
and plnal eq <assign>-plnal.
if sy-subrc ne 0.
"error message here
"stop processing "continue to next routing
perform add_message
using
'E'
'001'
'00'
'Routing not found: '
<assign>-plnty
<assign>-plnnr
<assign>-plnal
<assign>-matnr
<assign>-werks
<assign>-plnnr
<assign>-plnal
space
c_log-read.
delete gt_assignment where matnr = <assign>-matnr
and werks = <assign>-werks
and plnty = <assign>-plnty
and plnnr = <assign>-plnnr
and plnal = <assign>-plnal
and plnfl = <assign>-plnfl.
continue.
endif.
if <assign>-stlnr is initial.
select single stlnr
into <assign>-stlnr
from mast
where matnr eq <assign>-matnr
and werks eq <assign>-werks
and stlan eq <assign>-stlan
and stlal eq <assign>-stlal.
if sy-subrc ne 0.
perform add_message
using
'E'
'001'
'00'
'Could not find BOM for'
<assign>-matnr
<assign>-werks
space
<assign>-matnr
<assign>-werks
<assign>-plnnr
<assign>-plnal
space
c_log-read.
delete gt_assignment where matnr = <assign>-matnr
and werks = <assign>-werks
and plnty = <assign>-plnty
and plnnr = <assign>-plnnr
and plnal = <assign>-plnal
and plnfl = <assign>-plnfl.
continue.
endif.
else.
select single stlnr
into <assign>-stlnr
from stpo
where idnrk eq <assign>-idnrk
and stlnr eq <assign>-stlnr.
if sy-subrc ne 0.
perform add_message
using
'E'
'001'
'00'
'Could not find BOM for'
<assign>-idnrk
<assign>-werks
space
<assign>-idnrk
<assign>-werks
<assign>-plnnr
<assign>-plnal
space
c_log-read.
delete gt_assignment where matnr = <assign>-matnr
and werks = <assign>-werks
and plnty = <assign>-plnty
and plnnr = <assign>-plnnr
and plnal = <assign>-plnal
and plnfl = <assign>-plnfl.
continue.
endif.
endif.
endloop.
sort gt_assignment by matnr werks plnnr plnfl plnal plnty stlnr stlal stlan posnr idnrk stlst.
sort gt_plan by matnr werks plnty plnnr plnal plnfl.
endform. "load_excel
*&---------------------------------------------------------------------*
*& Form create_assignment
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form create_assignment.
loop at gt_plan assigning <plan>.
perform componentallocation_ewb
using
<plan>-matnr
<plan>-werks
<plan>-stlan
<plan>-stlal
<plan>-plnnr
<plan>-plnal
<plan>-plnty
<plan>-plnfl.
endloop.
endform. "create_assignment
*&---------------------------------------------------------------------*
*& Form add_message
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_TYPE text
* -->I_NUMBER text
* -->I_ID text
* -->I_V1 text
* -->I_V2 text
* -->I_V3 text
* -->I_V4 text
* -->I_MATNR text
* -->I_WERKS text
* -->I_PLNNR text
* -->I_PLNAL text
* -->I_IDNRK text
*----------------------------------------------------------------------*
form add_message using value(i_type)
value(i_number)
value(i_id)
value(i_v1)
value(i_v2)
value(i_v3)
value(i_v4)
value(i_matnr)
value(i_werks)
value(i_plnnr)
value(i_plnal)
value(i_idnrk)
value(i_log_no).
clear gs_return.
gs_return-type = i_type.
gs_return-id = i_id.
gs_return-number = i_number.
gs_return-message_v1 = i_v1.
gs_return-message_v2 = i_v2.
gs_return-message_v3 = i_v3.
gs_return-message_v4 = i_v4.
gs_return-log_no = i_log_no.
message id i_id type i_type number i_number with i_v1 i_v2 i_v3 i_v4 into gs_return-message.
concatenate i_matnr i_werks i_plnnr into gs_return-parameter separated by space.
concatenate i_plnal i_idnrk into gs_return-field separated by space.
"gs_return-row
"gs_return-system
append gs_return to gt_return.
clear gs_return.
endform. "add_message
*&---------------------------------------------------------------------*
*& Form display_log
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form display_log.
data: fs_layout type slis_layout_alv.
fs_layout-colwidth_optimize = 'X'.
if gt_return[] is initial.
perform add_message
using
'S'
'001'
'00'
'No errors appeared'
space
space
space
space
space
space
space
space
c_log-read.
endif.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
i_structure_name = 'BAPIRET2'
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE = I_GRID_TITLE
* I_GRID_SETTINGS = I_GRID_SETTINGS
is_layout = fs_layout
* IT_FIELDCAT = IT_FIELDCAT
* IT_EXCLUDING = IT_EXCLUDING
* IT_SPECIAL_GROUPS = IT_SPECIAL_GROUPS
* IT_SORT = IT_SORT
* IT_FILTER = IT_FILTER
* IS_SEL_HIDE = IS_SEL_HIDE
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT = IS_VARIANT
* IT_EVENTS = IT_EVENTS
* IT_EVENT_EXIT = IT_EVENT_EXIT
* IS_PRINT = IS_PRINT
* IS_REPREP_ID = IS_REPREP_ID
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS = IT_ALV_GRAPHICS
* IT_HYPERLINK = IT_HYPERLINK
* IT_ADD_FIELDCAT = IT_ADD_FIELDCAT
* IT_EXCEPT_QINFO = IT_EXCEPT_QINFO
* IR_SALV_FULLSCREEN_ADAPTER = IR_SALV_FULLSCREEN_ADAPTER
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER = E_EXIT_CAUSED_BY_CALLER
* ES_EXIT_CAUSED_BY_USER = ES_EXIT_CAUSED_BY_USER
tables
t_outtab = gt_return[]
exceptions
program_error = 1
others = 2
.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.
endform. "display_log
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->TT_EXTAB text
*----------------------------------------------------------------------*
form set_pf_status using tt_extab type slis_t_extab.
set pf-status 'STANDARD' of program sy-repid immediately.
endform. "set_pf_status
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->F_UCOMM text
* -->FS_SELFIELD text
*----------------------------------------------------------------------*
form user_command using f_ucomm like sy-ucomm
fs_selfield type slis_selfield.
data: ft_return type bapiret2_t.
case f_ucomm.
when 'CREATE_ASS'.
perform create_assignment.
ft_return[] = gt_return[].
sort ft_return by log_no.
read table ft_return with key log_no = c_log-delete transporting no fields binary search.
if sy-subrc ne 0.
perform add_message
using
'S'
'001'
'00'
'No errors appeared'
space
space
space
space
space
space
space
space
c_log-delete.
endif.
read table ft_return with key log_no = c_log-create transporting no fields binary search.
if sy-subrc ne 0.
perform add_message
using
'S'
'001'
'00'
'No errors appeared'
space
space
space
space
space
space
space
space
c_log-create.
endif.
fs_selfield-refresh = 'X'.
endcase.
endform. "USER_COMMAND
*&---------------------------------------------------------------------*
*& Form item_check
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FT_ITEM_CLASS_DATA text
*----------------------------------------------------------------------*
form item_check tables ft_item_class_data structure itm_tree_class_data.
field-symbols: <itmdata> type itm_tree_class_data.
data: f_kante type plmz-kante.
data: f_kante_global type plmz-kante.
field-symbols: <prev_dummy_dumps> type itm_tree_class_data.
read table ft_item_class_data index 1 assigning <prev_dummy_dumps>.
loop at ft_item_class_data assigning <itmdata>.
clear <itmdata>-handle.
clear <itmdata>-kante_v.
clear <itmdata>-sortf.
if <prev_dummy_dumps>-stlnr ne <itmdata>-stlnr and <prev_dummy_dumps>-dumps ne 'X'.
"If we have sub-assembly which is not phantom it still has to be taken into accout
"when calculating kante_v but it must be skipped during creation of assignments
<itmdata>-sortf = 'SKIP'.
"I mark in sanfe field that this is sub-assembly without phantom
<prev_dummy_dumps>-sanfe = 'S'.
continue.
endif.
if <itmdata>-dumps eq 'X'.
read table ft_item_class_data index sy-tabix assigning <prev_dummy_dumps>.
endif.
endloop.
loop at ft_item_class_data assigning <itmdata>.
if <itmdata>-handle is not initial.
continue.
endif.
<itmdata>-handle = sy-tabix.
if <itmdata>-dumps eq 'X' .
add 1 to f_kante_global.
<itmdata>-kante_v = f_kante_global.
perform recursive_item_check tables ft_item_class_data
using <itmdata>
changing <itmdata>-kante_v
f_kante_global.
elseif <itmdata>-sanfe eq 'S'. "dummy code for not needed entry
data: f_dummy_kante type plmz-kante.
add 1 to f_kante_global.
perform recursive_item_check tables ft_item_class_data
using <itmdata>
changing f_dummy_kante
f_kante_global.
elseif <itmdata>-itsob eq '52'.
add 1 to f_kante_global.
<itmdata>-kante_v = f_kante_global.
else.
clear <itmdata>-kante_v.
endif.
endloop.
endform. "item_check
*&---------------------------------------------------------------------*
*& Form recursive_item_check
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FT_ITEM_CLASS_DATA text
* -->FS_ITEM text
* -->F_KANTE text
* -->F_KANTE_GLOBAL text
*----------------------------------------------------------------------*
form recursive_item_check tables ft_item_class_data structure itm_tree_class_data
using fs_item type itm_tree_class_data
changing f_kante type plmz-kante
f_kante_global type plmz-kante.
field-symbols: <itmdata> type itm_tree_class_data.
data: ls_items type itm_tree_class_data.
data: f_tabix type sy-tabix.
data: f_stlnr type stko-stlnr.
f_tabix = fs_item-handle + 1 .
read table ft_item_class_data assigning <itmdata> index f_tabix.
if sy-subrc eq 0.
f_stlnr = <itmdata>-stlnr.
endif.
loop at ft_item_class_data assigning <itmdata> from f_tabix .
if <itmdata>-stlnr ne f_stlnr.
exit.
endif.
<itmdata>-handle = sy-tabix.
if <itmdata>-dumps eq 'X' .
add 1 to f_kante_global.
<itmdata>-kante_v = f_kante_global.
perform recursive_item_check tables ft_item_class_data
using
<itmdata>
changing
<itmdata>-kante_v
f_kante_global .
elseif <itmdata>-sanfe eq 'S'. "dummy code for not needed entriy
data: f_dummy_kante type plmz-kante.
add 1 to f_kante_global.
perform recursive_item_check tables ft_item_class_data
using <itmdata>
changing f_dummy_kante
f_kante_global.
elseif <itmdata>-itsob eq '52'.
add 1 to f_kante_global.
<itmdata>-kante_v = f_kante_global.
else.
<itmdata>-kante_v = f_kante. "path in expl
endif.
endloop.
endform.
.png)

