搜档网
当前位置:搜档网 › ABAP_BOM导入

ABAP_BOM导入

*&---------------------------------------------------------------------*
*& REPORT ZPLMB003
*&报表名称:EBOM批量导入
*&---------------------------------------------------------------------*
*&开发者:张立群
*&开发时间:20120415
* by sober_h 替换导入模版
*&---------------------------------------------------------------------*
REPORT zplm2.
TYPE-POOLS: truxs ,slis.
*输入界面
SELECTION-SCREEN BEGIN OF BLOCK s_a1 WITH FRAME TITLE text-001.
PARAMETERS:
pt_file LIKE rlgrap-filename OBLIGATORY ,"DEFAULT 'C:.XLS'.
p_datuv LIKE rc29n-datuv DEFAULT sy-datum,"生效日期,缺省为当前日期
p_stlan LIKE rc29n-stlan DEFAULT '2',"BOM用途:缺省为2ebom
p_stlst LIKE rc29k-stlst DEFAULT '1',"BOM状态:缺省为1激活
p_stlal LIKE rc29n-stlal DEFAULT '1',"可选的BOM
p_postp LIKE rc29p-postp DEFAULT 'L',
p_kmpmg TYPE kmpmg DEFAULT 1,
p_test AS CHECKBOX.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) t1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 4(70) t2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK s_a1.
DATA: is_layout TYPE slis_layout_alv,
it_fieldcat TYPE slis_t_fieldcat_alv,
wa LIKE LINE OF it_fieldcat,
alv_wa LIKE LINE OF it_fieldcat,
alv_top_of_page TYPE slis_formname,
i_list_comments TYPE slis_t_listheader,
i_events TYPE slis_t_event,
i_event_exit TYPE slis_t_event_exit.
DATA: w_variant LIKE disvariant, "显示变式结构
wx_variant LIKE disvariant,
w_variant_save(1) TYPE c,
w_repid LIKE sy-repid.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: it_raw TYPE truxs_t_text_data.

DATA:
*BOM 组 CREATE-/CHANGE BAPI 物料 BOM
it_bomgroup LIKE bapi1080_bgr_c OCCURS 0 WITH HEADER LINE,
*可选/变式 CREATE-/CHANGE BAPI 物料 BOM
it_variants LIKE bapi1080_bom_c OCCURS 0 WITH HEADER LINE,
*组件 CREATE-/CHANGE BAPI 物料 BOM
it_items LIKE bapi1080_itm_c OCCURS 0 WITH HEADER LINE,
*物料分配 CREATE-/CHANGE BAPI 物料 BOM
it_matrel LIKE bapi1080_mbm_c OCCURS 0 WITH HEADER LINE,
*分配 CREATE-/CHANGE BAPI ITM/BOM 物料 BOM
it_itemas LIKE bapi1080_rel_itm_bom_c OCCURS 0 WITH HEADER LINE,
*参数消息
it_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.


*
DATA: BEGIN OF it_tab OCCURS 0,
matnr LIKE mara-matnr, "物料号char(18)
* BMENG LIKE STKO-BMENG,
* BMEIN LIKE RC29K-BMEIN, "BOM基本单位char(3)
bom_text LIKE stko_api01-bom_text, "BOM 文本
* POSNR LIKE RC29P-POSNR, "Item行号
matnr1 LIKE mara-matnr, "物料号char(18)
bmeng1(18) TYPE c,"LIKE STPO-MENGE,
* BMEIN1 LIKE RC29K-BMEIN,

"BOM基本单位char(3)
item_text2 LIKE stpo_api01-item_text2, "STPO-POTX2 表头相关文档
END OF it_tab.

DATA : BEGIN OF lt_in OCCURS 0,
sel TYPE string,
cha2(40),
cha3(40),
cha4(40),
cha5(40),
cha6(40),
cha7(40),
cha8(40),
cha9(40),
cha10(40),
cha11(40),
cha12(100),
matnr TYPE matnr,
END OF lt_in.

