这个程序是根据条件把某些工厂的某些物料的某些BOM,Copy到别外的工厂,当目标工厂存在要复制的BOM的时候,用源BOM代替目标BOM,当目标BOM不存在的时候,就根据源BOM创建目标BOM。
这个程序用到了BOM的一些常用Function和BAPI
BAPI_MATERIAL_BOM_GROUP_CREATE
CSAP_MAT_BOM_READ
CSAP_MAT_BOM_OPEN
CSAP_BOM_ITEM_MAINTAIN
CSAP_MAT_BOM_CLOSE
REPORT
zppinf1001.
INCLUDE
<icon>.
*----------------------------------------------------------------------*
*
变量定义
*----------------------------------------------------------------------*
TABLES
mast.
TYPES: ty_tab_matnr TYPE mara-matnr OCCURS
0,
ty_tab_plant TYPE
marc-werks OCCURS 0,
ty_tab_stpo2 TYPE stpo_api02 OCCURS
0,
ty_tab_stko2 TYPE
stko_api02 OCCURS 0,
ty_tab_s_mat TYPE s_matnr OCCURS 0.
TYPES: BEGIN OF
ty_mast,
matnr TYPE
mast-matnr,
werks
TYPE mast-werks,
stlan TYPE
mast-stlan,
stlnr
TYPE mast-stlnr,
stlal TYPE mast-stlal,
END
OF ty_mast.
TYPES: BEGIN OF
ty_material,
matnr
TYPE mara-matnr,
werks TYPE marc-werks,
END
OF ty_material.
TYPES ty_tab_mast TYPE ty_mast OCCURS
0.
TYPES ty_tab_messages TYPE messages OCCURS
0.
TYPES ty_tab_material TYPE ty_material OCCURS
0.
DATA: g_valid_from TYPE
csap_mbom-datuv.
*----------------------------------------------------------------------*
*
选择屏幕设计
*----------------------------------------------------------------------*
SELECTION-SCREEN
BEGIN OF BLOCK blk WITH FRAME TITLE text-000.
SELECT-OPTIONS:
s_matnr FOR
mast-matnr,
s_stlan FOR mast-stlan NO-EXTENSION NO INTERVALS
OBLIGATORY,
s_stlal FOR mast-stlal NO-EXTENSION NO INTERVALS
OBLIGATORY,
s_source FOR mast-werks NO-EXTENSION NO INTERVALS
OBLIGATORY.
SELECTION-SCREEN
SKIP.
SELECT-OPTIONS: s_target FOR
mast-werks,
s_stlan2 FOR mast-stlan NO-EXTENSION NO INTERVALS
OBLIGATORY,
s_stlal2 FOR mast-stlal NO-EXTENSION NO INTERVALS
OBLIGATORY.
PARAMETERS p_exist TYPE c AS
CHECKBOX.
SELECTION-SCREEN END OF BLOCK
blk.
*----------------------------------------------------------------------*
*
CLASS lcl_bom
DEFINITION
*----------------------------------------------------------------------*
*
BOM的处理类定义
*----------------------------------------------------------------------*
CLASS
lcl_bom DEFINITION FINAL.
PUBLIC
SECTION.
METHODS write_header_text
"输出结果列表的选择条件的相关信息
IMPORTING
pt_plant
TYPE ty_tab_plant.
METHODS
check_exist_bom
"检验指定条件的物料是否存在BOM
IMPORTING
p_material TYPE csap_mbom-matnr
"料号
p_plant TYPE csap_mbom-werks
"工厂
p_bom_usage TYPE csap_mbom-stlan "BOM
Usage
p_alternative
TYPE csap_mbom-stlal "Alternative
BOM
pt_target TYPE
ty_tab_mast
RETURNING
value(p_flag) TYPE char01.
"检查结果返回标识,X代表存在
METHODS
get_data
"根据条件查询数据
EXPORTING
value(pt_source) TYPE
ty_tab_mast
value(pt_target) TYPE ty_tab_mast.
METHODS
get_target_plant
RETURNING
value(pt_plant) TYPE ty_tab_plant.
METHODS
check_matnr
"检查指定的物料是否在指定的工厂存在
IMPORTING
p_matnr TYPE
mast-matnr
p_plant TYPE
mast-werks
RETURNING
value(p_flag) TYPE char01.
METHODS
check_component
"检查指定的组件是否在指定的工厂存在
IMPORTING
p_matnr TYPE
mast-matnr
p_plant TYPE
mast-werks
pt_stpo TYPE
ty_tab_stpo2
RETURNING
value(p_flag) TYPE char01.
METHODS
set_log.
"设置Log,可以事务码SLG1查看
METHODS
get_current_log
"取得当前Log信息
RETURNING
value(pt_messages) TYPE ty_tab_messages.
METHODS
read_bom
"查看BOM信息
IMPORTING
p_material TYPE
csap_mbom-matnr
p_plant TYPE
csap_mbom-werks
p_bom_usage TYPE
csap_mbom-stlan
p_alternative TYPE
csap_mbom-stlal
p_valid_from TYPE
csap_mbom-datuv
EXPORTING
value(pt_stpo) TYPE
ty_tab_stpo2
value(pt_stko) TYPE
ty_tab_stko2
value(p_flag) TYPE char01.
METHODS
create_bom
"创建BOM
IMPORTING
p_material TYPE
csap_mbom-matnr
p_plant TYPE
csap_mbom-werks
pt_stpo TYPE
ty_tab_stpo2
pt_stko TYPE
ty_tab_stko2
RETURNING
value(p_flag) TYPE char01.
METHODS
maintain_bom
"维护BOM
IMPORTING
p_material TYPE
csap_mbom-matnr
p_plant TYPE
csap_mbom-werks
p_usage TYPE
csap_mbom-stlan
p_alternative TYPE
csap_mbom-stlal
p_valid TYPE
csap_mbom-datuv
pt_stpo TYPE
ty_tab_stpo2
pt_stko TYPE
ty_tab_stko2
RETURNING
value(p_flag) TYPE char01.
METHODS
constructor.
"构造方法
"类的全局变量
DATA: BEGIN OF
lwa_mat_wer,
matnr TYPE
mara-matnr,
werks TYPE
marc-werks,
END OF lwa_mat_wer.
DATA: lt_mat_wer2
LIKE TABLE OF lwa_mat_wer.
PRIVATE
SECTION.
DATA: lt_mat_wer LIKE TABLE OF
lwa_mat_wer.
ENDCLASS.
"lcl_bom
DEFINITION
*----------------------------------------------------------------------*
*
CLASS lcl_bom
IMPLEMENTATION
*----------------------------------------------------------------------*
*
BOM的处理类实现
*----------------------------------------------------------------------*
CLASS
lcl_bom IMPLEMENTATION.
*输出结果列表的选择条件的相关信息
METHOD write_header_text.
DATA: l_temp TYPE i
VALUE 1,
l_plant TYPE marc-werks.
FORMAT COLOR 1
ON.
IF s_matnr IS
INITIAL.
WRITE: ‘BOM Material:
All‘.
ELSEIF s_matnr-low IS NOT INITIAL AND
s_matnr-high IS NOT INITIAL.
WRITE: / ‘BOM
Material:‘,s_matnr-low,‘To‘,s_matnr-high.
ELSEIF s_matnr-high IS INITIAL.
WRITE: / ‘BOM Material:‘,s_matnr-low.
ENDIF.
WRITE: / ‘Source
Plant:‘,s_source-low.
WRITE: / ‘BOM
Usage:‘,s_stlan-low.
WRITE: / ‘Alternative
BOM:‘,s_stlal-low.
SKIP.
WRITE / ‘Target
Plant:‘.
LOOP AT pt_plant INTO
l_plant.
IF l_temp >
15.
WRITE /16
l_plant.
l_temp =
2.
CONTINUE.
ENDIF.
WRITE
l_plant.
l_temp = l_temp +
1.
ENDLOOP.
WRITE: / ‘BOM
Usage:‘,s_stlan2-low.
WRITE: / ‘Alternative
BOM:‘,s_stlal2-low.
IF p_exist =
‘X‘.
WRITE / ‘Skip if target
plant exist‘.
ENDIF.
FORMAT COLOR
OFF.
ULINE.
ENDMETHOD.
"wwrite_header_text
*检验指定条件的物料是否存在BOM
METHOD check_exist_bom.
DATA l_alternative
LIKE p_alternative.
READ TABLE pt_target
WITH KEY matnr =
p_material
werks =
p_plant
stlan =
p_bom_usage
stlal =
p_alternative
TRANSPORTING NO FIELDS.
IF sy-subrc =
0.
p_flag =
‘X‘.
ENDIF.
ENDMETHOD.
"check_exist_bom
*根据条件取得所有要复制到其他工厂的BOM的物料
METHOD get_data.
"取得表MAST的数据
SELECT DISTINCT
matnr
werks
stlan
stlnr
stlal
INTO TABLE pt_source FROM
mast
WHERE matnr IN
s_matnr.
pt_target =
pt_source.
DELETE pt_source WHERE NOT (
werks IN s_source AND stlan IN s_stlan AND stlal IN s_stlal
).
DELETE pt_target WHERE NOT ( werks IN
s_target AND stlan IN s_stlan2 AND stlal IN s_stlal2 ).
ENDMETHOD.
"get_data
*根据条件取得目标工厂
METHOD
get_target_plant.
SELECT werks INTO TABLE
pt_plant FROM
t001w
WHERE werks IN s_target.
ENDMETHOD.
"get_target_plant
*判断指定的料号在指定的工厂是否存在
METHOD check_matnr.
"根据条件取得物料和工厂的内表
IF lt_mat_wer IS
INITIAL.
SELECT
mara~matnr
marc~werks
INTO TABLE
lt_mat_wer
FROM
mara
INNER JOIN marc ON
mara~matnr = marc~matnr
WHERE
mara~matnr IN s_matnr
AND marc~werks IN s_target.
ENDIF.
"查询内表,判断指定料号是否在指定的工厂里
READ TABLE lt_mat_wer
WITH KEY matnr =
p_matnr
werks =
p_plant
TRANSPORTING NO FIELDS.
"存在
IF sy-subrc =
0.
p_flag =
‘X‘.
ENDIF.
ENDMETHOD.
"check_matnr
*检查指定的组件是否在指定的工厂存在
METHOD check_component.
DATA: l_matnr TYPE
mara-matnr,
lt_matnr LIKE RANGE OF
l_matnr,
lwa_matnr LIKE LINE OF
lt_matnr,
lwa_stpo LIKE LINE OF pt_stpo.
"组织选择内表
LOOP AT pt_stpo INTO
lwa_stpo.
lwa_matnr-sign = ‘I‘.
lwa_matnr-option = ‘EQ‘.
CALL
FUNCTION
‘CONVERSION_EXIT_ALPHA_INPUT‘
EXPORTING
input =
lwa_stpo-component
IMPORTING
output = lwa_stpo-component.
lwa_matnr-low =
lwa_stpo-component.
lwa_matnr-high = ‘‘.
APPEND lwa_matnr TO lt_matnr.
ENDLOOP.
"根据条件取得物料和工厂的内表
IF lt_mat_wer2 IS
INITIAL.
SELECT
mara~matnr
marc~werks
INTO TABLE
lt_mat_wer2
FROM
mara
INNER JOIN marc ON
mara~matnr = marc~matnr
WHERE
mara~matnr IN
lt_matnr
AND
marc~werks = p_plant.
ENDIF.
"查询内表,判断指定料号是否在指定的工厂里
READ TABLE lt_mat_wer2
WITH KEY matnr =
p_matnr
TRANSPORTING NO FIELDS.
"存在
IF sy-subrc =
0.
p_flag =
‘X‘.
ENDIF.
ENDMETHOD.
"check_component
*设置Log,可以用事务码SLG1查看
METHOD set_log.
CALL FUNCTION
‘CALO_INIT_API‘
EXCEPTIONS
log_object_not_found =
1
log_sub_object_not_found =
2
other_error
= 3
OTHERS
= 4.
ENDMETHOD.
"set_log
*取得当前Log信息
METHOD
get_current_log.
CALL FUNCTION
‘CALO_LOG_READ_MESSAGES‘
TABLES
messages_and_parameters =
pt_messages
EXCEPTIONS
warning
= 1
error
= 2
OTHERS
= 3.
ENDMETHOD.
"get_current_log
*读取指定的BOM
METHOD
read_bom.
"调用FM查看指定的物料的BOM
CALL FUNCTION
‘CSAP_MAT_BOM_READ‘
EXPORTING
material =
p_material
plant =
p_plant
bom_usage =
p_bom_usage
alternative =
p_alternative
valid_from = p_valid_from
TABLES
t_stpo =
pt_stpo
t_stko =
pt_stko
EXCEPTIONS
error =
1.
"判断是否查看bom数据成功
IF sy-subrc =
0.
p_flag =
‘X‘.
ELSE.
p_flag =
‘‘.
ENDIF.
ENDMETHOD.
"read_bom
*创建BOM
METHOD
create_bom.
DATA: lwa_bomgroup TYPE
bapi1080_bgr_c,
lt_bomgroup LIKE TABLE OF
lwa_bomgroup,
lwa_variant TYPE
bapi1080_bom_c,
lt_variant LIKE TABLE OF
lwa_variant,
lwa_items TYPE
bapi1080_itm_c,
lt_items LIKE TABLE OF
lwa_items,
lwa_mbm TYPE
bapi1080_mbm_c,
lt_mbm LIKE TABLE OF
lwa_mbm,
lwa_itemass TYPE
bapi1080_rel_itm_bom_c,
lt_itemass LIKE TABLE OF
lwa_itemass,
lwa_return TYPE
bapiret2,
lt_return LIKE TABLE OF
lwa_return.
DATA: l_alternative TYPE
stpo_api02-bom_alt,
l_component TYPE
stpo_api02-component,
l_error TYPE
string.
CONSTANTS: bom_group_identification
TYPE
bapi1080_bgr_c-bom_group_identification
VALUE
‘BAPI_SMP_COL4‘,
object_id TYPE bapi1080_bgr_c-object_id VALUE
‘SIMPLE1‘.
FIELD-SYMBOLS: <fs_stko>
LIKE LINE OF
pt_stko,
<fs_stpo> LIKE LINE OF pt_stpo.
"循环内表pt_stpo
LOOP AT pt_stpo ASSIGNING
<fs_stpo>.
"在Component前面添零
CLEAR
l_component.
CALL FUNCTION
‘CONVERSION_EXIT_ALPHA_INPUT‘
EXPORTING
input =
<fs_stpo>-component
IMPORTING
output = l_component.
"添加BOM
Items
CLEAR
lwa_items.
lwa_items-bom_group_identification =
bom_group_identification.
lwa_items-object_type = ‘ITM‘.
lwa_items-object_id = object_id.
lwa_items-item_no =
<fs_stpo>-item_no.
lwa_items-item_cat =
<fs_stpo>-item_categ.
lwa_items-component =
l_component.
lwa_items-comp_qty =
<fs_stpo>-comp_qty.
lwa_items-comp_unit =
<fs_stpo>-comp_unit.
lwa_items-valid_from_date =
sy-datum.
APPEND lwa_items TO
lt_items.
ENDLOOP.
"循环内表
LOOP AT pt_stko ASSIGNING
<fs_stko>.
"添加BOM
Group信息
CLEAR
lwa_bomgroup.
lwa_bomgroup-bom_group_identification =
bom_group_identification.
lwa_bomgroup-object_type = ‘BGR‘.
lwa_bomgroup-object_id =
object_id.
lwa_bomgroup-bom_usage
= s_stlan2-low.
lwa_bomgroup-bom_group =
<fs_stko>-bom_group.
lwa_bomgroup-created_in_plant =
p_plant.
lwa_bomgroup-auth_group
= <fs_stko>-auth_group.
lwa_bomgroup-technical_type = ‘
‘.
lwa_bomgroup-ltxt_lang =
sy-langu.
lwa_bomgroup-bom_text =
<fs_stko>-bom_text.
APPEND
lwa_bomgroup TO lt_bomgroup.
"添加Variant信息
CLEAR
lwa_variant.
lwa_variant-bom_group_identification =
bom_group_identification.
lwa_variant-object_type = ‘BOM‘.
lwa_variant-object_id =
object_id.
lwa_variant-alternative_bom =
s_stlal2-low.
lwa_variant-bom_status =
<fs_stko>-bom_status.
lwa_variant-deletion_ind =
<fs_stko>-delete_ind.
lwa_variant-base_qty =
<fs_stko>-base_quan.
lwa_variant-base_unit =
<fs_stko>-base_unit.
lwa_variant-lab_design =
<fs_stko>-laboratory.
lwa_variant-ltxt_lang = sy-langu.
lwa_variant-alt_text =
<fs_stko>-alt_text.
lwa_variant-valid_from_date =
sy-datum.
lwa_variant-change_no =
<fs_stko>-chg_no.
lwa_variant-function = ‘NEW‘.
APPEND lwa_variant TO lt_variant.
ENDLOOP.
CLEAR
lwa_mbm.
lwa_mbm-bom_group_identification =
bom_group_identification.
lwa_mbm-material =
p_material.
lwa_mbm-bom_usage =
s_stlan2-low.
lwa_mbm-plant =
p_plant.
lwa_mbm-alternative_bom =
s_stlal2-low.
APPEND lwa_mbm TO
lt_mbm.
CLEAR
lwa_itemass.
lwa_itemass-bom_group_identification =
bom_group_identification.
lwa_itemass-sub_object_type = ‘ITM‘.
lwa_itemass-sub_object_id = object_id.
lwa_itemass-super_object_type = ‘BOM‘.
lwa_itemass-super_object_id = object_id.
lwa_itemass-valid_from_date = sy-datum.
lwa_itemass-function = ‘NEW‘.
APPEND
lwa_itemass TO lt_itemass.
"调用BAPI创建BOM
CALL FUNCTION
‘BAPI_MATERIAL_BOM_GROUP_CREATE‘
EXPORTING
all_error =
‘X‘
TABLES
bomgroup =
lt_bomgroup
variants =
lt_variant
items =
lt_items
materialrelations =
lt_mbm
itemassignments =
lt_itemass
return =
lt_return.
p_flag =
‘X‘.
LOOP AT lt_return INTO lwa_return WHERE
type = ‘A‘ OR type = ‘E‘.
p_flag
= ‘‘.
l_error =
lwa_return-message.
EXPORT p1 =
l_error TO MEMORY ID ‘CREATE‘.
EXIT.
ENDLOOP.
IF p_flag =
‘X‘.
CALL FUNCTION
‘BAPI_TRANSACTION_COMMIT‘.
ELSE.
CALL FUNCTION
‘BAPI_TRANSACTION_ROLLBACK‘.
ENDIF.
FREE:
lt_bomgroup,
lt_variant,
lt_items,
lt_mbm,
lt_itemass,
lt_return.
ENDMETHOD.
"create_bom
*维护BOM
METHOD
maintain_bom.
DATA:
lwa_stpo LIKE LINE OF
pt_stpo,
l_material LIKE
p_material,
lt_stpo2 TYPE
ty_tab_stpo2,
lt_stpo2_temp TYPE
ty_tab_stpo2,
lt_messages TYPE
ty_tab_messages,
lwa_messages LIKE LINE OF
lt_messages,
l_error TYPE
string.
FIELD-SYMBOLS <fs_stpo> LIKE
LINE OF pt_stpo.
"补0
CALL FUNCTION
‘CONVERSION_EXIT_ALPHA_INPUT‘
EXPORTING
input
= p_material
IMPORTING
output =
l_material.
p_flag =
‘X‘.
"Log
CALL METHOD
me->set_log.
"打开BOM维护
CALL FUNCTION
‘CSAP_MAT_BOM_OPEN‘
EXPORTING
material =
l_material
plant =
p_plant
bom_usage =
p_usage
alternative =
p_alternative
valid_from = p_valid
TABLES
t_stpo =
lt_stpo2
EXCEPTIONS
error =
1.
IF sy-subrc =
0.
"先把所有目标工厂的BOM数据打上删除标记
lwa_stpo-fldelete = ‘X‘.
MODIFY
lt_stpo2 FROM lwa_stpo TRANSPORTING fldelete WHERE fldelete <>
‘X‘.
LOOP AT pt_stpo INTO
lwa_stpo.
READ TABLE
lt_stpo2 ASSIGNING <fs_stpo> WITH KEY component =
lwa_stpo-component.
IF sy-subrc =
0.
"找到则是需要修改的
lwa_stpo-itm_ident =
<fs_stpo>-itm_ident.
lwa_stpo-bom_no =
<fs_stpo>-bom_no.
lwa_stpo-item_node =
<fs_stpo>-item_node.
lwa_stpo-item_count =
<fs_stpo>-item_count.
lwa_stpo-valid_from =
p_valid.
APPEND lwa_stpo TO
lt_stpo2_temp.
"删除lt_stpo3里修改的记录,剩下的就是删除的
DELETE lt_stpo2 WHERE itm_ident =
<fs_stpo>-itm_ident.
ELSE.
"找不到的则是新增的
lwa_stpo-itm_ident =
‘‘.
lwa_stpo-bom_no =
‘‘.
lwa_stpo-item_node =
‘‘.
lwa_stpo-item_count =
‘‘.
lwa_stpo-valid_from =
p_valid.
APPEND lwa_stpo TO
lt_stpo2_temp.
ENDIF.
ENDLOOP.
"把lt_stpo2剩下的,即是删除的添加内表lt_stpo2_temp
APPEND LINES OF lt_stpo2 TO lt_stpo2_temp.
ELSE.
p_flag =
‘‘.
lt_messages =
me->get_current_log( ).
LOOP
AT lt_messages INTO lwa_messages WHERE msg_type =
‘E‘
OR msg_type = ‘A‘.
l_error =
lwa_messages-msg_txt.
EXPORT p1 = l_error TO MEMORY ID
‘MAINTAIN‘.
EXIT.
ENDLOOP.
EXIT.
ENDIF.
"循环处理BOM
Item
LOOP AT lt_stpo2_temp INTO
lwa_stpo.
"补零
CALL FUNCTION
‘CONVERSION_EXIT_ALPHA_INPUT‘
EXPORTING
input =
lwa_stpo-component
IMPORTING
output = lwa_stpo-component.
CALL
FUNCTION
‘CSAP_BOM_ITEM_MAINTAIN‘
EXPORTING
i_stpo = lwa_stpo
EXCEPTIONS
error = 1.
IF sy-subrc
<> 0.
p_flag =
‘‘.
lt_messages =
me->get_current_log(
).
LOOP AT
lt_messages INTO lwa_messages WHERE msg_type =
‘E‘
OR msg_type =
‘A‘.
EXPORT p1 = lwa_messages-msg_txt TO MEMORY ID
‘MAINTAIN‘.
EXIT.
ENDLOOP.
EXIT.
ENDIF.
ENDLOOP.
"关闭BOM维护
CALL FUNCTION
‘CSAP_MAT_BOM_CLOSE‘
EXCEPTIONS
error =
1.
IF sy-subrc <>
0.
p_flag =
‘‘.
EXIT.
ENDIF.
FREE:
lt_stpo2,
lt_stpo2_temp.
ENDMETHOD.
"maintain_bom
*构造方法
METHOD
constructor.
"格式化有限日期
CONCATENATE
sy-datum+6(2)
sy-datum+4(2)
sy-datum+0(4)
INTO g_valid_from SEPARATED BY
‘.‘.
ENDMETHOD.
"contructor
ENDCLASS.
"lcl_bom
IMPLEMENTATION
*&---------------------------------------------------------------------*
*&
Form
f_set_clock
*&---------------------------------------------------------------------*
*
程序处理时状态栏显示的小时钟
*----------------------------------------------------------------------*
*
-->P_PERCENTAGE
时钟显示的百分比
*----------------------------------------------------------------------*
FORM
f_set_clock USING p_percentage.
CALL FUNCTION
‘SAPGUI_PROGRESS_INDICATOR‘
EXPORTING
percentage =
p_percentage.
ENDFORM.
"f_set_clock
*&---------------------------------------------------------------------*
*&
Form
f_main
*&---------------------------------------------------------------------*
*
子程序。整合所有方法,执行并输出结果
*----------------------------------------------------------------------*
FORM
f_main.
DATA: lt_source TYPE
ty_tab_mast,
lwa_source LIKE LINE OF
lt_source,
lt_target TYPE
ty_tab_mast,
lwa_target LIKE LINE OF
lt_target,
lt_plant TYPE
ty_tab_plant,
lt_stpo2 TYPE
ty_tab_stpo2,
lwa_stpo2 LIKE LINE OF
lt_stpo2,
lt_stko2 TYPE ty_tab_stko2.
DATA:
l_flag,
l_error
TYPE string,
l_count TYPE
string,
l_count1 TYPE
i,
"成功的记录数
l_count2 TYPE
i,
"失败的记录数
l_werks
LIKE LINE OF lt_plant.
DATA: lr_bom TYPE REF
TO lcl_bom.
*创建类LCL_BOM对象
CREATE
OBJECT lr_bom.
*筛选选择的物料
CALL METHOD
lr_bom->get_data
IMPORTING
pt_source =
lt_source
pt_target =
lt_target.
PERFORM f_set_clock USING
10.
*取得目标工厂内表
lt_plant =
lr_bom->get_target_plant( ).
IF lt_source IS
INITIAL
OR lt_plant IS
INITIAL.
MESSAGE
s003(zmm).
EXIT.
ENDIF.
PERFORM f_set_clock USING
50.
*输出选择条件文本
lr_bom->write_header_text( lt_plant ).
SORT
lt_source BY werks.
"按工厂处理BOM
LOOP AT lt_plant INTO l_werks.
CLEAR:
l_count1,l_count2.
"如果源BOM和目标BOM相同,跳过
IF s_source-low =
l_werks
AND s_stlan-low =
s_stlan2-low
AND s_stlal-low =
s_stlal2-low.
CONTINUE.
ENDIF.
WRITE:/ ‘Start
plant‘,l_werks.
"循环源物料内表,处理指定工厂的物料
LOOP AT lt_source INTO
lwa_source.
"查看BOM数据
CALL METHOD
lr_bom->read_bom
EXPORTING
p_material =
lwa_source-matnr
p_plant =
s_source-low
p_bom_usage =
s_stlan-low
p_alternative =
s_stlal-low
p_valid_from =
g_valid_from
IMPORTING
pt_stpo =
lt_stpo2
pt_stko =
lt_stko2
p_flag =
l_flag.
"查得数据成功
IF sy-subrc = 0 AND
l_flag = ‘X‘.
"如果BOM的Item为空
IF
lt_stpo2 IS
INITIAL.
FORMAT COLOR 6
ON.
WRITE: /3 icon_cancel AS
ICON,
‘Material‘,
lwa_source-matnr+10(8),
‘BOM
Usage‘,
s_stlan-low,
‘not found in source
plant‘,
s_source-low.
FORMAT COLOR 6
OFF.
l_count2 = l_count2 +
1.
CONTINUE.
ENDIF.
"判断当前物料是否在目标工厂中存在
l_flag =
lr_bom->check_matnr(
p_matnr =
lwa_source-matnr
p_plant = l_werks
).
"物料不在目标工厂就跳过
IF
l_flag <>
‘X‘.
WRITE: /3 icon_skip AS
ICON,
‘Material‘,
lwa_source-matnr+10(8),
‘not found in target
plant‘,
l_werks.
l_count2 = l_count2 +
1.
CONTINUE.
ENDIF.
"
判断组件是否在目标工厂中存在
CLEAR
lr_bom->lt_mat_wer2.
LOOP AT lt_stpo2 INTO
lwa_stpo2.
"补零
CALL
FUNCTION
‘CONVERSION_EXIT_ALPHA_INPUT‘
EXPORTING
input =
lwa_stpo2-component
IMPORTING
output =
lwa_stpo2-component.
l_flag =
lr_bom->check_component(
p_matnr =
lwa_stpo2-component
p_plant =
l_werks
pt_stpo =
lt_stpo2
).
IF
l_flag <>
‘X‘.
WRITE: /3 icon_skip AS
ICON,
‘Component‘,
lwa_stpo2-component+10(8),
‘not found in target
plant‘,
l_werks.
l_count2 = l_count2 +
1.
EXIT.
ENDIF.
ENDLOOP.
"如果组件在目标工厂不存在,跳过
CHECK l_flag =
‘X‘.
"判断目标BOM是否存在
l_flag =
lr_bom->check_exist_bom(
p_material =
lwa_source-matnr
p_plant =
l_werks
p_bom_usage =
s_stlan2-low
p_alternative =
s_stlal2-low
pt_target =
lt_target
).
"目标BOM存在
IF l_flag =
‘X‘.
"存在是否跳过
IF p_exist <>
‘X‘.
"维护BOM
l_flag =
lr_bom->maintain_bom(
p_material =
lwa_source-matnr
p_plant =
l_werks
p_usage =
s_stlan2-low
p_alternative =
s_stlal2-low
p_valid =
g_valid_from
pt_stpo =
lt_stpo2
pt_stko =
lt_stko2
).
IF l_flag =
‘X‘.
*
WRITE: /3 icon_okay AS
ICON,
*
‘Material‘,
*
lwa_source-matnr+10(8),
*
‘copy success to
plant‘,
*
l_werks.
l_count1 = l_count1 +
1.
ELSE.
"从内存取得错误文本
IMPORT p1 = l_error FROM MEMORY ID
‘MAINTAIN‘.
IF sy-subrc =
0.
FORMAT COLOR 6
ON.
WRITE: /3 icon_cancel AS
ICON,l_error.
FORMAT COLOR 6
OFF.
FREE MEMORY ID
‘MAINTIAN‘.
l_count2 = l_count2 +
1.
CONTINUE.
ENDIF.
ENDIF.
ELSE.
WRITE: /3 icon_skip AS
ICON,
‘Material‘,
lwa_source-matnr+10(8),
‘BOM exists and skip copy to
plant‘,
l_werks.
l_count2 = l_count2 +
1.
ENDIF.
ELSE.
"BOM不存在,创建BOM
l_flag =
lr_bom->create_bom(
p_material =
lwa_source-matnr
p_plant =
l_werks
pt_stpo =
lt_stpo2
pt_stko =
lt_stko2
).
IF
l_flag =
‘X‘.
*
"输出成功创建BOM的信息
*
WRITE: /3 icon_okay AS
ICON,
*
‘Material‘,
*
lwa_source-matnr+10(8),
*
‘copy success to
plant‘,
*
l_werks.
l_count1 = l_count1 +
1.
ELSE.
IMPORT p1 = l_error FROM MEMORY ID
‘CREATE‘.
IF sy-subrc =
0.
FORMAT COLOR 6
ON.
WRITE: /3 icon_cancel AS
ICON,
l_error.
FREE MEMORY ID
‘CREATE‘.
l_count2 = l_count2 +
1.
ENDIF.
FORMAT COLOR 6
OFF.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
l_count =
l_count1.
WRITE:/ l_count,‘material copied
success‘.
l_count =
l_count2.
WRITE:/ l_count,‘material copied
fail‘.
SKIP.
ENDLOOP.
WRITE / ‘-- End of Report
--‘.
FREE:
lt_source,
lt_target,
lt_plant,
lt_stpo2,
lt_stko2.
ENDFORM.
"f_main
*----------------------------------------------------------------------*
*
执行事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM f_main.
原文:http://www.cnblogs.com/eric0701/p/3566575.html