当前位置: 首页 > news >正文

SAP DOI EXCEL应用

【应用场景】采用DOI方式打开填充EXCEL数据

*&---------------------------------------------------------------------*
*&  包含                ZFI1009R_TOP
*&---------------------------------------------------------------------*
TABLES:bkpf,bseg.

DATA: gt_list TYPE TABLE OF zsfi1009_02,
      gs_list TYPE zsfi1009_02.

"===>DOI 相关变量
DATA  gi_spreadsheet    TYPE REF TO i_oi_spreadsheet.
DATA  gi_document       TYPE REF TO i_oi_document_proxy.
DATA  gs_sheet          TYPE ole2_object.
DATA  gs_handle         TYPE cntl_handle.
DATA  gt_ranges         TYPE soi_range_list.
DATA  gt_excel_input    TYPE soi_generic_table.
DATA  gc_container      TYPE REF TO cl_gui_custom_container.
DATA  gi_control        TYPE REF TO i_oi_container_control.
DATA  gt_header         TYPE soi_generic_table.
DATA  gv_menu           TYPE c VALUE 'X'.
DATA  gv_sapye          TYPE p LENGTH 16 DECIMALS 2.
DATA  gv_percentage     TYPE i.
DATA  gt_edit_area      TYPE TABLE OF string.
DATA  gi_error          TYPE REF TO i_oi_error." occurs 0 with header line.
"<===DOI 相关变量


*==============EXCEL 模板变量========================*
DATA gs_temp_name TYPE bds_propva VALUE 'ZFI1009R'. "excel 模板名称
CONSTANTS:
  gs_sheet1 TYPE scrfname VALUE  '凭证'.
*==================================================*

DATA: lt_ztfi0222   TYPE SORTED TABLE OF ztfi0222
                     WITH NON-UNIQUE KEY fzhlx priority
                     WITH HEADER LINE,
      lt_ztfi0222_1 TYPE SORTED TABLE OF ztfi0222
                     WITH NON-UNIQUE KEY sapfzhzd priority
                     WITH HEADER LINE,
      "lt_prhi     TYPE TABLE OF prhi WITH HEADER LINE,
      lt_ztfi0120   TYPE SORTED TABLE OF ztfi0120
                  WITH NON-UNIQUE KEY hslx zzxiangmu
                  WITH HEADER LINE, " 项目分期对应关系[EAS<->SAP]
      lt_ztfi0121   TYPE SORTED TABLE OF ztfi0121
                  WITH NON-UNIQUE KEY hslx zzyeta1 zzxiangmu
                  WITH HEADER LINE, " 产品类型对应关系[EAS<->SAP]
      lt_ztfi0122   TYPE SORTED TABLE OF ztfi0122
                  WITH NON-UNIQUE KEY hslx zzroom
                  WITH HEADER LINE, " 房源类型对应关系[EAS<->SAP]
      lt_ztfi0123   TYPE SORTED TABLE OF ztfi0123
                  WITH NON-UNIQUE KEY zzbeiyong1_1  zzbeiyong1 zzbeiyong2
                  WITH HEADER LINE, " 辅助核算内容对应关系[EAS<->SAP]
      lt_ztfi0124   TYPE SORTED TABLE OF ztfi0124
                  WITH NON-UNIQUE KEY hslx zzhbkid zzhktid
                  WITH HEADER LINE, " 银行帐户对应关系[EAS<->SAP]
      lt_ztfi0161   TYPE SORTED TABLE OF ztfi0161
                  WITH NON-UNIQUE KEY hslx bukrs zzhetong2
                  WITH HEADER LINE, " 合同号新旧代码对应关系[EAS期初凭证]
      lt_ztfi0170   TYPE SORTED TABLE OF ztfi0170
                  WITH NON-UNIQUE KEY hslx lifnr
                  WITH HEADER LINE, " 供应商对应关系[EAS<->SAP]
      lt_ztfi0171   TYPE SORTED TABLE OF ztfi0171
                  WITH NON-UNIQUE KEY hslx kunnr
                  WITH HEADER LINE, " 客户对应关系[EAS<->SAP]
      lt_ztfi0172   TYPE SORTED TABLE OF ztfi0172
                  WITH NON-UNIQUE KEY hslx kostl
                  WITH HEADER LINE, " 成本中心对应关系[EAS<->SAP]
      lt_ztfi0268   TYPE SORTED TABLE OF ztfi0268
                  WITH NON-UNIQUE KEY hslx rassc
                  WITH HEADER LINE, " 贸易伙伴对照表[EAS<->SAP]
      lt_ztfi0360   TYPE SORTED TABLE OF ztfi0360
                  WITH NON-UNIQUE KEY hslx zzmenge
                  WITH HEADER LINE, " 往来类型对照关系表
      lt_ztfi0020   TYPE SORTED TABLE OF ztfi0020
                  WITH NON-UNIQUE KEY jkxzn
                  WITH HEADER LINE,
      lt_t007s      TYPE SORTED TABLE OF t007s
                  WITH NON-UNIQUE KEY mwskz
                  WITH HEADER LINE,

      BEGIN OF lt_t012k OCCURS 0,
        bukrs   TYPE t012k-bukrs,
        hbkid   TYPE t012k-hbkid,
        hktid   TYPE t012k-hktid,
        bankn   TYPE t012k-bankn,
        bnkn2   TYPE t012k-bnkn2,
        zzhktid TYPE zzhktid,
        text1   TYPE fibl_txt50,
      END OF lt_t012k.