DATA wa_in LIKE LINE OF lt_in.
DATA ww_in LIKE LINE OF lt_in.
DATA sel LIKE lt_in-sel.
DATA: sel_value(5) TYPE n,
sel_value1(5) TYPE n,
sel_value2(5) TYPE n,
sel_value3(5) TYPE n,
sel_value4 TYPE string.
DATA: www_in TYPE string,
ww_out TYPE string,
www_out TYPE string.


DATA lt_out LIKE TABLE OF lt_in WITH HEADER LINE .
DATA:BEGIN OF it_error OCCURS 0,"message
matnr LIKE mara-matnr, "物料号char(18)
maktx LIKE makt-maktx,
* BMENG LIKE STKO-BMENG,
* BMEIN LIKE RC29K-BMEIN, "BOM基本单位char(3)
bom_text LIKE stko_api01-bom_text, "BOM 文本
* POSNR LIKE RC29P-POSNR, "Item行号
matnr1 LIKE mara-matnr, "物料号char(18)
maktx1 LIKE makt-maktx,
bmeng1(18) TYPE c,"LIKE STPO-MENGE,
* BMEIN1 LIKE RC29K-BMEIN, "BOM基本单位char(3)
item_text2 LIKE stpo_api01-item_text2, "STPO-POTX2 表头相关文档
message LIKE bapiret2-message, "消息文本char(220)
END OF it_error.
DATA: gtchen LIKE it_tab .

DATA:li TYPE i,
zmatnr TYPE mara-matnr,
p_flag,
testflag LIKE bapiflag,
e_index(3) TYPE c ,
c_index(3) TYPE c ,
zkmpmg TYPE kmpmg,
friend(50) TYPE c.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pt_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
* FIELD_NAME = ' '
IMPORTING
file_name = pt_file
.

INITIALIZATION.
t1 = '备注:直接用PDM整理文件导入!'.
t2 = '模板请使用TXT文件;单位默认为物料基本单位;小数点自动截取前3位!'.

START-OF-SELECTION.
MOVE '程序正在运行,请等待! ' TO friend.
MOVE '1 %' TO friend+38(4).
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = friend.
*是否测试
IF p_test = 'X'.
testflag = 'X'.
ENDIF.

PERFORM upload.
PERFORM input.
PERFORM alv.


*&---------------------------------------------------------------------*
*& Form UPLOAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM upload.
DATA: index(5) TYPE n VALUE 1,
index1(5) TYPE n,
index2(5) TYPE n.

CALL FUNCTION 'WS_UPLOAD'
EXPORTING
* CODEPAGE = ' '
filename = pt_file
filetype

= 'DAT'
TABLES
data_tab = lt_in .
IF lt_in[] IS INITIAL.
MESSAGE '文本文件无数据,请检查' TYPE 'S'.
STOP.
ENDIF.

DATA line(5) TYPE n.
"通过查询是否含有'-'来判断子项。
DESCRIBE TABLE lt_in LINES line.
LOOP AT lt_in FROM index . "遍历内表数据
IF index = line. "判断行数是否达到最大行数
ENDIF.

