DOI技术---OAOR--文件上传下载-SAP端

在文件上传和下载时候,客户有的会要求,文件下载到SAP端像ALV展示那样,展示EXCEL表格,在SAP端直接修改。效果图如下:

那如何实现:
1.OAOR事务码
首先这个和SWM0有点区别,这个将弄好的EXCEL模板传到SAP端用的事务码OAOR。
类名:HRFPM_EXCEL_STANDARD
类型:OT
Object key: 输入自己要导入的模板名称
点击执行。
在这里插入图片描述
2.选择创建,选择表模板并双击,就会提示你导入电脑本地的EXCEL文件,选择即可
在这里插入图片描述3.接下来就是代码部分了

TYPE-POOLS: sbdst, abap.
TYPE-POOLS kcde .
DATA: input TYPE kcde_intern_struc OCCURS 0 WITH HEADER LINE.“存放上传EXCEL数据
CONSTANTS:
    gc_classname TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD',
    gc_classtype TYPE sbdst_classtype VALUE 'OT',
    gc_objectkey TYPE sbdst_object_key VALUE 'ZFI_0406',
DATA: ok_code TYPE syucomm.

DATA: gr_container TYPE REF TO cl_gui_container,
      gr_splitter TYPE REF TO cl_gui_splitter_container,
      gr_control TYPE REF TO i_oi_container_control,
      gr_document TYPE REF TO i_oi_document_proxy,
      gr_spreadsheet TYPE REF TO i_oi_spreadsheet.

* business document system
DATA: gr_bds_documents TYPE REF TO cl_bds_document_set,
      g_doc_components TYPE sbdst_components,
      g_doc_signature TYPE sbdst_signature.

* template url
DATA: gt_bds_uris    TYPE sbdst_uri,
      g_template_url TYPE bds_uri.

* Required for writing data to Excel
DATA: gt_ranges TYPE soi_range_list,
      gt_contents TYPE soi_generic_table.
DATA: gt_out TYPE TABLE OF ts_struct.
DATA: container   TYPE REF TO cl_gui_custom_container,
      control     TYPE REF TO i_oi_container_control,
      document    TYPE REF TO i_oi_document_proxy,
      spreadsheet TYPE REF TO i_oi_spreadsheet,
      error       TYPE REF TO i_oi_error,
      errors      TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.
DATA: template    TYPE REF TO cl_bds_document_set,
      retcode     TYPE  soi_ret_string.
TYPES: BEGIN OF ty_line,
         key      TYPE  rf011z-ergso,  "报表版本行号
         stext    LIKE  rf011q-txt45,  "报表版本
         row      TYPE  n LENGTH 3,    "行号
         level    LIKE  rf011p-stufe,  " Hierarchy level
         begin    LIKE  glt0-tsl01,    "期初余额
         bcredit  LIKE glt0-tsl01,     "当前期间借方余额
         bdebit   LIKE glt0-tsl01,     "当前期间贷方余额
         end      LIKE  glt0-tslvt,    "期末余额
         ecredit  LIKE glt0-tslvt,     "期末累计借方余额
         edebit   LIKE glt0-tslvt,     "期末累计贷方余额
         sort(03) TYPE n,             "排序字段
       END OF ty_line.
TYPES: ty_lines TYPE ty_line OCCURS 0.
FIELD-SYMBOLS:
       <ln> TYPE  ty_line.

TYPES: c10 TYPE c LENGTH 10.

DATA: g_lines   TYPE ty_lines,
      gs_lines1 LIKE LINE OF g_lines,
      gs_lines2 LIKE LINE OF g_lines,
      g_year    TYPE  bkpf-gjahr,
      g_period  TYPE  bkpf-monat,
      g_sum_b   LIKE  glt0-tsl01,
      g_sum_e   LIKE  glt0-tsl01,
      g_sum_key LIKE  rf011q-ergsl,
      g_line    TYPE  ty_line,
      g_cn_year TYPE  c10,
      g_butxt   TYPE  t001-butxt.
DATA: ranges TYPE soi_range_list.
DATA: excel_input TYPE soi_generic_table.
DATA: rangeitem TYPE soi_range_item.
DATA: excel_input_wa TYPE soi_generic_item.

