SAP 批导模板(发布Fiori可用)

该批导特点:

  1. 发布到fiori后,仍能正常导入excel内容
  2. 启动批导后,能提示用户预估运行时间及运行进度

代码如下:

*&---------------------------------------------------------------------*
*& Report ZDEMO_SEELE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdemo_seele.


*&---------------------------------------------------------------------*
* 池
*&---------------------------------------------------------------------*


TYPE-POOLS:slis.


*&---------------------------------------------------------------------*
* 表
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* 申明数据类型
*&---------------------------------------------------------------------*


TYPES:


* AVL显示


  BEGIN OF ty_alv,
    box       TYPE char1,                     " 选择
    status    TYPE char20,                    " 状态
    posid1    TYPE ps_posid,                  " 项目编号
    posid2    TYPE ps_posid,                  " 上层WBS
    posid3    TYPE ps_posid,                  " WBS元素
    post1     TYPE prps-post1,                " WBS描述
    werks     TYPE prps-werks,                " 公司/工厂
    kostl     TYPE prps-kostl,                " 成本中心
    prctr     TYPE prps-prctr,                " 利润中心
    vernr     TYPE prps-vernr,                " 负责人
    func_area TYPE prps-func_area,            " 功能范围
    message   TYPE char100,                   " 消息
  END OF ty_alv,


* 数据模版


  BEGIN OF ty_data,
    posid1    TYPE char30,                    " 项目编号
    posid2    TYPE char30,                    " 上层WBS
    posid3    TYPE char30,                    " WBS元素
    post1     TYPE char30,                    " WBS描述
    werks     TYPE char30,                    " 公司/工厂
    kostl     TYPE char30,                    " 成本中心
    prctr     TYPE char10,                    " 利润中心
    vernr     TYPE char10,                    " 负责人
    func_area TYPE char20,                    " 功能范围
  END OF ty_data.


*&---------------------------------------------------------------------*
* 定义全局内表
*&---------------------------------------------------------------------*


DATA:
  gt_alv      TYPE STANDARD TABLE OF ty_alv,  " ALV显示数据
  gt_upload   TYPE STANDARD TABLE OF ty_data, " 上传数据
  gt_download TYPE STANDARD TABLE OF ty_data, " 下载模版
  gt_excel    TYPE STANDARD TABLE OF ty_data.


*&---------------------------------------------------------------------*
* 定义全局工作区
*&---------------------------------------------------------------------*


DATA:
  gs_alv      TYPE ty_alv,                    " ALV显示数据
  gs_download TYPE ty_data,                   " 下载模版
  gs_excel    TYPE ty_data,
  gv_tabix    TYPE char1,                     " 序号
  gv_line     TYPE i,                         " 行号
  gv_start    TYPE timestamp.                 " 开始时间

*----------------------------------------------------------------------*
* 定义全局FS
*----------------------------------------------------------------------*
FIELD-SYMBOLS : <gt_data> TYPE STANDARD TABLE .

*----------------------------------------------------------------------*
* 定义全局变量
*----------------------------------------------------------------------*
* 参数设置变量


DATA:
  gv_mod        TYPE wwwdata-objid .  " 下载文件名SMW0


*----------------------------------------------------------------------*
* 定义alv数据
*----------------------------------------------------------------------*


DATA:
  gs_layout_alv   TYPE slis_layout_alv,
  gt_fieldcat_alv TYPE slis_t_fieldcat_alv,
  gs_fieldcat_alv TYPE slis_fieldcat_alv,
  gs_layout_log   TYPE slis_layout_alv,
  gt_fieldcat_log TYPE slis_t_fieldcat_alv,
  gs_fieldcat_log TYPE slis_fieldcat_alv,
  gv_ref_grid     TYPE REF TO cl_gui_alv_grid.



*&---------------------------------------------------------------------*
* 选择屏幕
*&---------------------------------------------------------------------*


SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.

  PARAMETERS:p1 RADIOBUTTON GROUP rb_1 DEFAULT 'X' USER-COMMAND create, "EXCEL导入
             p2 RADIOBUTTON GROUP rb_1.                "EXCEL下载

  PARAMETERS:p_file TYPE rlgrap-filename MODIF ID m1."文件名