IF lt_in-sel = '0' . "如果为了0的时候单独判断子项
index1 = index + 1.
LOOP AT lt_in INTO ww_in FROM index1.
IF ww_in-sel <> ' '.
SEARCH ww_in-sel FOR '-' .
IF sy-subrc <> 0 .
it_tab-matnr = lt_in-cha3.
it_tab-matnr1 = ww_in-cha3.
it_tab-bmeng1 = ww_in-cha2 / lt_in-cha2.
APPEND it_tab.
ENDIF.
ENDIF.
index1 = index1 + 1.
ENDLOOP.
ELSE. "判断子项
CLEAR ww_in.
sel_value1 = STRLEN( lt_in-sel ).
sel_value = STRLEN( lt_in-sel ) + 1 .
index2 = index + 1.
LOOP AT lt_in INTO ww_in FROM index2.
sel_value2 = STRLEN( ww_in-sel ).
IF sel_value1 < sel_value2.
ww_out = ww_in-sel+0(sel_value1).
IF lt_in-sel = ww_out. "判断当前循环的子项是否满足条件
* sel_value2 = STRLEN( ww_in-sel ).
IF sel_value2 > sel_value.
sel_value3 = sel_value2 - sel_value.
www_in = ww_in-sel+sel_value(sel_value3).
SEARCH www_in FOR '-'.
IF sy-subrc <> 0.
it_tab-matnr = lt_in-cha3.
it_tab-matnr1 = ww_in-cha3.
it_tab-bmeng1 = ww_in-cha2 / lt_in-cha2.
APPEND it_tab.
ENDIF.
ENDIF.
ENDIF.
endif.
index2 = index2 + 1.
ENDLOOP.

ENDIF.
index = index + 1.
CLEAR index2.
ENDLOOP.

LOOP AT it_tab.

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = it_tab-matnr
IMPORTING
output = it_tab-matnr.

CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = it_tab-matnr1
IMPORTING
output = it_tab-matnr1.
MODIFY it_tab.
ENDLOOP.
ENDFORM. "UPLOAD

*&---------------------------------------------------------------------*
*& Form INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM input.
li = 0.
LOOP AT it_tab.
IF it_tab-matnr <> zmatnr.
IF li <> 0 .
REFRESH it_return.
CALL FUNCTION 'BAPI_MATERIAL_BOM_GROUP_CREATE'
EXPORTING
testrun = testflag
all_error = 'X'
TABLES
bomgroup = it_bomgroup
variants =

it_variants
items = it_items
materialrelations = it_matrel
itemassignments = it_itemas
return = it_return.
IF it_return[] IS INITIAL.
MOVE-CORRESPONDING gtchen TO it_error.
it_error-message = '可以导入'.
APPEND it_error.
ELSE.
CLEAR: it_error,p_flag.
LOOP AT it_return.
CASE it_return-type .
WHEN 'E'.
MOVE-CORRESPONDING gtchen TO it_error.
it_error-message = it_return-message.
APPEND it_error.
p_flag = 'X'.
WHEN 'I'.
MOVE-CORRESPONDING gtchen TO it_error.
it_error-message = it_return-message.
APPEND it_error.
ENDCASE.
ENDLOOP.
ENDIF.

IF p_flag <> 'X' AND p_test <> 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.

ENDIF.
ENDIF.
li = 0.
CLEAR it_matrel.
REFRESH it_matrel.
it_matrel-bom_group_identification = 'BAPI_SMP_COL1'. "标识物料单组
it_matrel-material = it_tab-matnr. "物料号
it_matrel-bom_usage = p_stlan. "BOM用途
it_matrel-alternative_bom = p_stlal. "可选的BOM
APPEND it_matrel.

CLEAR it_bomgroup.
REFRESH it_bomgroup.
it_bomgroup-bom_group_identification = 'BAPI_SMP_COL1'."标识物料单组
it_bomgroup-object_type = 'BGR'. "BOM 组中的对象类型
it_bomgroup-object_id = 'SIMPLE1'. "BOM 组中对象的标识
it_bomgroup-bom_usage = p_stlan. "BOM用途
it_bomgroup-ltxt_lang = sy-langu. "语言:用此语言存储长文本
APPEND it_bomgroup.

CLEAR it_itemas.
REFRESH it_itemas.
it_itemas-bom_group_identification = 'BAPI_SMP_COL1'. "标识物料单组
it_itemas-sub_object_type = 'ITM'. "子对象物料单类型
it_itemas-sub_object_id = 'SIMPLE1'. "对象标识子对象物料单
it_itemas-super_object_type = 'BOM'. "超级对象BOM类型
it_itemas-super_object_id = 'SIMPLE1'. "超级对象BOM的对象ID
it_itemas-valid_from_date = p_datuv. "有效起始日期
it_itemas-function = 'NEW'. "功能
APPEND it_itemas.

