********************************************************************
* 事务代码: *
* 程序名称: *
* 程序目的: *
* 设 计 人: *
* 开 发 人: *
* 设计时间:2022-09-26 *
* 程序类型: ABAP/4 程序 ,批导程序 *
* 应用类型: FI *
* 描 述: *
*(修改日志)--------------------------------------------------------*
* *
* 日志号 修改人 修改时间 修改说明 传输号码 *
* ---- ---- ------ -----------
********************************************************************REPORT zfib002.*----------------------------------------------------------------------*
* 数据库表声明/Database Table Declaration
*----------------------------------------------------------------------*
TABLES: sscrfields. " 选择屏幕上的字段*&---------------------------------------------------------------------*
*& ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
*&---ALV数据组,类型池
TYPE-POOLS:slis,vrm.*----------------------------------------------------------------------*
* 结构声明类型/Structure Type Declaration
*----------------------------------------------------------------------*
*&--- 全局结构体与内表声明
*&---Excel导入数据
TYPES:BEGIN OF ty_excel,light TYPE c LENGTH 4, " 信号灯msg TYPE string , " 导入结果" 项目vbukr TYPE proj-vbukr , " 项目的公司代码werks TYPE proj-werks , " 工厂pspnr TYPE proj-pspid , " 项目定义post1 TYPE proj-post1 , " 项目描述profl TYPE proj-profl , " 项目参数文件plfaz TYPE proj-plfaz , " 项目计划开始日期plsez TYPE proj-plsez , " 项目计划完成日期" WBS元素level TYPE c LENGTH 1 , " 层级posid1 TYPE prps-posid , " 一层WBSposid2 TYPE prps-posid , " 二层WBSposid3 TYPE prps-posid , " 三层WBSprart TYPE prps-prart , " WBS类型post2 TYPE prps-post1 , " WBS描述poski TYPE prps-poski , " 短标识END OF ty_excel.*----------------------------------------------------------------------*
* CONSTANTS/(全局)常量 *
*----------------------------------------------------------------------**----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
*&---全局内表定义
DATA:gt_excel TYPE STANDARD TABLE OF ty_excel. " Excel导入表*&---全局结构定义
DATA:gs_excel TYPE ty_excel. " Excel导入结构*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS: TYPE ty_excel.*&---------------------------------------------------------------------*
*& ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
*&---ALV数据组,类型池
TYPE-POOLS:slis,vrm.DATA:gt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat, " ALV 控制: 字段目录gs_fieldcat TYPE lvc_s_fcat, " ALV 控制: 字段目录gs_layout TYPE lvc_s_layo. " ALV 控制: 布局结构
DATA:gs_functxt TYPE smp_dyntxt .*----------------------------------------------------------------------*
* Excel 导入所需传入与接收参数定义 *
*----------------------------------------------------------------------*
DATA: gv_filepath TYPE string. " 保存文件路径FIELD-SYMBOLS: LIKE alsmex_tabline. " Excel 单元格
FIELD-SYMBOLS: TYPE any.DATA: gv_lines LIKE sy-index VALUE 2. " Excel 数据的行数
DATA: gv_index LIKE sy-index VALUE 1. " Message 表的序号
DATA: gv_sign TYPE c. " Excel 一行是否写入成功的标志
DATA: gv_succ LIKE sy-index. " 成功更新条数
DATA: gv_fail TYPE i VALUE 0. " 失败的行数
DATA: gv_flag TYPE char1. " 标记
DATA: gt_xlstmp TYPE alsmex_tabline OCCURS 0. " 保存 Excel 中读取的记录
DATA: gs_xlstmp TYPE alsmex_tabline. " 保存 Excel 中读取的记录*&---------------------------------------------------------------------*
*& Macro 宏定义
*&---------------------------------------------------------------------*
DEFINE mcr_set_catalog.gs_fieldcat-fieldname = &1. " 字段技术名称gs_fieldcat-coltext = &2. " 显示名称gs_fieldcat-ref_table = &3. " 参照表gs_fieldcat-ref_field = &4. " 参照表字段gs_fieldcat-qfieldname = &5. " 参考计量单位的字段名称gs_fieldcat-key = &6. " key 值gs_fieldcat-edit = &7. " 可编辑APPEND gs_fieldcat TO gt_fieldcat.CLEAR gs_fieldcat.
END-OF-DEFINITION.*&---------------------------------------------------------------------*
*& SELECTION SCREEN/选择屏幕 *
*&---------------------------------------------------------------------*
*&--- 选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK block0 WITH FRAME TITLE TEXT-101. " 上传文件SELECTION-SCREEN: FUNCTION KEY 1. "菜单栏下载模板PARAMETERS: p_fname LIKE rlgrap-filename. " 输入文件路径SELECTION-SCREEN END OF BLOCK block0.*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化 *
*&---------------------------------------------------------------------*
INITIALIZATION.
*&---设置选择屏幕菜单栏按钮--下载模板gs_functxt = VALUE #(icon_id = icon_exportquickinfo = TEXT-001 " 下载模板icon_text = TEXT-001 " 下载模板).sscrfields-functxt_01 = gs_functxt.*&---------------------------------------------------------------------*
*& at selection-screen/选择屏幕开始 *
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.CASE sy-ucomm.WHEN 'FC01'. " 下载模板PERFORM frm_download_template.WHEN OTHERS.ENDCASE.*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN ON VALUE-REQUEST/F4 Search Help *
*&---------------------------------------------------------------------*
*&--- 上传文件 F4 路径帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.CALL FUNCTION 'F4_FILENAME'EXPORTINGprogram_name = sy-cprogdynpro_number = sy-dynnrIMPORTINGfile_name = p_fname.CLEAR gv_filepath.gv_filepath = p_fname." 判断是否为 XLS文件SEARCH gv_filepath FOR '.xls'.IF sy-subrc <> 0.MESSAGE s006(zfico01) DISPLAY LIKE 'E'. " 上传文件类型错误,请选择XLS文件STOP.ENDIF.*&---------------------------------------------------------------------*
*& START-OF-SELECTION/开始选择屏幕 *
*&---------------------------------------------------------------------*
START-OF-SELECTION.PERFORM frm_check_excel. " Excel 是否上传校验*&---------------------------------------------------------------------*
*& END-OF-SELECTION/结束选择屏幕(程序结束处理,输出等) *
*&---------------------------------------------------------------------*
END-OF-SELECTION.IF gt_excel IS NOT INITIAL.PERFORM frm_display_data. " ALV 数据展示ELSE.MESSAGE s007(zfico01) DISPLAY LIKE 'E'. " 导入文件为空,请检查ENDIF.*&---------------------------------------------------------------------*
*& Form FRM_CHECK_EXCEL
*&---------------------------------------------------------------------*
*& Excel 是否上传校验
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_excel .DATA lv_flag(1).IF p_fname IS INITIAL.MESSAGE s008(zfico01) DISPLAY LIKE 'E'. " 文件路径不能为空LEAVE LIST-PROCESSING.ENDIF.PERFORM frm_read_excel. " 读取 Excel 文件数据
* PERFORM frm_read_excel_new. " 读取 Excel 文件数据
ENDFORM. " FRM_CHECK_EXCEL*&---------------------------------------------------------------------*
*& Form FRM_READ_EXCEL
*&---------------------------------------------------------------------*
*& 读取 Excel 文件数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_read_excel .DATA lv_value(255) TYPE c.DATA lv_flag TYPE char1.DATA lv_count LIKE sy-subrc.DATA lv_message TYPE string.REFRESH gt_xlstmp." 读取 EXCEL 文件数据CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'EXPORTINGfilename = p_fnamei_begin_col = 1i_begin_row = 2 " 从第 4 行开始 读取i_end_col = 14 " 结束列i_end_row = 65536 " 结束行TABLESintern = gt_xlstmp " 存储读取的记录 行、列、值EXCEPTIONSinconsistent_parameters = 1upload_ole = 2OTHERS = 3.IF sy-subrc <> 0 .MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE sy-msgtyWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.STOP.ENDIF.*&--- 将读取到的记录存储到 gt_excel 内表中CLEAR gt_excel.SORT gt_xlstmp BY row col ." 循环赋值LOOP AT gt_xlstmp ASSIGNING .ASSIGN COMPONENT -col OF STRUCTURE TO .lv_value = -value .CONDENSE lv_value.CASE -col. " 判断当前列,并赋值到对应技术字段WHEN 1.gs_excel-vbukr = lv_value. " 项目公司代码WHEN 2.gs_excel-werks = lv_value. " 工厂WHEN 3.gs_excel-pspnr = lv_value. " 项目定义WHEN 4.gs_excel-post1 = lv_value. " 短描述WHEN 5.gs_excel-profl = lv_value. " 项目参数文件WHEN 6.CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'EXPORTINGdate_external = lv_value "当前用户日期格式:YYYY.MM.DDIMPORTINGdate_internal = lv_value.gs_excel-plfaz = lv_value. " 项目计划开始日期WHEN 7.CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'EXPORTINGdate_external = lv_value "当前用户日期格式:YYYY.MM.DDIMPORTINGdate_internal = lv_value.gs_excel-plsez = lv_value. " 项目计划结束日期WHEN 8.gs_excel-level = lv_value. " 层级WHEN 9.gs_excel-posid1 = lv_value. " 一层WBSWHEN 10.gs_excel-posid2 = lv_value. " 二层WBSWHEN 11.gs_excel-posid3 = lv_value. " 三层WBSWHEN 12.gs_excel-prart = lv_value. " WBS类型WHEN 13.gs_excel-post2 = lv_value. " WBS描述WHEN 14.gs_excel-poski = lv_value. " 短标识ENDCASE.AT END OF row.gs_excel-light = icon_light_out. " 熄灯APPEND gs_excel TO gt_excel.CLEAR gs_excel.ENDAT.ENDLOOP.SORT gt_excel BY pspnr.ENDFORM. " FRM_READ_EXCEL*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& ALV 展示数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_data .PERFORM frm_build_fieldcat. " 配置 ALV 字段目录PERFORM frm_build_layout. " 构建 ALV 布局样式*&--- 调用 ALV 展示数据CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program = sy-repidi_callback_pf_status_set = 'FRM_PF_STATUS'i_callback_user_command = 'FRM_USER_COMMAND'is_layout_lvc = gs_layoutit_fieldcat_lvc = gt_fieldcati_save = 'A' " 标准保存模式TABLESt_outtab = gt_excel " 内表数据EXCEPTIONSprogram_error = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE sy-msgtyWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.ENDFORM. " FRM_DISPLAY_DATA*&---------------------------------------------------------------------*
*& Form FRM_PF_STATUS
*&---------------------------------------------------------------------*
*& ALV 工具栏状态
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_pf_status USING ps_extab TYPE slis_t_extab.SET PF-STATUS 'STATUS_1000'.
ENDFORM. " FRM_PF_STATUS*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
* 菜单栏事件
*----------------------------------------------------------------------*
* --> pv_ucomm 触发的功能码
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm "user_commandpv_selfield TYPE slis_selfield.DATA: lr_grid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lr_grid.CALL METHOD lr_grid->check_changed_data. "将更新后的数据传到alv所对应的内表pv_selfield-refresh = 'X'. "刷新数据CASE pv_ucomm.WHEN 'IMPORT'.PERFORM frm_value_check.PERFORM frm_import.ENDCASE.ENDFORM. " FRM_USER_COMMAND*&---------------------------------------------------------------------*
*& Form frm_import
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_import .DATA: lt_head TYPE STANDARD TABLE OF ty_excel." 筛选项目lt_head = gt_excel.SORT lt_head BY pspnr.DELETE ADJACENT DUPLICATES FROM lt_head COMPARING pspnr.SELECTpspidFROM projFOR ALL ENTRIES IN @gt_excelWHEREpspid = @gt_excel-pspnrINTO TABLE @DATA(lt_proj).SORT lt_proj BY pspid." 项目导入LOOP AT lt_head INTO gs_excel WHERE light = icon_light_out. " 导入熄灯项目READ TABLE lt_proj TRANSPORTING NO FIELDS WITH KEY gs_excel-pspnr BINARY SEARCH.IF sy-subrc = 0. " 项目已创建gs_excel-light = icon_yellow_light. " 黄灯gs_excel-msg = TEXT-m01. " 项目已创建;MODIFY gt_excel FROM gs_excel TRANSPORTING light msg WHERE pspnr = gs_excel-pspnr.ELSE. " 项目未创建PERFORM frm_porj_create.MODIFY gt_excel FROM gs_excel TRANSPORTING light msg WHERE pspnr = gs_excel-pspnr.CLEAR gs_excel.ENDIF.ENDLOOP." WBS导入PERFORM frm_wbs_create." 检查是否有导入失败行项目SORT gt_excel BY light.READ TABLE gt_excel TRANSPORTING NO FIELDS WITH KEY light = icon_red_light.IF sy-subrc = 0.MESSAGE s012(zfico01) DISPLAY LIKE 'E'. " 存在导入失败的行项目,请检查数据ENDIF.SORT gt_excel BY pspnr level light.ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_download_template .DATA: lv_filename TYPE string,lv_fullpath TYPE string,lv_path TYPE string,lv_objid TYPE wwwdatatab-objid,ls_objdata TYPE wwwdatatab,lv_destination TYPE rlgrap-filename,lv_rc TYPE i.lv_objid = 'ZFIB008'.lv_filename = TEXT-002 && '.xls'. " 项目&WBS元素批导模板SELECT SINGLE relid objid INTO CORRESPONDING FIELDS OF ls_objdataFROM wwwdataWHERE srtf2 = 0 AND relid = 'MI' AND objid = lv_objid.IF sy-subrc <> 0.MESSAGE e009(zfico01). " 模板不存在,请联系管理员导入ENDIF.CALL METHOD cl_gui_frontend_services=>file_save_dialogEXPORTINGdefault_extension = 'XLS'default_file_name = lv_filenamefile_filter = 'EXCEL'CHANGINGfilename = lv_filenamepath = lv_pathfullpath = lv_fullpathEXCEPTIONSOTHERS = 1.IF lv_fullpath = ''.MESSAGE e010(zfico01). " 没有选择文件ENDIF.IF strlen( lv_fullpath ) > 128.MESSAGE s011(zfico01) DISPLAY LIKE 'E'. " 文件名长度超过128位,请重新选择文件STOP.ENDIF.lv_destination = lv_fullpath.CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'EXPORTINGkey = ls_objdatadestination = lv_destinationIMPORTINGrc = lv_rc.IF lv_rc <> 0.MESSAGE e007(zfico01). " 导入文件为空,请检查ENDIF.
ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& 配置 ALV 字段目录
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat .mcr_set_catalog: 'LIGHT' TEXT-a01 '' 'LIGHT' '' 'X' '', " 信号灯'MSG' TEXT-a02 '' 'MSG' '' 'X' '', " 导入结果'VBUKR' TEXT-a03 'PROJ' 'VBUKR' '' '' '', " 项目的公司代码'WERKS' TEXT-a04 'PROJ' 'WERKS' '' '' '', " 工厂'PSPNR' TEXT-a05 'PROJ' 'PSPID' '' '' '', " 项目定义'POST1' TEXT-a06 'PROJ' 'POST1' '' '' '', " 项目描述'PROFL' TEXT-a07 'PROJ' 'PROFL' '' '' '', " 项目参数文件'PLFAZ' TEXT-a08 'PROJ' 'PLFAZ' '' '' '', " 项目计划开始日期'PLSEZ' TEXT-a09 'PROJ' 'PLSEZ' '' '' '', " 项目计划完成日期'LEVEL' TEXT-a15 '' '' '' '' '', " 层级'POSID1' TEXT-a19 'PRPS' 'POSID' '' '' '', " 一层WBS'POSID2' TEXT-a10 'PRPS' 'POSID' '' '' '', " 二层WBS'POSID3' TEXT-a11 'PRPS' 'POSID' '' '' '', " 三层WBS'PRART' TEXT-a12 'PRPS' 'PRART' '' '' '', " WBS类型'POST2' TEXT-a13 'PRPS' 'POST1' '' '' '', " WBS描述'POSKI' TEXT-a14 'PRPS' 'POSKI' '' '' ''. " 短标识ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUILD_LAYOUT
*&---------------------------------------------------------------------*
*& 构建 ALV 样式布局
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_build_layout .CLEAR: gs_layout.gs_layout = VALUE #( zebra = 'X' " ALV 控制: 可选行颜色 (带) - 斑马条纹 - 美观cwidth_opt = 'X' " 自动调整ALVL列宽no_toolbar = 'X' ). " ALV 控制: 隐藏工具栏
ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_PORJ_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_porj_create .DATA:lv_seqno(6) TYPE n VALUE '000000',lt_message TYPE TABLE OF bapi_meth_message,ls_message TYPE bapi_meth_message,ls_return TYPE bapireturn1,lt_method_project TYPE TABLE OF bapi_method_project,ls_method_project TYPE bapi_method_project,ls_project_definition LIKE bapi_project_definition,ls_project_definition_upd LIKE bapi_project_definition_up."项目定义ls_project_definition-project_definition = gs_excel-pspnr. "项目定义ls_project_definition-description = gs_excel-post1. "描述ls_project_definition-project_profile = gs_excel-profl. "项目参数文件ls_project_definition-comp_code = gs_excel-vbukr. "项目的公司代码ls_project_definition-plant = gs_excel-werks. "工厂ls_project_definition-start = gs_excel-plfaz. "项目计划开始日期ls_project_definition-finish = gs_excel-plsez. "项目计划完成日期"项目定义(更新字段)ls_project_definition_upd-project_definition = 'X'. "项目定义ls_project_definition_upd-description = 'X'. "描述ls_project_definition_upd-project_profile = 'X'. "项目参数文件ls_project_definition_upd-comp_code = 'X'. "项目的公司代码ls_project_definition_upd-plant = 'X'. "工厂ls_project_definition_upd-start = 'X'. "项目计划开始日期ls_project_definition_upd-finish = 'X'. "项目计划完成日期"项目处理方法创建lv_seqno = lv_seqno + 1.ls_method_project-refnumber = lv_seqno. "参考号ls_method_project-objecttype = co1_type-project_definition. "对象类型ls_method_project-method = co1_meth-create. "项目创建ls_method_project-objectkey = gs_excel-pspnr. "项目定义APPEND ls_method_project TO lt_method_project.CLEAR ls_method_project."项目处理方法保存ls_method_project-method = co1_meth-save.APPEND ls_method_project TO lt_method_project.CLEAR: ls_method_project.* SET UPDATE TASK LOCAL. "同步执行项目创建CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'EXPORTINGi_project_definition = ls_project_definitioni_project_definition_upd = ls_project_definition_updIMPORTINGreturn = ls_returnTABLESi_method_project = lt_method_projecte_message_table = lt_message."回写至ALV每行导入结果IF ls_return-type EQ 'E' OR ls_return EQ 'A'. " 项目创建失败CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'." 更新消息LOOP AT lt_message INTO ls_message.gs_excel-msg = gs_excel-msg && ls_message-message_text && ';'.ENDLOOP.gs_excel-light = icon_red_light. " 红灯ELSE.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGwait = 'X'." 更新日志信息gs_excel-msg = TEXT-m02. " 项目创建成功;gs_excel-light = icon_green_light. " 绿灯ENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_WBS_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_wbs_create .DATA: lv_tabix TYPE i,lt_head TYPE STANDARD TABLE OF ty_excel.DATA:lv_project TYPE bapi_bus2001_new-project_definition,lt_wbs_import TYPE STANDARD TABLE OF bapi_bus2054_new,ls_wbs_import LIKE LINE OF lt_wbs_import,lt_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_detail,ls_wbs_element LIKE LINE OF lt_wbs_element,lt_return TYPE STANDARD TABLE OF bapiret2,ls_return LIKE LINE OF lt_return.DATA:lv_seqno(6) TYPE n VALUE '000000',lt_message TYPE TABLE OF bapi_meth_message,ls_message TYPE bapi_meth_message,ls_return1 TYPE bapireturn1,lt_method_project TYPE TABLE OF bapi_method_project,ls_method_project TYPE bapi_method_project,ls_project_definition LIKE bapi_project_definition,ls_project_definition_upd LIKE bapi_project_definition_up,lt_wbs_update TYPE STANDARD TABLE OF BAPI_WBS_ELEMENT,lt_wbs_updatex TYPE STANDARD TABLE OF BAPI_WBS_ELEMENT_UPDATE,ls_wbs_update LIKE BAPI_WBS_ELEMENT,ls_wbs_updatex LIKE BAPI_WBS_ELEMENT_UPDATE." 筛选项目lt_head = gt_excel.SORT lt_head BY pspnr level light.DELETE ADJACENT DUPLICATES FROM lt_head COMPARING pspnr level.DELETE lt_head WHERE light = icon_red_light.SORT gt_excel BY pspnr level posid3.LOOP AT lt_head INTO DATA(ls_head).CLEAR:lv_project,lt_wbs_element,lt_return." 项目号lv_project = ls_head-pspnr." 获取项目WBS信息CALL FUNCTION 'BAPI_BUS2054_GETDATA'EXPORTINGi_project_definition = lv_projectTABLESet_wbs_element = lt_wbs_elementet_return = lt_return." 按项目号,层级,依次创建WBS元素READ TABLE gt_excel TRANSPORTING NO FIELDS WITH KEY pspnr = ls_head-pspnr level = ls_head-level BINARY SEARCH.IF sy-subrc = 0.lv_tabix = sy-tabix." 按层级汇总WBS元素CLEAR: lt_wbs_import,lt_method_project,lt_wbs_update,lt_wbs_updatex.LOOP AT gt_excel INTO gs_excel FROM lv_tabix.IF gs_excel-pspnr <> ls_head-pspnr OR gs_excel-level <> ls_head-level.EXIT.ENDIF.CLEAR ls_wbs_element.IF gs_excel-level = '1'. " 第一层ls_wbs_import-wbs_element = gs_excel-posid1. " WBS元素ELSEIF gs_excel-level = '2'. " 第二层ls_wbs_import-wbs_up = gs_excel-posid1. " 上层元素ls_wbs_import-wbs_element = gs_excel-posid1 && '/' && gs_excel-posid2. " WBS元素ELSEIF gs_excel-level = '3'. " 第三层ls_wbs_import-wbs_up = gs_excel-posid1 && '/' && gs_excel-posid2. " 上层元素ls_wbs_import-wbs_element = gs_excel-posid1 && '/' && gs_excel-posid2 && '/' && gs_excel-posid3. " WBS元素ENDIF.ls_wbs_import-description = gs_excel-post2. " WBS描述ls_wbs_import-PROJ_TYPE = gs_excel-prart. " WBS类型APPEND ls_wbs_import TO lt_wbs_import." WBS创建后修改简明ID(WBS元素)ls_project_definition-project_definition = gs_excel-pspnr. "项目定义ls_project_definition_upd-project_definition = 'X'. "项目定义"项目处理方法更新lv_seqno = lv_seqno + 1.ls_method_project-refnumber = lv_seqno. "参考号ls_method_project-objecttype = co1_type-wbs_element. "对象类型ls_method_project-method = co1_meth-update. "项目更新ls_method_project-objectkey = gs_excel-pspnr. "项目定义APPEND ls_method_project TO lt_method_project.CLEAR ls_method_project."项目处理方法保存ls_method_project-method = co1_meth-save.APPEND ls_method_project TO lt_method_project.CLEAR: ls_method_project.ls_wbs_update-wbs_element = ls_wbs_import-wbs_element.ls_wbs_update-project_definition = gs_excel-pspnr.ls_wbs_update-short_id = gs_excel-poski.APPEND ls_wbs_update TO lt_wbs_update.ls_wbs_updatex-short_id = 'X'.APPEND ls_wbs_updatex TO lt_wbs_updatex.ENDLOOP." 初始化CHECK lt_wbs_import IS NOT INITIAL.REFRESH lt_return.CALL FUNCTION 'BAPI_PS_INITIALIZATION'." 创建WBSCALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'EXPORTINGi_project_definition = lv_projectTABLESit_wbs_element = lt_wbs_importet_return = lt_return.SORT lt_return BY type message_v1 message_v2.READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E' BINARY SEARCH.IF sy-subrc <> 0.CLEAR:lt_return." 提交\SET UPDATE TASK LOCAL. "同步执行WBS创建CALL FUNCTION 'BAPI_PS_PRECOMMIT'TABLESet_return = lt_return.READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E' BINARY SEARCH.IF sy-subrc <> 0.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'." 更新日志信息gs_excel-msg = gs_excel-msg && TEXT-m03. " WBS创建成功gs_excel-light = icon_green_light.MODIFY gt_excel FROM gs_excel TRANSPORTING msg light WHERE pspnr = ls_head-pspnr AND level = ls_head-level.* " 更新简明ID(WBS元素)
* SET UPDATE TASK LOCAL. "同步执行WBS创建
* CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
* EXPORTING
* i_project_definition = ls_project_definition
* i_project_definition_upd = ls_project_definition_upd
* IMPORTING
* return = ls_return1
* TABLES
* i_method_project = lt_method_project
* e_message_table = lt_message
* I_WBS_ELEMENT_TABLE = lt_wbs_update
* I_WBS_ELEMENT_TABLE_UPDATE = lt_wbs_updatex.
* IF ls_return1-type <> 'E'.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
* ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* ENDIF.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'." 更新日志信息gs_excel-msg = gs_excel-msg && TEXT-m04. " WBS创建失败gs_excel-light = icon_red_light.LOOP AT lt_return INTO ls_return WHERE type = 'E'.gs_excel-msg = gs_excel-msg && ls_return-message.ENDLOOP.MODIFY gt_excel FROM gs_excel TRANSPORTING msg light WHERE pspnr = ls_head-pspnr AND level = ls_head-level.ENDIF.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'." 更新日志信息gs_excel-msg = gs_excel-msg && TEXT-m04. " WBS创建失败gs_excel-light = icon_red_light.LOOP AT lt_return INTO ls_return WHERE type = 'E'.gs_excel-msg = gs_excel-msg && ls_return-message.ENDLOOP.MODIFY gt_excel FROM gs_excel TRANSPORTING msg light WHERE pspnr = ls_head-pspnr AND level = ls_head-level.ENDIF.ENDIF.ENDLOOP." 筛选项目lt_head = gt_excel.SORT lt_head BY pspnr level light.DELETE lt_head WHERE light = icon_red_light.DELETE ADJACENT DUPLICATES FROM lt_head COMPARING pspnr level.SORT gt_excel BY pspnr level posid3.LOOP AT lt_head INTO ls_head.CLEAR:lv_project,lt_wbs_element,lt_return." 按项目号,层级,依次更新wbs元素短标识READ TABLE gt_excel TRANSPORTING NO FIELDS WITH KEY pspnr = ls_head-pspnr level = ls_head-level BINARY SEARCH.IF sy-subrc = 0.lv_tabix = sy-tabix." 按层级汇总WBS元素CLEAR: lt_wbs_import,lt_method_project,lt_wbs_update,lt_wbs_updatex.lv_seqno = '000000'.LOOP AT gt_excel INTO gs_excel FROM lv_tabix.IF gs_excel-pspnr <> ls_head-pspnr OR gs_excel-level <> ls_head-level.EXIT.ENDIF.IF gs_excel-light = icon_red_light.CONTINUE.ENDIF.CLEAR ls_wbs_element.IF gs_excel-level = '1'. " 第一层ls_wbs_import-wbs_element = gs_excel-posid1. " WBS元素ELSEIF gs_excel-level = '2'. " 第二层ls_wbs_import-wbs_element = gs_excel-posid1 && '/' && gs_excel-posid2. " WBS元素ELSEIF gs_excel-level = '3'. " 第三层ls_wbs_import-wbs_element = gs_excel-posid1 && '/' && gs_excel-posid2 && '/' && gs_excel-posid3. " WBS元素ENDIF." WBS创建后修改简明ID(WBS元素)ls_project_definition-project_definition = gs_excel-pspnr. "项目定义ls_project_definition_upd-project_definition = 'X'. "项目定义"项目处理方法更新lv_seqno = lv_seqno + 1.ls_method_project-refnumber = lv_seqno. "参考号ls_method_project-objecttype = co1_type-wbs_element. "对象类型ls_method_project-method = co1_meth-update. "项目更新ls_method_project-objectkey = ls_wbs_import-wbs_element. "项目定义APPEND ls_method_project TO lt_method_project.CLEAR ls_method_project.ls_wbs_update-wbs_element = ls_wbs_import-wbs_element.ls_wbs_update-project_definition = gs_excel-pspnr.ls_wbs_update-short_id = gs_excel-poski.APPEND ls_wbs_update TO lt_wbs_update.ls_wbs_updatex-short_id = 'X'.APPEND ls_wbs_updatex TO lt_wbs_updatex.ENDLOOP."项目处理方法保存ls_method_project-method = co1_meth-save.APPEND ls_method_project TO lt_method_project.CLEAR: ls_method_project." 初始化CHECK lt_wbs_update IS NOT INITIAL.REFRESH lt_return." 更新简明ID(WBS元素)\CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'EXPORTINGi_project_definition = ls_project_definitioni_project_definition_upd = ls_project_definition_updIMPORTINGreturn = ls_return1TABLESi_method_project = lt_method_projecte_message_table = lt_messageI_WBS_ELEMENT_TABLE = lt_wbs_updateI_WBS_ELEMENT_TABLE_UPDATE = lt_wbs_updatex.IF ls_return1-type <> 'E'.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.ENDIF.ENDIF.ENDLOOP.ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_VALUE_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_value_check .SORT gt_excel BY pspnr level.LOOP AT gt_excel ASSIGNING .IF -level = '1'.IF -posid1 IS INITIAL OR-posid2 IS NOT INITIAL OR-posid3 IS NOT INITIAL.-light = icon_red_light.-msg = TEXT-m06. " 请检查层级与WBS元素层级关系是否一致ENDIF.ELSEIF -level = '2'.IF -posid1 IS INITIAL OR-posid2 IS INITIAL OR-posid3 IS NOT INITIAL.-light = icon_red_light.-msg = TEXT-m06. " 请检查层级与WBS元素层级关系是否一致ENDIF.ELSEIF -level = '3'.IF -posid1 IS INITIAL OR-posid2 IS INITIAL OR-posid3 IS INITIAL.-light = icon_red_light.-msg = TEXT-m06. " 请检查层级与WBS元素层级关系是否一致ENDIF.ELSE.-light = icon_red_light.-msg = TEXT-m05. " 层级只能为1,2,3其中一种ENDIF.ENDLOOP.ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_READ_EXCEL_NEW
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_read_excel_new .DATA lv_value(255) TYPE c.DATA lv_flag TYPE char1.DATA lv_count LIKE sy-subrc.DATA lv_message TYPE string.DATA lv_index TYPE i.FIELD-SYMBOLS: .REFRESH gt_xlstmp." 读取 EXCEL 文件数据CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'EXPORTINGfilename = p_fnamei_begin_col = 1i_begin_row = 2 " 从第 4 行开始 读取i_end_col = 14 " 结束列i_end_row = 65536 " 结束行TABLESintern = gt_xlstmp " 存储读取的记录 行、列、值EXCEPTIONSinconsistent_parameters = 1upload_ole = 2OTHERS = 3.IF sy-subrc <> 0 .MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE sy-msgtyWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.STOP.ENDIF."将gt_xlstmp的数据遍历到gt_alv内表中"gt_xlstmp 中按行列的顺序将每个单元格值放在value中LOOP AT gt_xlstmp INTO gs_xlstmp. " 按先行后列遍历每个单元格lv_index = gs_xlstmp-col. " 获取当前列数ASSIGN COMPONENT lv_index OF STRUCTURE gs_excel TO . " 将内表第index列的字段地址复制给指针
" 对特殊类型字段可以用case语句单独处理,比如单位字段或者需要加前导零的字段
* CASE lv_index.
* WHEN 11. " 单位字段需要外码转内码
* PERFORM frm_meins_in USING gs_xlstmp-value.
* WHEN 12. " 物料号需要加前导0
* PERFORM frm_add_zero USING gs_xlstmp-value.
* WHEN 14. " wbs元素需要外码转内码
* PERFORM frm_pspnr_in USING gs_xlstmp-value.
* WHEN 15. " 外部日期yyyy*MM*dd转内部yyyyMMdd才可导入
* REPLACE ALL OCCURRENCES OF REGEX '[^0-9]' IN gs_xlstmp-value WITH ''.
* WHEN OTHERS.
* ENDCASE.MOVE gs_xlstmp-value TO . " 将单元格值赋值给指向结构中字段的指针CLEAR gs_xlstmp.AT END OF row. " 遍历至当行的最后一列时,将整行append至内表中APPEND gs_excel TO gt_excel.CLEAR gs_excel.ENDAT.ENDLOOP.
ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_meins_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GS_OUT_MEINS
*&---------------------------------------------------------------------*
FORM frm_meins_in USING p1.CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'EXPORTINGinput = p1language = sy-languIMPORTINGoutput = p1EXCEPTIONSunit_not_found = 1OTHERS = 2.IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.*&---------------------------------------------------------------------*
*& Form FRM_ADD_ZERO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P1
*&---------------------------------------------------------------------*
FORM frm_add_zero USING p1.CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'EXPORTINGinput = p1IMPORTINGoutput = p1.ENDFORM.*&---------------------------------------------------------------------*
*& Form frm_pspnr_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GS_OUT_PS_PSP_PNR
*&---------------------------------------------------------------------*
FORM frm_pspnr_in USING p1.CALL FUNCTION 'CONVERSION_EXIT_ABPSP_INPUT'EXPORTINGinput = p1IMPORTINGoutput = p1EXCEPTIONSnot_found = 1OTHERS = 2.IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!