*&---------------------------------------------------------------------*
*& Report ZPPU011
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPPU011.
*---------------------------------------------------------------------*
* Tables Declarition
*---------------------------------------------------------------------*
TABLES: mkal,sscrfields.
*---------------------------------------------------------------------*
* Types
*---------------------------------------------------------------------*
TYPES:BEGIN OF ty_tab,
werks TYPE mkal-werks, "工厂
matnr TYPE mkal-matnr, "物料号
verid TYPE mkal-verid, "生产版本号
text1 TYPE mkal-text1, "生产版本描述
bstmi TYPE mkal-bstmi, "从批量
bstma TYPE mkal-bstma, "到批量
adatu TYPE mkal-adatu, "生产版本开始日期
bdatu TYPE mkal-bdatu, "生产版本有效结束日
plnty TYPE mkal-plnty, "任务清单类型
plnnr TYPE mkal-plnnr, "工艺路线组
alnal TYPE mkal-alnal, "工艺路线组计数器
stlal TYPE mkal-stlal, "可选BOM
stlan TYPE mkal-stlan, "BOM用途
elpro TYPE mkal-elpro, "发货存储位置
alort TYPE mkal-alort, "收货地点
maktx TYPE makt-maktx, "物料描述
icon TYPE icon_d, "消息类型
msg TYPE bapi_msg, "消息
END OF ty_tab.
*内表定义
DATA: gt_tab TYPE TABLE OF ty_tab WITH HEADER LINE.
*ALV定义
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo.
*EXCEL文件定义
DATA: gv_objid TYPE w3objid VALUE 'ZPPU011',
gv_filename TYPE string VALUE '生产版本导入模板',
gv_begin_col TYPE i VALUE 1,
gv_begin_row TYPE i VALUE 2,
gv_end_col TYPE i VALUE 15,
gv_end_row TYPE i VALUE 65535.
*BDC定义
DATA: gt_bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE,
gt_messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
gt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
CONSTANTS: c_global_applid TYPE applid VALUE 'TKW-4035'.
*---------------------------------------------------------------------*
* Selection Screen
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bk1.
PARAMETERS: p_file LIKE rlgrap-filename MODIF ID m1.
SELECT-OPTIONS: s_werks FOR mkal-werks MODIF ID m2,
s_matnr FOR mkal-matnr MODIF ID m2.
SELECTION-SCREEN END OF BLOCK bk1.
SELECTION-SCREEN BEGIN OF BLOCK bk2.
PARAMETERS: p_dr RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND u2,
p_cx RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK bk2.
SELECTION-SCREEN:FUNCTION KEY 1.
*---------------------------------------------------------------------*
* Initialization
*---------------------------------------------------------------------*
INITIALIZATION.
sscrfields-functxt_01 = icon_export && '模版下载'.
*---------------------------------------------------------------------*
* At Selection Screen
*---------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FC01'.
PERFORM frm_get_model USING gv_objid.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_f4."路径搜索帮助打开
*---------------------------------------------------------------------*
* At Selection-Screen Output
*---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_set_screen.
*---------------------------------------------------------------------*
* Start-of-selection
*---------------------------------------------------------------------*
START-OF-SELECTION.
IF p_dr = 'X'.
IF p_file IS INITIAL.
MESSAGE s055(00) DISPLAY LIKE 'E'.
RETURN.
ENDIF.
PERFORM frm_upload_data. "上载数据
PERFORM frm_setdata.
ELSEIF p_cx = 'X'.
PERFORM frm_get_data.
ENDIF.
PERFORM frm_layout.
PERFORM frm_fieldcat.
PERFORM frm_output.
*&---------------------------------------------------------------------*
*& Form frm_set_screen
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_set_screen .
LOOP AT SCREEN.
IF p_dr = 'X'.
IF screen-group1 = 'M2'.
screen-active = 0.
ELSE.
screen-active = 1.
ENDIF.
ENDIF.
IF p_cx = 'X'.
IF screen-group1 = 'M1'.
screen-active = 0.
ELSE.
screen-active = 1.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_setdata .
DATA: lv_bstmi TYPE string,
lv_bstma TYPE string,
lt_tab TYPE TABLE OF ty_tab WITH HEADER LINE.
lt_tab[] = gt_tab[].
DELETE ADJACENT DUPLICATES FROM lt_tab COMPARING werks matnr.
LOOP AT lt_tab.
PERFORM bdc_dynpro USING 'SAPLCMFV' '1000'.
PERFORM bdc_field: USING 'BDC_OKCODE' '=ENTE',
USING 'BDC_CURSOR' 'MKAL-MATNR',
USING 'MKAL-WERKS' lt_tab-werks,
USING 'MKAL-MATNR' lt_tab-matnr.
LOOP AT gt_tab WHERE werks = lt_tab-werks AND matnr = lt_tab-matnr.
PERFORM bdc_dynpro USING 'SAPLCMFV' '1000'.
PERFORM bdc_field: USING 'BDC_OKCODE' '=CREA',
USING 'BDC_CURSOR' 'MKAL-WERKS',
USING 'MKAL-WERKS' gt_tab-werks,
USING 'MKAL-MATNR' gt_tab-matnr.
PERFORM bdc_dynpro USING 'SAPLCMFV' '2000'.
PERFORM bdc_field: USING 'BDC_CURSOR' 'MKAL_EXPAND-STLAN',
USING 'BDC_OKCODE' '=CLOS',
USING 'MKAL_EXPAND-MATNR' gt_tab-matnr,
USING 'MKAL_EXPAND-VERID' gt_tab-verid,
USING 'MKAL_EXPAND-TEXT1' gt_tab-text1.
CLEAR:lv_bstmi,lv_bstma.
lv_bstmi = gt_tab-bstmi.
lv_bstma = gt_tab-bstma.
PERFORM bdc_field: USING 'MKAL_EXPAND-BSTMI' lv_bstmi,
USING 'MKAL_EXPAND-BSTMA' lv_bstma,
USING 'MKAL_EXPAND-ADATU' gt_tab-adatu,
USING 'MKAL_EXPAND-BDATU' gt_tab-bdatu.
IF gt_tab-plnty IS NOT INITIAL.
PERFORM bdc_field USING 'MKAL_EXPAND-PLNTY' gt_tab-plnty.
ELSE.
PERFORM bdc_field USING 'MKAL_EXPAND-PLNTY' 'N'.
ENDIF.
PERFORM bdc_field: USING 'MKAL_EXPAND-PLNNR' gt_tab-plnnr,
USING 'MKAL_EXPAND-ALNAL' gt_tab-alnal,
USING 'MKAL_EXPAND-STLAL' gt_tab-stlal,
USING 'MKAL_EXPAND-STLAN' gt_tab-stlan,
USING 'MKAL_EXPAND-ELPRO' gt_tab-elpro,
USING 'MKAL_EXPAND-ALORT' gt_tab-alort,
USING 'BDC_OKCODE' '=PRFG'. "点击检查按钮
PERFORM bdc_dynpro USING 'SAPMSSY0' '0120'.
PERFORM bdc_field USING 'BDC_OKCODE' '=RW'. "退出检查窗口
PERFORM bdc_dynpro USING 'SAPLCMFV' '2000'.
PERFORM bdc_field USING 'BDC_OKCODE' '/ECANC'. "退出生产版本明细窗口
ENDLOOP.
PERFORM bdc_dynpro USING 'SAPLCMFV' '1000'.
PERFORM bdc_field: USING 'BDC_OKCODE' '=SAVE',
USING 'BDC_CURSOR' 'MKAL-WERKS'.
CALL TRANSACTION 'C223' USING gt_bdcdata
MODE 'N'
UPDATE 'L'
MESSAGES INTO gt_messtab.
CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
TABLES
imt_bdcmsgcoll = gt_messtab
ext_return = gt_return.
LOOP AT gt_return WHERE type CA 'EXA'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
LOOP AT gt_tab WHERE werks = lt_tab-werks AND matnr = lt_tab-matnr.
gt_tab-icon = icon_red_light.
gt_tab-msg = gt_return-message.
MODIFY gt_tab.
ENDLOOP.
ELSE.
LOOP AT gt_tab WHERE werks = lt_tab-werks AND matnr = lt_tab-matnr.
gt_tab-icon = icon_green_light.
gt_tab-msg = '创建成功'.
MODIFY gt_tab.
ENDLOOP.
ENDIF.
CLEAR: gt_bdcdata[],gt_messtab[],gt_return[].
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT mkal~werks mkal~matnr mkal~verid mkal~text1
mkal~bstmi mkal~bstma mkal~adatu mkal~bdatu
mkal~plnty mkal~plnnr mkal~alnal mkal~stlal
mkal~stlan mkal~elpro mkal~alort
makt~maktx
FROM mkal
INNER JOIN makt ON mkal~matnr = makt~matnr
AND makt~spras = sy-langu
INTO CORRESPONDING FIELDS OF TABLE gt_tab
WHERE mkal~werks IN s_werks
AND mkal~matnr IN s_matnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_layout .
gs_layout-zebra = 'X' . " 使ALV界面呈现颜色交替
gs_layout-sel_mode = 'A' . " 选择模式,“A”在最左端有选择按钮
gs_layout-cwidth_opt = 'X' . " 自动优化列宽
gs_layout-detailinit = 'X' . " 是否出现细节屏幕
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
IF p_dr = 'X'.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'ICON' '' '' '标识' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'MSG' '' '' '消息' '' '' '' '' ''.
ENDIF.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'WERKS' 'MKAL' 'WERKS' '工厂' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'MATNR' 'MKAL' 'MATNR' '物料号' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'MAKTX' 'MAKT' 'MAKTX' '物料描述' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'VERID' 'MKAL' 'VERID' '生产版本号' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'TEXT1' 'MKAL' 'TEXT1' '生产版本描述' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'BSTMI' 'MKAL' 'BSTMI' '从批量' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'BSTMA' 'MKAL' 'BSTMA' '到批量' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'ADATU' 'MKAL' 'ADATU' '有效开始日期' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'BDATU' 'MKAL' 'BDATU' '有效结束日期' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'PLNTY' 'MKAL' 'PLNTY' '任务清单类型' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'PLNNR' 'MKAL' 'PLNNR' '工艺路线组' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'ALNAL' 'MKAL' 'ALNAL' '工艺路线组计数器' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'STLAL' 'MKAL' 'STLAL' '可选BOM' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'STLAN' 'MKAL' 'STLAN' 'BOM用途' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'ELPRO' 'MKAL' 'ELPRO' '发货存储位置' '' '' '' '' ''.
PERFORM frm_field_lvc TABLES gt_fieldcat USING 'ALORT' 'MKAL' 'ALORT' '收货地点' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FIELD_LVC
*&---------------------------------------------------------------------*
*& 设置字段目录
*&---------------------------------------------------------------------*
FORM frm_field_lvc TABLES pt_fieldcat_lvc STRUCTURE lvc_s_fcat
USING pv_fieldname TYPE lvc_rfname
pv_ref_table TYPE lvc_tname
pv_ref_field TYPE lvc_rfname
pv_text TYPE string
pv_edit TYPE c
pv_nzero TYPE c
pv_f4 TYPE c
pv_no_out TYPE c
pv_outputlen TYPE i.
DATA: ls_fieldcat_lvc TYPE lvc_s_fcat.
ls_fieldcat_lvc-fieldname = pv_fieldname.
ls_fieldcat_lvc-ref_field = pv_ref_field.
ls_fieldcat_lvc-ref_table = pv_ref_table.
ls_fieldcat_lvc-colddictxt = 'L'.
ls_fieldcat_lvc-scrtext_l = pv_text.
ls_fieldcat_lvc-edit = pv_edit.
ls_fieldcat_lvc-no_zero = pv_nzero.
ls_fieldcat_lvc-f4availabl = pv_f4.
ls_fieldcat_lvc-no_out = pv_no_out.
ls_fieldcat_lvc-outputlen = pv_outputlen.
APPEND ls_fieldcat_lvc TO pt_fieldcat_lvc.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_output .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = gt_tab
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_F4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_f4 .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = '*.xls,*.xlsx.'
mode = '0'
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_MODEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_get_model USING p_objid TYPE wwwdata-objid.
DATA: ls_objdata TYPE wwwdatatab,
lv_subrc TYPE sy-subrc,
lv_fullpath TYPE string,
lv_fname TYPE rlgrap-filename.
PERFORM get_file_name CHANGING lv_fullpath.
IF lv_fullpath = space.
MESSAGE '请选择下载文件名' TYPE 'E'.
ELSE.
CONCATENATE lv_fullpath '' INTO lv_fname.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE relid = 'MI'
AND objid = p_objid .
IF sy-subrc NE 0 OR ls_objdata-objid = space.
MESSAGE e001(00) WITH '文件不存在!'.
ELSE.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = lv_fname
IMPORTING
rc = lv_subrc
CHANGING
temp = lv_fname.
IF lv_subrc NE 0.
MESSAGE e001(00) WITH '文件下载失败!'.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILE_NAME
*&---------------------------------------------------------------------*
*& 获取要下载的文件名字
*&---------------------------------------------------------------------*
FORM get_file_name CHANGING pv_fullpath.
DATA: lv_path TYPE string,
lv_fullpath TYPE string.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '保存至'
default_extension = 'xlsx'
default_file_name = gv_filename
file_filter = 'Excel Files (*.xlsx)' "'.xls'
CHANGING
filename = gv_filename
path = lv_path
fullpath = lv_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
pv_fullpath = lv_fullpath.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_upload_data .
DATA: lt_intern TYPE STANDARD TABLE OF alsmex_tabline,
ls_excel TYPE alsmex_tabline.
FIELD-SYMBOLS: <field> TYPE any.
REFRESH lt_intern.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = gv_begin_col
i_begin_row = gv_begin_row
i_end_col = gv_end_col
i_end_row = gv_end_row
TABLES
intern = lt_intern
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
LOOP AT lt_intern INTO ls_excel.
CONDENSE ls_excel-value.
ASSIGN COMPONENT ls_excel-col OF STRUCTURE gt_tab TO <field>.
<field> = ls_excel-value.
AT END OF row.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gt_tab-matnr
IMPORTING
output = gt_tab-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
gt_tab-verid = |{ gt_tab-verid ALPHA = IN }|.
IF gt_tab-plnnr IS INITIAL.
SELECT SINGLE plnnr INTO gt_tab-plnnr FROM mapl
WHERE matnr = gt_tab-matnr AND werks = gt_tab-werks
AND plnty = 'N' AND loekz = ''.
ENDIF.
APPEND gt_tab.
CLEAR gt_tab.
ENDAT.
ENDLOOP.
SORT gt_tab BY werks matnr.
IF gt_tab[] IS INITIAL.
MESSAGE '没有导入数据' TYPE 'W'.
STOP.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* FORM bdc_dynpro *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING pv_program pv_dynpro.
CLEAR gt_bdcdata.
gt_bdcdata-program = pv_program.
gt_bdcdata-dynpro = pv_dynpro.
gt_bdcdata-dynbegin = 'X'.
APPEND gt_bdcdata.
ENDFORM. "BDC_DYNPRO
*----------------------------------------------------------------------*
* FORM bdc_field *
*----------------------------------------------------------------------*
FORM bdc_field USING pv_fnam pv_fval.
CLEAR gt_bdcdata.
gt_bdcdata-fnam = pv_fnam.
gt_bdcdata-fval = pv_fval.
APPEND gt_bdcdata.
ENDFORM. "BDC_FIELD