CLEAR it_variants.
REFRESH it_variants.
it_variants-bom_group_identification = 'BAPI_SMP_COL1'."标识物料单组
it_variants-object_type = 'BOM'. "BOM 组中的对象类型
it_variants-object_id = 'SIMPLE1'. "BOM 组中对象的标识
it_variants-alternative_bom = p_stlal. "可选的BOM
it_variants-bom_status = p_stlst. "BOM 状态
it_variants-alt_text = it_tab-bom_t

ext."可选bom文本
it_variants-base_qty = p_kmpmg. "基本数量
it_variants-valid_from_date = p_datuv. "有效起始日期
it_variants-function = 'NEW'. "功能
APPEND it_variants.
REFRESH it_items.
ENDIF.
zkmpmg = it_tab-bmeng1.
PERFORM append_item USING it_tab-matnr1 zkmpmg it_tab-item_text2 .
zmatnr = it_tab-matnr.
MOVE-CORRESPONDING it_tab TO gtchen.
ENDLOOP.
* CLEAR FRIEND.
* CONCATENATE IT_TAB-MATNR '正在处理' INTO FRIEND.
* CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
* EXPORTING
* text = FRIEND.
REFRESH it_return.
CALL FUNCTION 'BAPI_MATERIAL_BOM_GROUP_CREATE'
EXPORTING
testrun = testflag
all_error = 'X'
TABLES
bomgroup = it_bomgroup
variants = it_variants
items = it_items
materialrelations = it_matrel
itemassignments = it_itemas
return = it_return.
IF it_return[] IS INITIAL.
MOVE-CORRESPONDING it_tab TO it_error.
it_error-message = '可以导入'.
APPEND it_error.
ELSE.
CLEAR: it_error,p_flag.
LOOP AT it_return.
CASE it_return-type .
WHEN 'E'.
MOVE-CORRESPONDING it_tab TO it_error.
it_error-message = it_return-message.
APPEND it_error.
p_flag = 'X'.
WHEN 'I'.
MOVE-CORRESPONDING it_tab TO it_error.
it_error-message = it_return-message.
APPEND it_error.
ENDCASE.
ENDLOOP.
ENDIF.
IF p_flag <> 'X' AND p_test <> 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDIF.
ENDFORM. "INPUT

*&---------------------------------------------------------------------*
*& Form APPEND_ITEM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_TAB_MATNR1 text
* -->P_IT_TAB_BMENG1 text
* -->P_IT_TAB_POTX2 text
*----------------------------------------------------------------------*
FORM append_item USING
p_it_tab_matnr1
p_it_tab_bmeng1
p_it_tab_potx2.
DATA:zposnr(4) TYPE n.
CLEAR zposnr.
IF li = 0.
li = 1.
ELSE.
li = li + 1.
ENDIF.
CLEAR it_items.
it_items-bom_group_identification = 'BAPI_SMP_COL1'. "标识物料单组
it_items-object_type = 'ITM'. "BOM 组中的对象类型
it_items-object_id = 'SIMPLE1'. "BOM 组中对象的标识
zposnr = li * 10.
it_items-item_no = zposnr. "BOM 项目号
it_items-item_cat = p_postp. "项目类别(物料单)
it_items-component = p_it_tab_matnr1. "BOM 组件
it_items-comp_qty = p_it_tab_bmeng1 . "组件数量
* IT_ITEMS-COMP

_UNIT = P_IT_TAB_BMEIN1. "组件计量单位
it_items-valid_from_date = p_datuv.
* IT_ITEMS-ITEM_TEXT1 = P_IT_TAB_POTX1. "文本1
it_items-item_text2 = p_it_tab_potx2. "文本2
APPEND it_items.
ENDFORM. " append_item