DATA: BEGIN OF gt_fields OCCURS 0,
        fields TYPE char20,
        desc   TYPE char30,
        field2 TYPE char20,
        field3 TYPE char20,
        table  TYPE char30,
      END OF gt_fields.

SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs,
                s_budat FOR bkpf-budat,
                s_belnr FOR bkpf-belnr,
                s_hd2   FOR bkpf-xref2_hd.
 

START-OF-SELECTION.

  PERFORM frm_check_auth.

  PERFORM frm_get_data.

  PERFORM frm_process_data.

  PERFORM frm_doi_display.

*&---------------------------------------------------------------------*
*&      Form  FRM_DOI_DISPLAY
*&---------------------------------------------------------------------*
FORM frm_doi_display .
  CALL SCREEN 100.
ENDFORM.

SCREEN PBO/PAI

*----------------------------------------------------------------------*
***INCLUDE ZFI1009R_M01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'ST01'.
*  SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  MOD_SET_DOI  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE mod_set_doi OUTPUT.
  PERFORM FRM_SET_DOI.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE SY-UCOMM.
    WHEN 'SAVE'.
      PERFORM FRM_DOI_SAVE.
    WHEN 'EXIT' OR 'STOP' OR 'CANCEL'.
      PERFORM FRM_DOI_RELEASE.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.
 

 DOI处理相关方法