以上全是定义的东西,下面开始实现
START-OF-SELECTION.
PERFORM frm_get_dbdata.
PERFORM get_template_url.
CALL SCREEN 0100.
1.取数 把要放在EXCEL的数据取出来。(略)
2.取模板的路径

 DATA: ls_bds_url TYPE bapiuri.

  CREATE OBJECT gr_bds_documents.

  CALL METHOD gr_bds_documents->get_info
    EXPORTING
      classname  = gc_classname
      classtype  = gc_classtype
      object_key = gc_objectkey
    CHANGING
      components = g_doc_components
      signature  = g_doc_signature.

  CALL METHOD gr_bds_documents->get_with_url
    EXPORTING
      classname  = gc_classname
      classtype  = gc_classtype
      object_key = gc_objectkey
    CHANGING
      uris       = gt_bds_uris
      signature  = g_doc_signature.

  FREE gr_bds_documents.

  READ TABLE gt_bds_uris INTO ls_bds_url INDEX 1.
  IF sy-subrc = 0.
    g_template_url = ls_bds_url-uri.
  ENDIF.
ENDFORM.                    "

3.开始CALL屏幕,存放该路径下的模板那

CALL SCREEN 0100.

在这里插入图片描述

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
  MODULE pbo_0100.

PROCESS AFTER INPUT.
  MODULE pai_0100.

4 设置gui状态

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STANDARD'.
  SET TITLEBAR 'TITLE_01'.
ENDMODULE.          

5.PBO里写获取模板的内容

MODULE pbo_0100 OUTPUT.
  PERFORM main.
ENDMODULE.     
FORM main .
  IF gr_container IS BOUND.
    RETURN.
  ENDIF.

  PERFORM get_dynamic_container.
  PERFORM create_container_control.
  PERFORM open_excel_doc.
  PERFORM write_data_to_excel.
ENDFORM. 

得到屏幕容器

FORM get_dynamic_container .
  CREATE OBJECT gr_splitter
    EXPORTING
      parent  = cl_gui_container=>screen0
      rows    = 1
      columns = 1.

  CALL METHOD gr_splitter->set_border
    EXPORTING
      border = cl_gui_cfw=>false.

  gr_container = gr_splitter->get_container( row = 1 column = 1 ).
ENDFORM.  
* create container control
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = gr_control.

* initialize control
  CALL METHOD gr_control->init_control
    EXPORTING
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'DOI'
      parent                   = gr_container.
FORM open_excel_doc .
  DATA: lv_available TYPE i,
        lo_error TYPE REF TO i_oi_error.

  CALL METHOD gr_control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    IMPORTING
      document_proxy = gr_document.

  CALL METHOD gr_document->open_document
    EXPORTING
      open_inplace     = 'X'
      document_url     = g_template_url
      protect_document = 'X'.

  CALL METHOD gr_document->has_spreadsheet_interface
    EXPORTING
      no_flush     = 'X'
    IMPORTING
      error        = lo_error
      is_available = lv_available.

  CALL METHOD gr_document->get_spreadsheet_interface
    EXPORTING
      no_flush        = 'X'
    IMPORTING
      error           = lo_error
      sheet_interface = gr_spreadsheet.

  IF lv_available = 0.
    lo_error->raise_message( type = 'E' ).
  ENDIF.
ENDFORM.                    " OPEN_EXCEL_DOC

   

写入数据到EXCEL

DATA: lt_fields TYPE TABLE OF zsjr4038_field,
        ls_field  TYPE zsjr4038_field,
        lt_out    TYPE TABLE OF ts_struct,
        ls_out    TYPE ts_struct,
        lv_top    TYPE i,
        lv_value  TYPE char256.
  FIELD-SYMBOLS:
        <fs_content> TYPE soi_generic_item.

  SORT gt_out BY zyuans.

  CONCATENATE p_gjahr '年' p_monat '月' INTO lv_value.
  PERFORM fill_cell USING 2 1 lv_value.

  PERFORM write_company_desc.

  ls_field-column = 1.
  ls_field-fieldname = 'BYS'.
  APPEND ls_field TO lt_fields.

  ls_field-column = 2.
  ls_field-fieldname = 'QMS'.
  APPEND ls_field TO lt_fields.

  ls_field-column = 3.
  ls_field-fieldname = 'SNTQ'.
  APPEND ls_field TO lt_fields.

  " 1
  PERFORM insert_range_dim USING 'cell1' 7 3 34 3.
  PERFORM fill_ranges USING 'cell1' 34 3.

  CLEAR lt_out.
  LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '02' AND '35'.
    APPEND ls_out TO lt_out.
  ENDLOOP.

  PERFORM fill_contents TABLES lt_fields
                               lt_out.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.

  " 2
  PERFORM insert_range_dim USING 'cell2' 43 3 4 3.
  PERFORM fill_ranges USING 'cell2' 4 3.

  CLEAR lt_out.
  LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '37' AND '40'.
    APPEND ls_out TO lt_out.
  ENDLOOP.

  PERFORM fill_contents TABLES lt_fields
                               lt_out.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.

  " 3
  PERFORM insert_range_dim USING 'cell3' 48 3 2 3.
  PERFORM fill_ranges USING 'cell3' 2 3.

  CLEAR lt_out.
  LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '42' AND '43'.
    APPEND ls_out TO lt_out.
  ENDLOOP.

  PERFORM fill_contents TABLES lt_fields
                               lt_out.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.

  " 4
  PERFORM insert_range_dim USING 'cell4' 7 8 34 3.
  PERFORM fill_ranges USING 'cell4' 34 3.

  CLEAR lt_out.
  LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '45' AND '77'.
    APPEND ls_out TO lt_out.
  ENDLOOP.

  INSERT INITIAL LINE INTO lt_out INDEX 33.

  PERFORM fill_contents TABLES lt_fields
                               lt_out.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.

  " 5
  PERFORM insert_range_dim USING 'cell5' 44 8 6 3.   “第八列开始数三列,44行开始数6行
  PERFORM fill_ranges USING 'cell5' 6 3.

  CLEAR lt_out.
  LOOP AT gt_out INTO ls_out WHERE zyuans BETWEEN '80' AND '85'.
    APPEND ls_out TO lt_out.
  ENDLOOP.

  PERFORM fill_contents TABLES lt_fields
                               lt_out.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.