SELECTION-SCREEN END OF BLOCK blk1 .




*&---------------------------------------------------------------------*
* Initialization
*&---------------------------------------------------------------------*


INITIALIZATION.
  " 初始化下载模版路径参数
  PERFORM frm_init_download.


*&---------------------------------------------------------------------*
* At selection screen output
*&---------------------------------------------------------------------*


AT SELECTION-SCREEN OUTPUT.
  " 初始化选择屏幕
  PERFORM frm_init_screen.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  " 获取文件路径
  PERFORM frm_get_path CHANGING p_file.


*&---------------------------------------------------------------------*
* At selection screen
*&---------------------------------------------------------------------*


AT SELECTION-SCREEN.


*&---------------------------------------------------------------------*
* Start of selection
*&---------------------------------------------------------------------*


START-OF-SELECTION.

  IF p1 = 'X' .


*&---EXCEL导入数据文件名为空检查


    IF p_file IS INITIAL.
      MESSAGE TEXT-002 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.


*&---上载EXCLE数据


    PERFORM frm_upload.


*&---内表ALV导入数据整理


    PERFORM frm_set_data.


*&---ALV 展示(file data VS itab data check)


    PERFORM frm_alv_dis.


*&---EXCEL模板下载


  ELSEIF p2 = 'X' .
    PERFORM frm_download.
  ENDIF.



*&---------------------------------------------------------------------*
* End of selection
*&---------------------------------------------------------------------*


END-OF-SELECTION.



*&---------------------------------------------------------------------*
*&      FORM  frm_init_download
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_init_download .

  gv_mod = 'ZFIC_WBS_IMPORT'. " 下载文件名SMW0(该程序名称

ENDFORM. " FRM_INIT_DOWNLOAD


*&---------------------------------------------------------------------*
*&      FORM  frm_init_screen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_init_screen .



*&---控制选择条件显示设置M1/M2


  LOOP AT SCREEN.
    IF screen-group1 = 'M1'.


*&---下载/日志隐藏


      IF p2 = 'X'.
        screen-active = 0.
      ENDIF.

      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

ENDFORM. " FRM_INIT_SCREEN



*&---------------------------------------------------------------------*
*&      FORM  frm_get_path
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--p_flname  text
*----------------------------------------------------------------------*


FORM frm_get_path CHANGING pv_filename TYPE rlgrap-filename.

  DATA: lt_file_table TYPE filetable,
        ls_file_table TYPE file_table,
        lv_rc         TYPE i.
  " 获取文件路径
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'File Path'
      initial_directory       = 'E:\'
    CHANGING
      file_table              = lt_file_table
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    IF sy-subrc = 0.
      pv_filename = ls_file_table-filename. " 文件路径
    ENDIF.
  ELSE.


*   Implement suitable error handling here


  ENDIF.

ENDFORM. " FRM_GET_PATH


*&---------------------------------------------------------------------*
*&      FORM  frm_upload
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_upload .



*&---文件数据处理


  DATA:t_raw_data  TYPE truxs_t_text_data.
  DATA : lt_return TYPE bapiret2_t.

  PERFORM frm_upload_data_v1 TABLES gt_upload.

  IF sy-subrc <> 0.
*    MESSAGE '读取数据失败!' TYPE 'I' DISPLAY LIKE 'E'.
    MESSAGE TEXT-013 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM. " FRM_UPLOAD


*&---------------------------------------------------------------------*
*&      FORM  frm_set_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_set_data .

  MOVE-CORRESPONDING gt_upload TO gt_alv.

  gs_alv-status = icon_yellow_light.    " 黄灯

  MODIFY gt_alv FROM gs_alv
   TRANSPORTING status
   WHERE posid1 IS NOT INITIAL.

ENDFORM. " FRM_SET_DATA


*&---------------------------------------------------------------------*
*&      FORM  frm_alv_dis
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_alv_dis .
  " 设置输出格式
  PERFORM frm_init_layout.
  " 设置输出字段
  PERFORM frm_fill_fieldcat.
  " 输出ALV
  PERFORM frm_output_alv.

ENDFORM. " FRM_ALV_DIS