*&---------------------------------------------------------------------*
*& Form ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv.
DELETE ADJACENT DUPLICATES FROM it_error.
* LOOP AT it_error.
* SELECT SINGLE zmaktx INTO it_error-maktx
* FROM zzplmt238
* WHERE matnr = it_error-matnr.
* SELECT SINGLE zmaktx INTO it_error-maktx1
* FROM zzplmt238
* WHERE matnr = it_error-matnr1.
* MODIFY it_error.
* ENDLOOP.

CLEAR: w_variant.
w_repid = sy-repid. "当前程序
w_variant-report = w_repid.
w_variant-username = sy-uname.
w_variant_save = 'A'. "All types
DATA:it_fieldcat TYPE slis_t_fieldcat_alv.
is_layout-colwidth_optimize = 'X'.
is_layout-zebra = 'X'. "设置每行的背景颜色交错 显示。

PERFORM init_fieldcat CHANGING it_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = w_repid
i_callback_user_command = 'USER_COMMAND'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
it_fieldcat = it_fieldcat
is_layout = is_layout
TABLES
t_outtab = it_error[].

ENDFORM. "ALV

*&---------------------------------------------------------------------*
*& Form INIT_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_FIELDCAT text
*----------------------------------------------------------------------*
FORM init_fieldcat CHANGING p_it_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.

ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-seltext_m = '父项物料'.
ls_fieldcat-no_zero = 'X'.
APPEND ls_fieldcat TO p_it_fieldcat.

ls_fieldcat-fieldname = 'MAKTX'.
ls_fieldcat-seltext_m = '父项物料KMBOM描述'.
APPEND ls_fieldcat TO p_it_fieldcat.

ls_fieldcat-fieldname = 'MATNR1'.
ls_fieldcat-seltext_m = '子项物料'.
ls_fieldcat-no_zero = 'X'.
APPEND ls_fieldcat TO p_it_fieldcat.

ls_fieldcat-fieldname = 'MAKTX1'.
ls_fieldcat-seltext_m = '子项物料KMBOM描述'.
APPEND ls_fieldcat TO p_it_fieldcat.

ls_fieldcat-fieldname = 'MESSAGE'.
ls_fieldcat-seltext_m = '消息'.
APPEND ls_fieldcat TO p_it_fieldcat.

ENDFORM. " INIT_FIELDCAT




*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&------------------------------

---------------------------------------*
* text
*----------------------------------------------------------------------*
* -->UCOMM text
* -->SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
READ TABLE it_error INDEX selfield-tabindex.
CHECK sy-subrc = 0.
CASE ucomm.
WHEN '&IC1'.
CHECK it_error-matnr <> ''.
SET PARAMETER ID 'MAT' FIELD it_error-matnr.
SET PARAMETER ID 'CSV' FIELD p_stlan.
CALL TRANSACTION 'CS03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDFORM . "USER_COMMAND

*&---------------------------------------------------------------------*
*& Form HTML_TOP_OF_PAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->CL_DD text
*----------------------------------------------------------------------*
FORM html_top_of_page USING cl_dd TYPE REF TO cl_dd_document.
DATA: m_p TYPE i.
DATA: m_buff TYPE string.
* DATA: E_TONGJI_INFO TYPE STRING.
* DATA: C_TONGJI_INFO TYPE STRING.
* CONCATENATE '正确导入记录数:' C_INDEX INTO C_TONGJI_INFO.
* CONCATENATE '错误导入记录数:' E_INDEX INTO E_TONGJI_INFO.

m_buff = ''.

CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.

CONCATENATE '' '

' '' 'PLM批量维护E_BOM' '' '
' '' INTO m_buff.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.

m_buff = '
'.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.

CONCATENATE '正确记录数:' c_index INTO m_buff.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.

m_buff = '
'.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.

CONCATENATE '错误记录数:' e_index INTO m_buff.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.


m_buff = ''.
CALL METHOD cl_dd->html_insert
EXPORTING
contents = m_buff
CHANGING
position = m_p.
ENDFORM. "HTML_END_OF_PAGE

相关主题