*&---------------------------------------------------------------------*
*&  包含                ZFI1009R_DOI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_DOI_SAVE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_doi_save .
  DATA: lr_error     TYPE REF TO  i_oi_error,
        lv_retcode   TYPE soi_ret_string,
        lv_file_name TYPE c VALUE 'C:\SSS.XLS'.

  IF gi_document IS NOT INITIAL.
    CALL METHOD gi_document->save_as
      EXPORTING
        file_name   = 'X'
        prompt_user = 'X'
      IMPORTING
        error       = lr_error
        retcode     = lv_retcode.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOI_RELEASE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_doi_release .
  IF gi_spreadsheet IS NOT INITIAL.
    FREE gi_spreadsheet.
  ENDIF.

  IF gi_document IS NOT INITIAL.
    CALL METHOD gi_document->close_document.
  ENDIF.

  IF gc_container IS NOT INITIAL.
    CALL METHOD gc_container->free.
  ENDIF.

  IF gi_control IS NOT INITIAL.
    CALL METHOD gi_control->destroy_control.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_DOI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_doi .
  IF gs_handle IS INITIAL.
    PERFORM frm_doi_create USING gs_temp_name.       "创建DOI对象
    PERFORM frm_fill_sheets_data. "填写SHEET数据
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOI_CREATE
*&---------------------------------------------------------------------*
FORM frm_doi_create  USING  i_temp_name.
  DATA  item_url    TYPE c LENGTH 256.
  DATA  lv_filename TYPE string.
  DATA  lv_rc       TYPE i.
  DATA  has         TYPE i.
  DATA: cl_splitter  TYPE REF TO cl_gui_splitter_container,
        cl_container TYPE REF TO cl_gui_container.


  DATA: iv_percentage TYPE i VALUE '100',
        iv_msg(100)   VALUE '即将显示数据,请等待......'.

  PERFORM frm_display_percent USING 100 '正在打开Excel,请等待......' .

  IF NOT gi_document IS INITIAL.
    CALL METHOD gi_document->close_document.
    FREE gi_document.
  ENDIF.
  IF NOT gi_control IS INITIAL.
    CALL METHOD gi_control->destroy_control.
    FREE gi_control.
  ENDIF.


  "创建DOI Control
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = gi_control.

* 创建CONTIANER
  CREATE OBJECT cl_splitter
    EXPORTING
      parent  = cl_gui_container=>screen0
      rows    = 1
      columns = 1.
* 全屏显示
  CALL METHOD cl_splitter->set_border
    EXPORTING
      border = cl_gui_cfw=>false.

  cl_container  = cl_splitter->get_container( row = 1 column = 1 ).

  CALL METHOD gi_control->init_control
    EXPORTING
      r3_application_name      = 'RBasis'
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      parent                   = cl_container "gc_container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'.

* 读取服务器上模板文件
  PERFORM frm_doi_oaor_url USING item_url i_temp_name.  "OAOR里的EXCEL模版url 注:大模版打开可能很慢
  "PERFORM download_template CHANGING item_url.
  "PERFORM frm_doi_get_template USING item_url.

  CALL METHOD gi_control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    IMPORTING
      document_proxy = gi_document
      error          = gi_error.

  "打开excel
  CALL METHOD gi_document->open_document
    EXPORTING
      open_inplace = 'X'
      no_flush     = 'X'
      document_url = item_url
    IMPORTING
      error        = gi_error.

  CALL METHOD gi_document->has_spreadsheet_interface
    EXPORTING
      no_flush     = ''
    IMPORTING
      is_available = has.

  CALL METHOD gi_document->get_spreadsheet_interface
    EXPORTING
      no_flush        = ''
    IMPORTING
      sheet_interface = gi_spreadsheet.

  CALL METHOD gi_document->get_document_handle
    EXPORTING
      no_flush = ''
    IMPORTING
      handle   = gs_handle.

  CALL METHOD gi_error->raise_message
    EXPORTING
      type = 'E'.

  IF gs_handle IS INITIAL.
    MESSAGE '打开EXCEL失败,请删除任务管理器中的Excel进程再执行' TYPE 'S' DISPLAY LIKE 'E'.
    REJECT.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_SHEETS_DATA
*&---------------------------------------------------------------------*
FORM frm_fill_sheets_data .
  DATA: lt_sheets TYPE soi_sheets_table,
        wa_sheet  TYPE soi_sheets.

  CALL METHOD gi_spreadsheet->get_sheets
    IMPORTING
      sheets = lt_sheets.
  "BREAK tuqd.
  LOOP AT lt_sheets INTO wa_sheet.
    CASE wa_sheet-sheet_name.
      WHEN gs_sheet1.
        PERFORM frm_open_sheet  USING wa_sheet-sheet_name.
        PERFORM frm_fill_header_err_message USING wa_sheet-sheet_name 15 35 .
    ENDCASE.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_PERCENT