*&---------------------------------------------------------------------*
*&      FORM  frm_init_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_init_layout .

  CLEAR gs_layout_alv.

  gs_layout_alv-colwidth_optimize = 'X'.        " 优化列宽
  gs_layout_alv-zebra             = 'X'.        " 行信息按颜色交叉显示
  gs_layout_alv-f2code            = '&ETA'.     " 双击显示详细信息
  gs_layout_alv-box_fieldname     = 'BOX'.


*  gs_layout_alv-INFO_FIELDNAME    = 'COLOR'.    " 行颜色字段



ENDFORM. " FRM_INIT_LAYOUT


*&---------------------------------------------------------------------*
*&      FORM  frm_fill_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_fill_fieldcat .

  CLEAR gt_fieldcat_alv.

  PERFORM frm_set_fieldcat USING '' 'STATUS'    ''     ''      '状态'       ''.
  PERFORM frm_set_fieldcat USING '' 'POSID1'    ''     ''      '项目编号'   ''.
  PERFORM frm_set_fieldcat USING '' 'POSID2'    ''     ''      '上层WBS'    ''.
  PERFORM frm_set_fieldcat USING '' 'POSID3'    ''     ''      'WBS元素'    ''.
  PERFORM frm_set_fieldcat USING '' 'POST1'     'PRPS' 'POST1' 'WBS描述'    ''.
  PERFORM frm_set_fieldcat USING '' 'WERKS'     'PRPS' 'WERKS' '工厂'       ''.
  PERFORM frm_set_fieldcat USING '' 'KOSTL'     'PRPS' 'KOSTL' '成本中心'   ''.
  PERFORM frm_set_fieldcat USING '' 'PRCTR'     'PRPS' 'PRCTR' '利润中心'   ''.
  PERFORM frm_set_fieldcat USING '' 'VERNR'     'PRPS' 'VERNR' '成本中心'   ''.
  PERFORM frm_set_fieldcat USING '' 'FUNC_AREA' 'PRPS' 'FUNC_AREA' '功能范围'   ''.
  PERFORM frm_set_fieldcat USING '' 'MESSAGE'   ''     ''      '消息'       ''.

ENDFORM. " FRM_FILL_FIELDCAT


*&---------------------------------------------------------------------*
*&      FORM  frm_set_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->p_0823   text
*      -->p_0824   text
*      -->p_0825   text
*      -->p_0826   text
*----------------------------------------------------------------------*


FORM frm_set_fieldcat USING pv_key TYPE char1
                            pv_fieldname    TYPE slis_fieldname
                            pv_table        TYPE dd03p-tabname
                            pv_field        TYPE dd03p-fieldname
                            pv_fieldtext    TYPE dd03p-scrtext_l
                            pv_zero         TYPE char1.

  CLEAR gs_fieldcat_alv.

  gs_fieldcat_alv-key           = pv_key.
  gs_fieldcat_alv-fieldname     = pv_fieldname.
  gs_fieldcat_alv-ref_tabname   = pv_table.
  gs_fieldcat_alv-ref_fieldname = pv_field.
  gs_fieldcat_alv-seltext_s     = pv_fieldtext.
  gs_fieldcat_alv-seltext_l     = pv_fieldtext.
  gs_fieldcat_alv-seltext_m     = pv_fieldtext.
  gs_fieldcat_alv-no_zero       = pv_zero.

  IF pv_fieldname = 'STATUS'.

    gs_fieldcat_alv-icon = 'X'.

  ENDIF.

  APPEND gs_fieldcat_alv TO gt_fieldcat_alv.

ENDFORM. " FRM_SET_FIELDCAT


*&---------------------------------------------------------------------*
*&      FORM  frm_output_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_output_alv .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      is_layout                = gs_layout_alv
      it_fieldcat              = gt_fieldcat_alv
      i_save                   = 'X'
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.


* Implement suitable error handling here


  ENDIF.

ENDFORM. " FRM_OUTPUT_ALV


*&---------------------------------------------------------------------*
*&      FORM  frm_download
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_download .



