ABAP 下载内表到多个sheet页完成过程

发布于:2023-01-13 ⋅ 阅读:(462) ⋅ 点赞:(0)

最近有个新报表需求,又学会了新的知识给大家分享,当然我自己也记录一下:

厂内物流费用分摊依据统计表:

入库清单:根据物料凭证行项目进行展示,可以展示工厂、过账日期、存储位置(库存标识符)、库存物料、数量、移动类型、事务代码等情况。(写入EXCEL第1个sheet页,命名为入库清单)

交货清单:根据交货单行项目进行展示,可以展示工厂、过账日期、交货单号、物料编码、物料描述、移动类型、运输方式、交货数量、参考凭证、参考项目、发出库位、发出库位描述、调入库位、调入库位描述等情况。(写入EXCEL第2个sheet页,命名为交货清单)

各厂统计表:根据入库清单、交货清单,通过EXCEL公式自动计算,分别计算出各厂的分摊依据。(EXCEL第3-6个sheet页)

首先取数逻辑部分就不细说,取数逻辑很简单,数据存放到了两个gt内,

之后到了分页过程:

FORM frm_edit_table .
  DATA:
  lv_menge TYPE string."当期实际产量
  CLEAR gs_table.
*  BREAK-POINT.
  gs_line_table-sheet_name = TEXT-001.
  LOOP AT gt_table INTO gs_table.

    lv_menge = gs_table-menge.
    PERFORM sub_put_sign_in_front CHANGING lv_menge.

    CONCATENATE
    gs_table-werks        cl_abap_char_utilities=>horizontal_tab"
    gs_table-budat        cl_abap_char_utilities=>horizontal_tab"
    gs_table-lgort_sid    cl_abap_char_utilities=>horizontal_tab"
    gs_table-matbf        cl_abap_char_utilities=>horizontal_tab"
    lv_menge              cl_abap_char_utilities=>horizontal_tab"
    gs_table-bwart        cl_abap_char_utilities=>horizontal_tab"
    gs_table-tcode2       cl_abap_char_utilities=>horizontal_tab"
INTO ls_data-line.

    CONDENSE ls_data-line NO-GAPS .

    APPEND ls_data TO gs_line_table-line.
  ENDLOOP.
  APPEND gs_line_table TO gt_line.
ENDFORM.

  数据类型不符,用lv_menge 代替了gs_table-menge  

 处理代码块如下:

PERFORM sub_put_sign_in_front CHANGING lv_menge.

FORM sub_put_sign_in_front CHANGING p_value TYPE string.

  DATA:
    lv_value TYPE string,
    lv_text.

  SEARCH p_value FOR '-'.

  IF sy-subrc = 0 AND sy-fdpos <> 0.
    SPLIT p_value AT '-' INTO lv_value lv_text.

    CONDENSE lv_value.

    CLEAR p_value.

    CONCATENATE '-'
                lv_value
           INTO p_value.
  ELSE.
    CONDENSE p_value.
  ENDIF.

ENDFORM.

最后用于下载的内表gt line 首先定义的结构:

 debug内容如下

 这样,我们就把最终基础表数据处理好,到达下一步,下载模板 

通用代码直接copy就可以了


FORM frm_download_exl .
  DATA:
    lv_obj        TYPE REF TO cl_gui_frontend_services,
    lt_excel_itab TYPE string OCCURS 0 WITH HEADER LINE,
    lv_gen_fnam   TYPE char20,
    lv_gen_path   TYPE localfile,
    lv_filename   TYPE string,
    lv_message    TYPE char100,
    lv_fullpath   TYPE string VALUE 'C:\',
    lv_path       TYPE string VALUE 'C:\',
    ls_objs       TYPE wwwdatatab.


    SELECT SINGLE wwwdata~relid
                  wwwdata~objid
    INTO CORRESPONDING FIELDS OF ls_objs
    FROM wwwdata
    WHERE relid = 'MI'
      AND objid = 'ZFI093'
      AND srtf2 = 0.
    IF sy-subrc <> 0.
      MESSAGE s208(00)
          WITH '模板不存在,请维护ZFI093!'
          DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.

CREATE OBJECT lv_obj .

  CALL METHOD lv_obj->file_save_dialog
    EXPORTING
      default_extension = 'XLSX'    "默认保存文件格式
      default_file_name = lv_filename   "默认文件名称
    CHANGING
      filename          = lv_filename
      path              = lv_path
      fullpath          = lv_fullpath.
  IF sy-subrc <> 0 .
    MESSAGE s208(00)
       WITH '保存文件出错'
       DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSEIF lv_fullpath IS INITIAL.
    LEAVE LIST-PROCESSING.
  ENDIF.

  lv_gen_path = lv_path.

  REPLACE '.XLS' WITH space INTO lv_filename.

  CONDENSE lv_filename NO-GAPS.

  lv_gen_fnam = lv_filename.

CALL FUNCTION 'ZDOWNLOAD_TO_EXCEL_MULSHEET'
        EXPORTING
          excel_id       = 'ZFI093'
          path           = lv_gen_path
          show_excel     = ''           "是否显示EXCEL
          excel_fname    = lv_gen_fnam  "EXCEL FILE NAME
          top_left_range = 'A2'         "起始列
        IMPORTING
          e_message      = lv_message        "返回错误日志
        TABLES
          line           = gt_line          "数据内容
        EXCEPTIONS
          excel_error    = 1
          OTHERS         = 2.
ENDFORM.

多sheet页的功能在很多模块也很常用例如生产日报月报班报、班日台账、质量报告单、财务结算表等,掌握方法加以理解,就能运用到各个方向,第一次写博客,希望大家给予支持建议!abap小白,希望可以一起学习。

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到