*&---------------------------------------------------------------------*
FORM frm_display_percent  USING iv_percentage iv_msg.
  DATA lv_text        TYPE string.


  WHILE gv_percentage < iv_percentage.
    gv_percentage = gv_percentage + 1.

    MESSAGE s001(00) WITH gv_percentage '%:' iv_msg INTO lv_text.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        text   = lv_text
      EXCEPTIONS
        OTHERS = 1.

    PERFORM frm_wait_seconds USING '0.01'.
  ENDWHILE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_WAIT_SECONDS
*&---------------------------------------------------------------------*
FORM frm_wait_seconds USING iv_seconds TYPE p.
  DATA lv_runtime1  TYPE i.
  DATA lv_runtime2  TYPE i.
  DATA lv_seconds   TYPE i.

  lv_seconds = iv_seconds * 1000000.
  GET RUN TIME FIELD lv_runtime1.

  WHILE lv_runtime2 - lv_runtime1  < lv_seconds.
    GET RUN TIME FIELD lv_runtime2.
  ENDWHILE.
ENDFORM.

FORM frm_fill_header_err_message USING  sheet_name left top .
  DATA: lt_list TYPE TABLE OF zsfi1009_01 WITH HEADER LINE.

  LOOP AT gt_list INTO gs_list.
    MOVE-CORRESPONDING gs_list TO lt_list.
    APPEND lt_list.
  ENDLOOP.

  PERFORM frm_fill_sheet_data TABLES lt_list USING  gs_temp_name sheet_name  1 2.

ENDFORM.


FORM frm_fill_sheet_data TABLES pt_excel TYPE STANDARD TABLE
                         USING  pv_template TYPE bds_propva
                                pv_sheet_name TYPE soi_sheets-sheet_name
                           pv_left TYPE i
                           pv_top TYPE i.

  DATA  l_iref_error       TYPE REF TO i_oi_error.
  DATA: lt_fields   TYPE STANDARD TABLE OF rfc_fields,
        lv_last_row TYPE i,
        lv_last_col TYPE i,
        lv_retcode  TYPE soi_ret_string.
  DATA lv_info(80).


*  CALL METHOD gi_spreadsheet->select_sheet
*    EXPORTING
*      name  = pv_sheet_name
*    IMPORTING
*      error = l_iref_error.
*
*  CHECK l_iref_error->error_code = c_oi_errors=>ret_ok.
  CLEAR lt_fields.
  CLEAR lt_fields[].

  CHECK pt_excel[] IS NOT INITIAL.
  CALL FUNCTION 'DP_GET_FIELDS_FROM_TABLE'
    TABLES
      data   = pt_excel
      fields = lt_fields.
  lv_last_row = lines( pt_excel ).
  lv_last_col = lines( lt_fields ).

  CALL METHOD gi_spreadsheet->set_selection
    EXPORTING
      left    = pv_left
      top     = pv_top
      rows    = lv_last_row
      columns = lv_last_col.

  CALL METHOD gi_spreadsheet->insert_range
    EXPORTING
      columns = lv_last_col
      rows    = lv_last_row
      name    = pv_template.

  CALL METHOD gi_spreadsheet->insert_one_table
    EXPORTING
      data_table   = pt_excel[]
      fields_table = lt_fields
      rangename    = pv_template
      "no_flush     = 'X'
      wholetable   = 'X'
    IMPORTING
      error        = l_iref_error
      retcode      = lv_retcode.
*==========================================================
  lv_info = '正在填充数据:' && pv_sheet_name.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      text = lv_info.

ENDFORM.


FORM  frm_open_sheet  USING pv_sheet_name TYPE soi_sheets-sheet_name.


  DATA  l_iref_error       TYPE REF TO i_oi_error.
  DATA: lt_fields   TYPE STANDARD TABLE OF rfc_fields,
        lv_last_row TYPE i,
        lv_last_col TYPE i.
  DATA lv_info(80).


  CALL METHOD gi_spreadsheet->select_sheet
    EXPORTING
      name  = pv_sheet_name
    IMPORTING
      error = l_iref_error.

  IF  l_iref_error->error_code <> c_oi_errors=>ret_ok.
    CALL METHOD l_iref_error->raise_message
      EXPORTING
        type = 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOI_OAOR_URL