*&---变量定义


  DATA:lv_text       TYPE string,                     " message
       lv_filename   TYPE string,                    " download file name
       lv_path       TYPE string,                    " download file path
       lv_functxt    TYPE smp_dyntxt,                " menu name
       lv_filepath   TYPE rlgrap-filename VALUE 'c', " file patch
       lv_title      TYPE string ,                   " title
       lv_title_name TYPE string,                    " title name
       lv_mod(20),                                   " model
       lv_fullpath   TYPE string,                    " full path
       lv_object     TYPE wwwdatatab,                " object name
       lv_rc         TYPE sy-subrc.                  " return code



*&---SMWO 模板名称


  lv_mod = gv_mod. "下载文件名


*&---调用OS 操作系统对话框


  lv_title      = TEXT-006.
  lv_title_name = TEXT-007.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title      = lv_title      " 保存'
      default_file_name = lv_title_name " 客户合作伙伴导入模板
    CHANGING
      filename          = lv_filename
      path              = lv_path
      fullpath          = lv_fullpath.


*&---操作系统文件路径


  CONCATENATE lv_path
   lv_filename
   '.xlsx'
   INTO lv_filepath.


*&---OS长度控制/*&---下载模板


  IF strlen( lv_filepath ) <> 4.


*&---查询模板.


    SELECT SINGLE relid
     objid
     FROM wwwdata
     INTO CORRESPONDING FIELDS OF lv_object
     WHERE srtf2 = '0'
     AND objid = lv_mod.                         "smw0里对象名称
    IF sy-subrc <> 0 OR lv_object-objid = space .
      CONCATENATE TEXT-008"'模板文件:'
      lv_mod
      TEXT-009"'不存在,请用smw0进行加载.'
      INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.


*&---下载模板


    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lv_object
        destination = lv_filepath
      IMPORTING
        rc          = lv_rc.
    IF lv_rc <> 0.
      CONCATENATE TEXT-008"''模板文件:'
      lv_mod
      TEXT-010"''下载失败,请与开发人员联系.'
      INTO lv_text.
      MESSAGE lv_text TYPE 'E'.
      STOP.
    ENDIF.


*&---'已下载'


    MESSAGE TEXT-011 TYPE 'S'.
  ELSE.


*&---'已取消下载'


    MESSAGE TEXT-012 TYPE 'S'.
  ENDIF.

ENDFORM. " FRM_DOWNLOAD


*&---------------------------------------------------------------------*
*&      FORM  frm_set_pf_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->i_t_extab  text
*----------------------------------------------------------------------*


FORM frm_set_pf_status USING i_t_extab TYPE slis_t_extab.

  SET PF-STATUS 'ZPF_STATUS1000'.

ENDFORM. "FRM_SET_PF_STATUS


*&---------------------------------------------------------------------*
*&      FORM  frm_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->r_ucomm      text
*      -->rs_selfield  text
*----------------------------------------------------------------------*


FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.

  PERFORM frm_alv_changed.

  CASE r_ucomm.
      " 创建WBS元素
    WHEN 'IPT'.

      PERFORM frm_ct_wbs.

  ENDCASE.

  rs_selfield-refresh = 'X'.

ENDFORM. "FRM_USER_COMMAND


*&---------------------------------------------------------------------*
*&      FORM  frm_ct_wbs
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_ct_wbs .

  DATA:
    lt_data        LIKE gt_alv,
    ls_data        LIKE gs_alv,
    lv_project     TYPE bapi_bus2001_new-project_definition,
    lt_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_new WITH HEADER LINE,
    et_return      TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
    et_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_detail  WITH HEADER LINE.

  lt_data = gt_alv.

  DELETE lt_data WHERE box <> 'X' OR message IS NOT INITIAL.

  SORT lt_data  BY posid1.
  DELETE ADJACENT DUPLICATES FROM lt_data
  COMPARING posid1.

  IF lt_data IS INITIAL.

    MESSAGE '请至少选择一条有效数据!' TYPE 'S' DISPLAY LIKE 'E'.

    EXIT.

  ENDIF.

  CLEAR:gv_tabix,gv_line.



* &---Initialization


  " 获取计时器条码数和初始时间
  DESCRIBE TABLE lt_data LINES gv_line.
  GET TIME STAMP FIELD gv_start.

  LOOP AT lt_data INTO  ls_data.

    CLEAR:lv_project,et_wbs_element[],et_return[],et_wbs_element,et_return.

    " 项目号
    lv_project = ls_data-posid1.
    " 获取项目WBS信息
    CALL FUNCTION 'BAPI_BUS2054_GETDATA'
      EXPORTING
        i_project_definition = lv_project
      TABLES
        et_wbs_element       = et_wbs_element[]
        et_return            = et_return[].

    " 处理导入的WBS元素数据
    CLEAR:lt_wbs_element,lt_wbs_element[].
    LOOP AT gt_alv INTO  gs_alv
      WHERE posid1  = ls_data-posid1
        AND box     = 'X'.

      CLEAR lt_wbs_element.
      " 获取上层WBS元素信息
      READ TABLE et_wbs_element
       WITH KEY  wbs_element = gs_alv-posid2.
      IF sy-subrc = 0.

        MOVE-CORRESPONDING et_wbs_element TO lt_wbs_element.
        lt_wbs_element-wbs_element             = gs_alv-posid3. " WBS元素
        lt_wbs_element-description             = gs_alv-post1.  " WBS描述
        lt_wbs_element-request_cctr            = gs_alv-kostl.  " 成本中心
        lt_wbs_element-wbs_up                  = gs_alv-posid2. " 上层WBS元素
        lt_wbs_element-plant                   = gs_alv-werks.  " 工厂
*        lt_wbs_element-company_code           = gs_alv-werks.  " 公司
        lt_wbs_element-wbs_cctr_posted_actual  = gs_alv-kostl.  "成本中心
        lt_wbs_element-profit_ctr              = gs_alv-prctr.  "利润中心
        lt_wbs_element-responsible_no          = gs_alv-vernr.  "负责人
        lt_wbs_element-func_area               = gs_alv-func_area. "功能范围

        CLEAR lt_wbs_element-wbs_left.  " 清空左WBS元素

        APPEND lt_wbs_element.

      ELSE.

        " 如果查询不到上层WBS元素信息,则将WBS挂载到顶层项目下
        lt_wbs_element-wbs_element             = gs_alv-posid3. " WBS元素
        lt_wbs_element-description             = gs_alv-post1.  " WBS描述
        lt_wbs_element-request_cctr            = gs_alv-kostl.  " 成本中心
        lt_wbs_element-plant                   = gs_alv-werks.  " 工厂
*        lt_wbs_element-company_code           = gs_alv-werks.  " 公司
        lt_wbs_element-wbs_cctr_posted_actual  = gs_alv-kostl.  "成本中心
        lt_wbs_element-profit_ctr              = gs_alv-prctr.  "利润中心
        lt_wbs_element-responsible_no          = gs_alv-vernr.  "负责人
        lt_wbs_element-func_area               = gs_alv-func_area. "功能范围

        APPEND lt_wbs_element.

      ENDIF.

    ENDLOOP.
    " 初始化
    CHECK lt_wbs_element[] IS NOT INITIAL.
    REFRESH et_return[].
    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
    " 创建WBS
    CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
      EXPORTING
        i_project_definition = lv_project
      TABLES
        it_wbs_element       = lt_wbs_element[]
        et_return            = et_return.
    READ TABLE et_return WITH KEY type = 'E'.
    IF sy-subrc <> 0.

      CLEAR:et_return[],et_return.
      " 提交
      CALL FUNCTION 'BAPI_PS_PRECOMMIT'
        TABLES
          et_return = et_return.
      READ TABLE et_return WITH KEY type = 'E'.
      IF sy-subrc <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        " 更新日志信息
        gs_alv-message  = 'WBS创建成功'.
        gs_alv-status   = icon_green_light.

        MODIFY gt_alv FROM gs_alv
        TRANSPORTING status message
        WHERE box = 'X' AND posid1  = ls_data-posid1.

      ELSE.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        " 更新日志信息
        gs_alv-message  = 'WBS创建失败,'.
        gs_alv-status   = icon_red_light.

        " 错误日志
        LOOP AT et_return.
          gs_alv-message  = gs_alv-message && et_return-message && ';'.
        ENDLOOP.

        MODIFY gt_alv FROM gs_alv
        TRANSPORTING status message
        WHERE box = 'X' AND posid1  = ls_data-posid1.

      ENDIF.

    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      " 更新日志信息
      gs_alv-message  = 'WBS创建失败,'.
      gs_alv-status   = icon_red_light.

      " 错误日志
      LOOP AT et_return.
        gs_alv-message  = gs_alv-message && et_return-message && ';'.
      ENDLOOP.

      MODIFY gt_alv FROM gs_alv
      TRANSPORTING status message
      WHERE box = 'X' AND posid1  = ls_data-posid1.

    ENDIF.

    " 指示器计时
    gv_tabix = gv_tabix + 1.

    WAIT UP TO 5 SECONDS.

    PERFORM frm_indicator USING gv_tabix.

  ENDLOOP.

ENDFORM. " FRM_CT_WBS


*&---------------------------------------------------------------------*
*&      FORM  frm_alv_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_alv_changed .



*--------------------------------------------------------------------*
* 将前台数据更新至内表中


  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = gv_ref_grid.

  CALL METHOD gv_ref_grid->check_changed_data.

ENDFORM. " FRM_ALV_CHANGED


*&---------------------------------------------------------------------*
*&      FORM  frm_indicator
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM frm_indicator USING pv_index TYPE char1.


*&---data declaration/进度条变量


  DATA: lv_linec      TYPE c LENGTH 20,           "total records to be processed of string
        lv_index      TYPE i,                     "current records being processed
        lv_percentage TYPE f,                     "percentage of processed records
        lv_text       TYPE c LENGTH 80.           "info displayed at progress indicator



*&---process logic


  lv_index = pv_index.



*&---show progress indicator/显示进度条
*&---当前占比%


  lv_percentage = lv_index / gv_line * 100.


*&---剩余条目数
*  lv_remaining = gv_line - lv_index.
*&---数字文本强制转换


  WRITE gv_line     TO lv_linec LEFT-JUSTIFIED.
  WRITE lv_index    TO lv_text   LEFT-JUSTIFIED.


*&---进度条(记录)


  CONCATENATE TEXT-003 "'Processing remaining'(005)
   lv_text
   '/'
   lv_linec
   TEXT-004"'items'(007)
   INTO lv_text SEPARATED BY space.


*&---时间记录


  PERFORM estimate_remaining_time USING gv_start
         lv_index
         gv_line
   CHANGING lv_text.


*&---SAP GUI 进度条


  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = lv_percentage
      text       = lv_text.

ENDFORM.


*&---------------------------------------------------------------------*
*&      FORM  estimate_remaining_time
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_gv_start  text
*      -->p_lv_index  text
*      -->P_gv_line  text
*      <--p_lv_text  text
*----------------------------------------------------------------------*


FORM estimate_remaining_time USING pv_start TYPE p "timestamp of start processing
                                   pv_index TYPE i "current record being processed
                                   pv_total TYPE i "total number of records to be processed
                          CHANGING pv_text  TYPE c."text to display remaining time



*&---Data declaration/进度条时间变量


  DATA:lv_current   TYPE timestamp,    "当前时间戳
       lv_duration  TYPE tzntstmpl,    "持续时间
       lv_remaining TYPE c LENGTH 15,  "剩余时间
       lv_hours     TYPE c LENGTH 4,   "换算小时数
       lv_minutes   TYPE n LENGTH 2,   "换算分钟数
       lv_seconds   TYPE n LENGTH 2.   "换算秒数



*&---Get current time stamp/获取当前时间戳


  GET TIME STAMP FIELD lv_current.


*&---calculate execution time (so far)/计算持续时间


  TRY.
      CALL METHOD cl_abap_tstmp=>subtract
        EXPORTING
          tstmp1 = lv_current
          tstmp2 = pv_start
        RECEIVING
          r_secs = lv_duration.
    CATCH cx_parameter_invalid_range .                  "#EC NO_HANDLER
    CATCH cx_parameter_invalid_type .                   "#EC NO_HANDLER
  ENDTRY.



*&---estimate remaining execution time/剩余执行时间


  lv_remaining = lv_duration * ( pv_total - pv_index ) / pv_index.


*&---整小时数


  lv_hours     = lv_remaining DIV 3600.


*&---剩余分钟数


  lv_remaining = lv_remaining MOD 3600.


*&---整分钟数


  lv_minutes   = lv_remaining DIV 60.


*&---剩余秒数


  lv_seconds   = lv_remaining MOD 60.


*&---append to the text/文本


  CONCATENATE pv_text
   ' ('
   TEXT-005" 'estimated remaining time:'(006)
   lv_hours
   ':'
   lv_minutes
   ':'
   lv_seconds
   ')'
   INTO pv_text.

ENDFORM. " ESTIMATE_REMAINING_TIME

FORM frm_upload_data_v1 TABLES et_tab STRUCTURE gs_download.

  DATA : lv_filename      TYPE string,
         lt_records       TYPE solix_tab,
         lv_headerxstring TYPE xstring,
         lv_filelength    TYPE i.

  lv_filename = p_file.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    IMPORTING
      filelength              = lv_filelength
      header                  = lv_headerxstring
    TABLES
      data_tab                = lt_records
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  IF sy-subrc = 0.

    "CONVERT BINARY DATA TO XSTRING
    "IF YOU ARE USING CL_FDT_XL_SPREADSHEET IN ODATA THEN SKIPS THIS STEP
    "AS EXCEL FILE WILL ALREADY BE IN XSTRING
    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
      EXPORTING
        input_length = lv_filelength
      IMPORTING
        buffer       = lv_headerxstring
      TABLES
        binary_tab   = lt_records
      EXCEPTIONS
        failed       = 1
        OTHERS       = 2.

    IF sy-subrc <> 0.
      "IMPLEMENT SUITABLE ERROR HANDLING HERE
    ENDIF.

    DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .

    TRY .
        lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
                                document_name = lv_filename
                                xdocument     = lv_headerxstring ) .
      CATCH cx_fdt_excel_core.
        "IMPLEMENT SUITABLE ERROR HANDLING HERE
    ENDTRY .

    "GET LIST OF WORKSHEETS
    lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
      IMPORTING
        worksheet_names = DATA(lt_worksheets) ).

    IF NOT lt_worksheets IS INITIAL.
      READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX 1.

      DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                               lv_woksheetname ).
      "NOW YOU HAVE EXCEL WORK SHEET DATA IN DYANMIC INTERNAL TABLE
      ASSIGN lo_data_ref->* TO <gt_data>.
    ENDIF.

*文件转换
    PERFORM process_file TABLES et_tab .

  ELSE.
*    MESSAGE e027(zfi02) WITH 'PLEASE CLOSE EXCEL BEFORE UPLOAD'.
    MESSAGE '未从excel读取到数据!' TYPE 'S' DISPLAY LIKE 'E'."查询不到数据!
  ENDIF.



ENDFORM.
*&---------------------------------------------------------------------*

FORM process_file TABLES et_tab STRUCTURE gs_download.

  DATA : lv_numberofcolumns   TYPE i,
         lv_date_string       TYPE string,
         lv_target_date_field TYPE datum.

  DATA: es_tab LIKE gs_download.
  FIELD-SYMBOLS : <ls_data>   TYPE any,
                  <lv_field>  TYPE any,
                  <lv_field2> TYPE any. "内表字段

  LOOP AT <gt_data> ASSIGNING <ls_data> .
    IF <ls_data> IS INITIAL.
      DELETE TABLE <gt_data> FROM <ls_data> .
    ENDIF.

  ENDLOOP.

  "YOU COULD FIND OUT NUMBER OF COLUMNS DYNAMICALLY FROM TABLE <GT_DATA>
  lv_numberofcolumns = 9 .

  CLEAR:et_tab,gt_excel,gs_excel.
  LOOP AT <gt_data> ASSIGNING <ls_data> FROM 2.
    DO lv_numberofcolumns TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <lv_field> .
      ASSIGN COMPONENT sy-index OF STRUCTURE gs_excel TO <lv_field2>.
      <lv_field2> = <lv_field>.
    ENDDO.
    MOVE-CORRESPONDING gs_excel TO es_tab.
    APPEND es_tab TO et_tab.
    CLEAR:es_tab.
  ENDLOOP.
ENDFORM.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值