ENDFORM.                    " WRITE_DATA_TO_EXCEL
FORM fill_cell  USING p_top p_left p_value.
  DATA: ls_content TYPE soi_generic_item.

  CLEAR gt_contents.

  CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
    CHANGING
      value = p_value.

  PERFORM insert_range_dim USING 'cell' p_top p_left 1 1.
  PERFORM fill_ranges USING 'cell' 1 1.

  ls_content-column = 1.
  ls_content-row = 1.
  ls_content-value = p_value.
  APPEND ls_content TO gt_contents.

  CALL METHOD gr_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.
ENDFORM.  

FORM insert_range_dim USING p_name p_top p_left p_rows p_columns.
  CALL METHOD gr_spreadsheet->insert_range_dim
    EXPORTING
      name     = p_name
      no_flush = 'X'
      top      = p_top
      left     = p_left
      rows     = p_rows
      columns  = p_columns.
ENDFORM.

FORM fill_ranges  USING p_name p_rows p_columns.
  DATA: ls_range TYPE soi_range_item.

  CLEAR gt_ranges.
  ls_range-name = p_name.
  ls_range-rows = p_rows.
  ls_range-columns = p_columns.
  ls_range-code = 4.
  APPEND ls_range TO gt_ranges.
ENDFORM.  
FORM fill_contents  TABLES  lt_fields STRUCTURE zsjr4038_field
                            lt_table.
  DATA: ls_content TYPE soi_generic_item,
        lv_tabix TYPE sytabix.
  FIELD-SYMBOLS:
        <fs_line>  TYPE ANY,
        <fs_value> TYPE ANY,
        <fs_field> TYPE zsjr4038_field.

  CLEAR gt_contents.

  LOOP AT lt_table ASSIGNING <fs_line>.
    lv_tabix = sy-tabix.
    LOOP AT lt_fields ASSIGNING <fs_field>.
      ls_content-row = lv_tabix.
      CONDENSE ls_content-row.

      ls_content-column = <fs_field>-column.
      CONDENSE ls_content-column.

      ASSIGN COMPONENT <fs_field>-fieldname OF STRUCTURE <fs_line> TO <fs_value>.
      IF sy-subrc = 0.
        ls_content-value = <fs_value>.
        CONDENSE ls_content-value.

        IF zcl_fi_util=>is_number( <fs_value> ) = abap_true.
          IF <fs_value> = 0.
            CLEAR ls_content-value.
          ENDIF.

          IF <fs_value> < 0.
            CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
              CHANGING
                value = ls_content-value.
          ENDIF.
        ENDIF.

        CONDENSE ls_content-value.
        APPEND ls_content TO gt_contents.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    " FILL_CONTENTS

在这里插入图片描述`在这里插入代码片

MODULE pai_0100 INPUT.
  CASE ok_code.
    WHEN '&F03' OR '&F15' OR '&F12'.
      PERFORM release_objects.
      CLEAR ok_code.
      LEAVE TO SCREEN 0.
    WHEN 'UPLOAD'.
      PERFORM upload.
      CLEAR ok_code.
    WHEN 'ZSAVE'.
      PERFORM save.
      CLEAR ok_code.
  ENDCASE.
ENDMODULE.    

下面是模板:
在这里插入图片描述在这里插入图片描述


版权声明:本文为weixin_43885987原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。