*&---------------------------------------------------------------------*
FORM frm_doi_oaor_url  USING ev_url i_temp_name.
  DATA lv_classname    TYPE sbdst_classname VALUE 'SOFFICEINTEGRATION'.
  DATA lv_classtype    TYPE sbdst_classtype VALUE 'OT'.
  DATA lv_object_key   TYPE sbdst_object_key VALUE 'ZFI'.
  DATA lcl_instance    TYPE REF TO cl_bds_document_set.
  DATA lt_signature    TYPE sbdst_signature.
  DATA ls_signature    LIKE LINE OF lt_signature.
  DATA lt_components   TYPE sbdst_components.
  DATA lt_uris         TYPE sbdst_uri.
  DATA ls_uris         LIKE LINE OF lt_uris.

  "1.DESCRIPTION 根据描述定位模板   2.BDS_KEYWORD 根据关键字定位模板
  ls_signature-prop_name = 'BDS_KEYWORD'.
  ls_signature-prop_value = i_temp_name. "'ZFIR004'. "EXCEL
  APPEND ls_signature TO lt_signature.

  CREATE OBJECT lcl_instance.

  CALL METHOD lcl_instance->get_info
    EXPORTING
      classname       = lv_classname
      classtype       = lv_classtype
      object_key      = lv_object_key
    CHANGING
      components      = lt_components
      signature       = lt_signature
    EXCEPTIONS
      nothing_found   = 1
      error_kpro      = 2
      internal_error  = 3
      parameter_error = 4
      not_authorized  = 5
      not_allowed     = 6.

  CALL METHOD lcl_instance->get_with_url
    EXPORTING
      classname  = lv_classname
      classtype  = lv_classtype
      object_key = lv_object_key
    CHANGING
      uris       = lt_uris
      signature  = lt_signature.


  DATA lt_table TYPE sbdst_content.
  CALL METHOD lcl_instance->get_with_table
    EXPORTING
      classname  = lv_classname
      classtype  = lv_classtype
      object_key = lv_object_key
    CHANGING
      content    = lt_table
      signature  = lt_signature.

  FREE lcl_instance.
  SORT lt_uris BY doc_count DESCENDING.
  READ TABLE lt_uris INTO ls_uris INDEX 1.

  ev_url = ls_uris-uri.
ENDFORM.
 

相关文章:

  • [HelloCTF]PHPinclude-labs超详细WP-Level 5-http协议-2
  • Mysql:关于命名
  • CPP从入门到入土之类和对象Ⅰ
  • LLM中lora的梯度更新策略公式解析
  • 数据恢复软件有哪些?评测哪款最好用
  • 「清华大学、北京大学」DeepSeek 课件PPT专栏
  • jmeter配件元素
  • 网络编程基础(2)
  • 导出的使用
  • YOLOv11小白的进击之路(九)创新YOLO11损失函数之NWD损失函数源码解读
  • 分布式锁的实现
  • 大数据处理最容易的开源平台
  • 【从零开始学习计算机科学】软件测试(五)白盒测试
  • [K!nd4SUS 2025] Crypto
  • 手写发布订阅模式
  • MySQL使用pxc实现高可用
  • 【软件系统架构】单体架构
  • 突破 HTML 学习瓶颈:表格、列表与表单的学习进度(一)
  • 【Opencv中的Jpeg有损压缩】
  • 功能强大的电脑硬件检测及驱动安装工具
  • 外企聊营商|上海仲裁:化解跨国企业纠纷的“上海路径”
  • 梅花奖在上海|湘剧《夫人如见》竞梅,长沙文旅来沪推广
  • A股三大股指低收:汽车股领涨,大金融走弱,两市成交近1.1万亿元
  • 中国物流集团等10家央企11名领导人员职务任免
  • 巴基斯坦与印度停火延长至18日
  • 上海锦江乐园摩天轮正在拆除中,预计5月底6月初拆完