*&---------------------------------------------------------------------* *& Report ZCOD001 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& 版本号 日期 作者 修改描述 ReqID *& V001 2016.9.29 刘容 成本组件分解 * 如果模板更新请到SMW0更新 ZCOD001.XLS模板 *&---------------------------------------------------------------------* REPORT zcod001. " 成本组件分解 TABLES: sscrfields. *&-------alv类型定义 DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE, gd_tab_group TYPE slis_t_sp_group_alv, gd_layout TYPE slis_layout_alv, gd_repid LIKE sy-repid. DATA: functxt TYPE smp_dyntxt. TYPES:BEGIN OF ty_upload_data, material TYPE mara-matnr, " 物料号 plant TYPE marc-werks, " 工厂 year(4) TYPE c, " 年度 period(3) TYPE c, " 记帐期间 val_type TYPE string, " 评估类型 kst001 TYPE string, kst002 TYPE string, kst003 TYPE string, kst004 TYPE string, kst005 TYPE string, kst006 TYPE string, kst007 TYPE string, kst008 TYPE string, kst009 TYPE string, kst010 TYPE string, *&-------------显示结果字段 type(1) TYPE c, "消息类型 message(60) TYPE c, "消息 light(4) TYPE c, "执行情况 zsel(1) TYPE c, END OF ty_upload_data. DATA:gt_upload_data TYPE STANDARD TABLE OF ty_upload_data, gw_upload_data TYPE ty_upload_data. FIELD-SYMBOLS : <fls_data> LIKE LINE OF gt_upload_data. DATA:l_flag TYPE c. " 标识 *&---------检查物料和工厂存在否 TYPES : BEGIN OF ty_marc, matnr TYPE marc-matnr, werks TYPE marc-werks, END OF ty_marc. DATA : gt_marc TYPE TABLE OF ty_marc. DATA : gs_marc LIKE LINE OF gt_marc. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002. PARAMETERS: p_file TYPE rlgrap-filename ."导入文件 SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN COMMENT 01(20) TEXT-h01. SELECTION-SCREEN: FUNCTION KEY 1. INITIALIZATION. functxt-icon_id = icon_export. functxt-quickinfo = '模版下载'(001). functxt-icon_text = '模版下载'(001). sscrfields-functxt_01 = functxt. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM frm_browser_file. AT SELECTION-SCREEN. *&--------------模板下载 IF sscrfields-ucomm = 'FC01'. PERFORM temp_excel_get USING 'ZCOD001.XLS'. ELSEIF sscrfields-ucomm = 'ONLI'. IF p_file IS NOT INITIAL. PERFORM frm_upload_data. *&------------检查数据 PERFORM frm_check_data. *&-------------alv展示批导钱的数据 PERFORM build_fieldcatalog. PERFORM build_layout. PERFORM display_alv_report. ENDIF. ENDIF. *&---------------------------------------------------------------------* *& Form FRM_BROWSER_FILE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_browser_file . DATA v_material LIKE rlgrap-filename. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING mask = ',*.* ,*.*.' mode = '0' title = '请选择要上传的信息文件' IMPORTING filename = v_material EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5. IF sy-subrc <> 0. ENDIF. p_file = v_material. ENDFORM. " FRM_BROWSER_FILE *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_upload_data . DATA: l_raw TYPE truxs_t_text_data. * 从EXCEL上传到内表 CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' EXPORTING * I_FIELD_SEPERATOR = i_line_header = 'X' i_tab_raw_data = l_raw i_filename = p_file TABLES i_tab_converted_data = gt_upload_data EXCEPTIONS conversion_failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'. STOP. ENDIF. "DELETE gt_upload_data INDEX 1. ENDFORM. " FRM_UPLOAD_DATA *&---------------------------------------------------------------------* *& Form FRM_BAPI *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_bapi . DATA:lt_ckml_t_change_ccs TYPE STANDARD TABLE OF ckml_s_change_ccs, lw_ckml_s_change_ccs TYPE ckml_s_change_ccs. DATA: it_ckmlpp TYPE cki_t_ckmlpp, it_ckmlcr TYPE cki_t_ckmlcr. * 数据检查 *获取上传数据,转换数据 LOOP AT gt_upload_data ASSIGNING <fls_data> WHERE type IS INITIAL. lw_ckml_s_change_ccs-material = <fls_data>-material. lw_ckml_s_change_ccs-plant = <fls_data>-plant. * lw_ckml_s_change_ccs-val_type = <fls_data>-val_type. lw_ckml_s_change_ccs-year = <fls_data>-year. lw_ckml_s_change_ccs-period = <fls_data>-period. lw_ckml_s_change_ccs-category = 'ZU'. lw_ckml_s_change_ccs-curr_type = '10'."<fls_data>-VAL_TYPE. lw_ckml_s_change_ccs-kst001 = <fls_data>-kst001. lw_ckml_s_change_ccs-kst002 = <fls_data>-kst002. lw_ckml_s_change_ccs-kst003 = <fls_data>-kst003. lw_ckml_s_change_ccs-kst004 = <fls_data>-kst004. lw_ckml_s_change_ccs-kst005 = <fls_data>-kst005. lw_ckml_s_change_ccs-kst006 = <fls_data>-kst006. lw_ckml_s_change_ccs-kst007 = <fls_data>-kst007. lw_ckml_s_change_ccs-kst008 = <fls_data>-kst008. lw_ckml_s_change_ccs-kst009 = <fls_data>-kst009. lw_ckml_s_change_ccs-kst010 = <fls_data>-kst010. APPEND lw_ckml_s_change_ccs TO lt_ckml_t_change_ccs. CLEAR lw_ckml_s_change_ccs. ENDLOOP. " 通过导入的物料编码、工厂字段查找表CKMLHD,取CKMLHD-KALNR;通过字段值KALNR, " 查找表MLCD,KALNR、BDATJ=会计年度、POPER=输入的会计期间、CATEG=‘ZU’、PTYP=‘B+‘, " 取MLCD-BVALT作为函数的PROC_ALT字段值 " 备选采购/过程 TYPES: BEGIN OF ty_mlcd, matnr TYPE ckmlhd-matnr, bwkey TYPE ckmlhd-bwkey, kalnr TYPE mlcd-kalnr, bdatj TYPE mlcd-bdatj, poper TYPE mlcd-poper, bvalt TYPE mlcd-bvalt, untper TYPE mlcd-untper, curtp TYPE mlcd-curtp, END OF ty_mlcd. DATA:lt_mlcd TYPE STANDARD TABLE OF ty_mlcd WITH HEADER LINE. IF lt_ckml_t_change_ccs IS NOT INITIAL. SELECT ckmlhd~matnr ckmlhd~bwkey mlcd~kalnr mlcd~bdatj mlcd~poper mlcd~bvalt mlcd~untper mlcd~curtp INTO CORRESPONDING FIELDS OF TABLE lt_mlcd FROM mlcd INNER JOIN ckmlhd ON mlcd~kalnr = ckmlhd~kalnr FOR ALL ENTRIES IN lt_ckml_t_change_ccs WHERE matnr = lt_ckml_t_change_ccs-material AND bwkey = lt_ckml_t_change_ccs-plant AND bdatj = lt_ckml_t_change_ccs-year AND poper = lt_ckml_t_change_ccs-period AND categ = 'ZU' AND ptyp = 'B+'. ENDIF. IF lt_mlcd[] IS NOT INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE it_ckmlpp FROM ckmlpp FOR ALL ENTRIES IN lt_mlcd WHERE kalnr = lt_mlcd-kalnr AND bdatj = lt_mlcd-bdatj AND poper = lt_mlcd-poper AND untper = lt_mlcd-untper. SELECT * INTO CORRESPONDING FIELDS OF TABLE it_ckmlcr FROM ckmlcr FOR ALL ENTRIES IN lt_mlcd WHERE kalnr = lt_mlcd-kalnr AND bdatj = lt_mlcd-bdatj AND poper = lt_mlcd-poper AND untper = lt_mlcd-untper AND curtp = lt_mlcd-curtp. ENDIF. LOOP AT lt_ckml_t_change_ccs INTO lw_ckml_s_change_ccs. READ TABLE lt_mlcd WITH KEY matnr = lw_ckml_s_change_ccs-material bwkey = lw_ckml_s_change_ccs-plant bdatj = lw_ckml_s_change_ccs-year poper = lw_ckml_s_change_ccs-period. IF sy-subrc = 0. lw_ckml_s_change_ccs-proc_alt = lt_mlcd-bvalt. " 备选采购/过程 MODIFY lt_ckml_t_change_ccs FROM lw_ckml_s_change_ccs. ENDIF. ENDLOOP. CALL METHOD cl_fins_acdoc_ml_util=>set_ckml_buffer EXPORTING it_ckmlpp = it_ckmlpp it_ckmlcr = it_ckmlcr. " 调用BAPI IF lt_ckml_t_change_ccs IS NOT INITIAL. CALL FUNCTION 'CKMMC_MANCHANG_AUTOMATED' EXPORTING it_ccs = lt_ckml_t_change_ccs * I_KONGR = * I_RUN_TYPE = * I_RUN_APPL = i_keart = 'H'. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 INTO <fls_data>-message. IF sy-subrc = 0 . <fls_data>-type = 'S'. COMMIT WORK AND WAIT. ELSE. <fls_data>-type = 'E'. ENDIF. CASE : <fls_data>-type. WHEN 'S'. <fls_data>-light = '@5B@'. WHEN 'W'. <fls_data>-light = '@5D@'. "黄灯 WHEN 'E'. <fls_data>-light = '@5C@'. ENDCASE. ENDIF. * IF sy-subrc = 0. * "WRITE : / '期初库存成本组件分解,导入成功'. * MESSAGE '期初库存成本组件分解,导入成功' TYPE 'S'. * ELSE. * "WRITE : / '期初库存成本组件分解,导入失败'. * MESSAGE '期初库存成本组件分解,导入成功' TYPE 'S'. * ENDIF. ENDFORM. " FRM_BAPI FORM temp_excel_get USING p_objid TYPE wwwdata-objid. DATA: l_objdata LIKE wwwdatatab, l_destination LIKE rlgrap-filename, l_rc LIKE sy-subrc, l_errtxt TYPE string. DATA: l_fullpath TYPE string, l_extension TYPE string, l_fname LIKE rlgrap-filename, l_formkey LIKE wwwdatatab. l_extension = p_objid. PERFORM get_file_name USING '.xls' 'Excel|*.xls;' CHANGING l_fullpath. IF l_fullpath = space. MESSAGE '请选择下载文件名' TYPE 'E'. ELSE. CONCATENATE l_fullpath '' INTO l_fname. SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF l_objdata WHERE relid = 'MI' AND objid = p_objid . IF sy-subrc NE 0 OR l_objdata-objid = space. MESSAGE e001(00) WITH '文件不存在!'. ELSE. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING key = l_objdata destination = l_fname IMPORTING rc = l_rc CHANGING temp = l_fname. IF l_rc NE 0. MESSAGE e001(00) WITH '文件下载失败!'. ENDIF. ENDIF. ENDIF. ENDFORM. FORM get_file_name USING p_extension p_file_filter CHANGING p_fullpath. DATA: l_filename TYPE string, l_path TYPE string, l_fullpath TYPE string, l_titile TYPE string, l_init_dir TYPE string. CLEAR p_fullpath. l_titile = TEXT-t04. l_init_dir = TEXT-t03. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = l_titile default_extension = '.xls' initial_directory = l_init_dir prompt_on_overwrite = 'X' file_filter = p_file_filter CHANGING filename = l_filename path = l_path fullpath = l_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. p_fullpath = l_fullpath. ENDFORM. *&---------------------------------------------------------------------* *& Form BUILD_FIELDCATALOG *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM build_fieldcatalog . CLEAR: fieldcatalog. DEFINE build_fieldcat. fieldcatalog-fieldname = &1. fieldcatalog-seltext_m = &2. fieldcatalog-outputlen = &3. IF fieldcatalog-fieldname = 'LIGHT'. fieldcatalog-key = 'X'. ENDIF. IF fieldcatalog-fieldname = 'MATERIAL'. fieldcatalog-no_zero = 'X'. ENDIF. APPEND fieldcatalog TO fieldcatalog. CLEAR fieldcatalog. END-OF-DEFINITION. build_fieldcat 'LIGHT' '结果信息灯' 10. build_fieldcat 'MESSAGE' '消息' 25. build_fieldcat 'MATERIAL' '物料号' 12. build_fieldcat 'PLANT ' '工厂' 4. build_fieldcat 'YEAR ' '年度' 4. build_fieldcat 'PERIOD ' '记帐期间' 8. build_fieldcat 'VAL_TYPE' '评估类型' 8. build_fieldcat 'KST001' '原料-变式' 12. build_fieldcat 'KST002' '包材-变式' 12. build_fieldcat 'KST003' '成本字段3' 12. build_fieldcat 'KST004' '人工-变式' 12. build_fieldcat 'KST005' '成本字段5' 12. build_fieldcat 'KST006' '机器-变式' 12. build_fieldcat 'KST007' '成本字段7' 12. build_fieldcat 'KST008' '制造费用-变式' 14. build_fieldcat 'KST009' '成本字段9' 12. build_fieldcat 'KST010' '成本字段10' 12. build_fieldcat 'TYPE' '结果' 4. ENDFORM. *&---------------------------------------------------------------------* *& Form BUILD_LAYOUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM build_layout . gd_layout-zebra = 'X'. gd_layout-box_fieldname = 'ZSEL'. ENDFORM. *&---------------------------------------------------------------------* *& Form DISPLAY_ALV_REPORT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM display_alv_report . gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = gd_repid is_layout = gd_layout it_fieldcat = fieldcatalog[] "输出的列信息 i_save = 'A' "变式可保存 i_callback_pf_status_set = 'FRM_SET_STATUS' "状态栏 i_callback_user_command = 'FRM_USER_COMMAND' "按钮处理 TABLES t_outtab = gt_upload_data "输出内容内表 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. FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. DATA: l_grid TYPE REF TO cl_gui_alv_grid, l_subrc TYPE sy-subrc. * 取得当前alv的grid CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = l_grid. CALL METHOD l_grid->check_changed_data. rs_selfield-refresh = 'X'. CASE r_ucomm. WHEN 'SAVE'. PERFORM frm_bapi. WHEN OTHERS. ENDCASE. rs_selfield-refresh = 'X'. rs_selfield-col_stable = 'X'. rs_selfield-row_stable = 'X'. ENDFORM. "user_command FORM frm_set_status USING pt_extab TYPE slis_t_extab . SET PF-STATUS 'STANDARD'. ENDFORM. "Frm_SET_STATUS *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_check_data . CLEAR : gt_marc. IF gt_upload_data IS INITIAL. MESSAGE '清单无数据' TYPE 'E'. ENDIF. LOOP AT gt_upload_data ASSIGNING <fls_data>. *&----------物料加前导零 CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING input = <fls_data>-material IMPORTING output = <fls_data>-material EXCEPTIONS length_error = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. SELECT matnr werks INTO TABLE gt_marc FROM marc FOR ALL ENTRIES IN gt_upload_data WHERE matnr = gt_upload_data-material AND werks = gt_upload_data-plant . SORT gt_marc BY matnr werks. READ TABLE gt_marc WITH KEY matnr = <fls_data>-material werks = <fls_data>-plant TRANSPORTING NO FIELDS BINARY SEARCH. IF sy-subrc <> 0. <fls_data>-light = '@5C@'. <fls_data>-type = 'E'. CONCATENATE '物料' <fls_data>-material '在工厂' <fls_data>-plant '下不存在' INTO <fls_data>-message. ENDIF. ENDLOOP. ENDFORM.
^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
浙公网安备 33010602011771号