SAP DOI

2024-03-07 16:30
文章标签 sap doi

本文主要是介绍SAP DOI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OLE是SAP早期的Office集成的工具,而DOI是它的替代技术。

首先将 Excel 模板文档放在应用程序服务器上,然后开发代码 调用DOI 打开这个文档,对文档进行操作和处理。        

1: OAOR 上载EXCEL 模板

上载时注意,类名称和对象代码,后面代码要用它定位你上载的文件

 

 

 

2:写程序:

 1)创建屏幕:0100,并激活之

 

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.

2:创建PF-STATUS ,并分配OKOCDE和USER_COMMAND_0100匹配

  SET PF-STATUS 'SA1'.

 

*&---------------------------------------------------------------------*
*& Report ZTEST_DOI01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_doi01.

TABLES:mara.

TYPE-POOLS:vrm, sbdst, soi.

* SAP Desktop Office Integration Interfaces
DATA: cl_container   TYPE REF TO cl_gui_container,
      cl_splitter    TYPE REF TO cl_gui_splitter_container,
      cl_control     TYPE REF TO i_oi_container_control,
      cl_docu_proxy  TYPE REF TO i_oi_document_proxy,
      cl_spreadsheet TYPE REF TO i_oi_spreadsheet,
      cl_error       TYPE REF TO i_oi_error,
      cl_errors      TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.

* spreadsheet interface structures for Excel data input
DATA:wa_cellitem     TYPE soi_generic_item,
     wa_rangeitem    TYPE soi_range_item,
     gt_ranges       TYPE soi_range_list,
     gt_excel_input  TYPE soi_generic_table,
     wa_excel_input  TYPE soi_generic_item,
     g_initialized   TYPE c,
     g_retcode       TYPE soi_ret_string,
     gt_excel_format TYPE soi_format_table,
     wa_format       LIKE LINE OF gt_excel_format.


DATA:cl_bds_instance   TYPE REF TO  cl_bds_document_set,
     gt_doc_signature  TYPE         sbdst_signature,
     wa_doc_signature  LIKE LINE OF gt_doc_signature,
     gt_doc_components TYPE         sbdst_components,
     gt_doc_uris       TYPE         sbdst_uri,
     wa_doc_uris       LIKE LINE OF gt_doc_uris.

DATA:g_app         TYPE vrm_id,
     val(50),
     g_url(256)    TYPE c,
     g_has_activex TYPE c,
     g_excel       TYPE text80 VALUE 'Excel.Sheet',
     g_docu_type   TYPE text80.

*the following variable is from screen 100
DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
*output internal table

DATA: BEGIN OF itab OCCURS 0.
        INCLUDE STRUCTURE makt.
      DATA: END   OF itab.

*Please import template file "ztest_doi1" to sap using Tcode:OAOR
DATA: g_classname  TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD', "SOFFICEINTEGRATION',
      g_classtype  TYPE sbdst_classtype VALUE 'OT',
      g_object_key TYPE sbdst_object_key VALUE 'DEMO_DOI'.         "variable
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:  s_matnr FOR mara-matnr MEMORY ID mat.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************

INITIALIZATION.

START-OF-SELECTION.
  PERFORM get_data.

END-OF-SELECTION.

  CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*&      Form  sub_query_mara
*&---------------------------------------------------------------------*
*       从物料主数据表MARA中取数
*----------------------------------------------------------------------*
FORM get_data .
  SELECT *
    FROM makt UP TO 5 ROWS
    INTO TABLE itab
   WHERE makt~matnr IN s_matnr.
  MOVE '10999999' TO itab-matnr.
  APPEND itab.
ENDFORM.                    " sub_query_mara
************************************************************************
** Dialog Modules PBO and PAI
************************************************************************
MODULE status_0100 OUTPUT.

  SET PF-STATUS 'SA1'.
  PERFORM sub_create_basic_object.
  PERFORM output_to_excel.
ENDMODULE.                    "status_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Dialog Modules PAI
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'STOP' .
      IF NOT cl_docu_proxy IS INITIAL.
        CALL METHOD cl_docu_proxy->close_document.
        FREE cl_docu_proxy.
      ENDIF.
      IF NOT cl_control IS INITIAL.
        CALL METHOD cl_control->destroy_control.
        FREE cl_control.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'BACK' .
      IF NOT cl_docu_proxy IS INITIAL.
        CALL METHOD cl_docu_proxy->close_document.
        FREE cl_docu_proxy.
      ENDIF.
      IF NOT cl_control IS INITIAL.
        CALL METHOD cl_control->destroy_control.
        FREE cl_control.
      ENDIF.

      SET SCREEN 0.  " quit the program
      "set screen 1000.
  ENDCASE.
ENDMODULE.                    "USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*&      Form  SUB_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
*       创建相关的对象
*----------------------------------------------------------------------*
FORM sub_create_basic_object .
  CHECK g_initialized IS INITIAL.

  CALL FUNCTION 'GUI_HAS_ACTIVEX'
    IMPORTING
      return = g_has_activex.
  IF g_has_activex IS INITIAL.
    MESSAGE e007(demoofficeintegratio).
  ENDIF.
* first get the SAP DOI i_oi_container_control interface
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = cl_control
      error   = cl_error.
* check no errors occur
  CALL METHOD cl_error->raise_message
    EXPORTING
      type = 'E'.
* create container
  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 ).
* initialize the SAP DOI Container, tell it to run in the container
* specified above and tell it to run Excel in-place
  CALL METHOD cl_control->init_control
    EXPORTING
      r3_application_name      = 'RBasis'
      inplace_enabled          = 'X'
      inplace_scroll_documents = 'X'
      parent                   = cl_container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'
    IMPORTING
      error                    = cl_errors.
* save error object in collection
  APPEND cl_errors.
  CALL METHOD cl_gui_cfw=>dispatch.

  wa_doc_signature-prop_name = 'DESCRIPTION'.
  g_app = 'excel'.                                       "
  IF g_app = 'excel'.
    g_docu_type = g_excel.
    wa_doc_signature-prop_value = 'Prop_REPORT'.
  ELSE.
  ENDIF.
  APPEND wa_doc_signature TO gt_doc_signature.
  CREATE OBJECT cl_bds_instance.
  CALL METHOD cl_bds_instance->get_info
    EXPORTING
      classname       = g_classname
      classtype       = g_classtype
      object_key      = g_object_key
    CHANGING
      components      = gt_doc_components
      signature       = gt_doc_signature
    EXCEPTIONS
      nothing_found   = 1
      error_kpro      = 2
      internal_error  = 3
      parameter_error = 4
      not_authorized  = 5
      not_allowed     = 6.

  CALL METHOD cl_bds_instance->get_with_url
    EXPORTING
      classname  = g_classname
      classtype  = g_classtype
      object_key = g_object_key
    CHANGING
      uris       = gt_doc_uris
      signature  = gt_doc_signature.

  FREE cl_bds_instance.
* ask the SAP DOI container for a i_oi_document_proxy for Excel
  CALL METHOD cl_control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
*     REGISTER_CONTAINER = 'X'
    IMPORTING
      document_proxy = cl_docu_proxy
      error          = cl_errors.
  APPEND cl_errors.
* open a document saved in business document service.
*  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
  LOOP AT gt_doc_uris INTO wa_doc_uris.
    g_url = wa_doc_uris-uri.
  ENDLOOP.

  CALL METHOD cl_docu_proxy->open_document
    EXPORTING
      open_inplace = 'X'
*     NO_FLUSH     = 'X'
      document_url = g_url
    IMPORTING
      error        = cl_errors.

  DATA: has TYPE i.
  CALL METHOD cl_docu_proxy->has_spreadsheet_interface
    EXPORTING
      no_flush     = 'X'
    IMPORTING
      is_available = has
      error        = cl_errors.
  APPEND cl_errors.

  CALL METHOD cl_docu_proxy->get_spreadsheet_interface
    EXPORTING
      no_flush        = 'X'
    IMPORTING
      sheet_interface = cl_spreadsheet
      error           = cl_errors.
  APPEND cl_errors.
* Activate  sheet 1

  DATA: g_def_active_sheetname(50) VALUE 'Sheet1'.

  CALL METHOD cl_spreadsheet->select_sheet
    EXPORTING
      name     = g_def_active_sheetname
      no_flush = ''
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.
  LOOP AT cl_errors.
    CALL METHOD cl_errors->raise_message
      EXPORTING
        type = 'E'.
  ENDLOOP.
  FREE cl_errors.
  g_initialized = 'X'.
ENDFORM.                    " FRM_CREATE_BASIC_OBJECT
*&---------------------------------------------------------------------*
*&      Form  SUB_SET_CELL
*&---------------------------------------------------------------------*
*       根据数据设置 EXCEL 表的属性
*----------------------------------------------------------------------*
FORM fill_cell  USING i j val..
  DATA: columns_number TYPE i,
        rows_number    TYPE i.

  columns_number = 1.
  rows_number = 1.

  CALL METHOD cl_spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = i
      left     = j
      rows     = rows_number
      columns  = columns_number
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.

  REFRESH: gt_ranges, gt_excel_input.
  wa_rangeitem-name = 'cell'.
  wa_rangeitem-columns = 1.
  wa_rangeitem-rows = 1.
  APPEND wa_rangeitem TO gt_ranges.

  wa_excel_input-column = 1.
  wa_excel_input-row = 1.
  wa_excel_input-value = val.
  APPEND wa_excel_input TO gt_excel_input.

* set data
  CALL METHOD cl_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_excel_input
      no_flush = 'X'
    IMPORTING
      error    = cl_errors.
  APPEND cl_errors.
*  set FRAME.
  CALL METHOD cl_spreadsheet->set_frame
    EXPORTING
      rangename = 'cell'
      typ       = '127'
      color     = '1'
      no_flush  = 'X'
    IMPORTING
      error     = cl_errors.
* ??
  CALL METHOD cl_spreadsheet->fit_widest
    EXPORTING
      name     = space
      no_flush = 'X'.

  REFRESH: gt_ranges, gt_excel_input.
ENDFORM.                    " SUB_SET_CELL

*&---------------------------------------------------------------------*
*&      Form  sub_process_excel
*&---------------------------------------------------------------------*
*       处理结果内表
*----------------------------------------------------------------------*
FORM output_to_excel .
  DATA num TYPE i VALUE 1.
*&test info
  PERFORM fill_cell USING 3 1 'May 2012'.
  PERFORM fill_cell USING 3 2 'July 2012'.

  LOOP AT itab.
    num = 3 + sy-tabix.
    PERFORM fill_cell USING num 1 itab-matnr.
    PERFORM fill_cell USING num 2 itab-maktx.
    PERFORM fill_cell USING num 3 itab-maktg.

  ENDLOOP.
*&test info
  PERFORM fill_cell USING 15 1 '轿车'.
  PERFORM fill_cell USING 16 1 '卡车'.
  PERFORM fill_cell USING 17 1 '自行车'.
  PERFORM fill_cell USING 15 2 '67'.
  PERFORM fill_cell USING 16 2 '89'.
  PERFORM fill_cell USING 17 2 '12'.

* change the name of worksheet "sheet1"
  CALL METHOD cl_spreadsheet->set_sheet_name
    EXPORTING
      newname = '物料主数据清单'
      oldname = 'Sheet1'
    IMPORTING
      error   = cl_errors.
* activate worksheet
  CALL METHOD cl_spreadsheet->select_sheet
    EXPORTING
      name  = 'Sheet2'
    IMPORTING
      error = cl_errors.
  APPEND cl_errors.
* run macro
  CALL METHOD cl_docu_proxy->execute_macro
    EXPORTING
*     SCRIPT_NAME  = 'test1'
      macro_string = '模块1.test1'
*     param1       = ''
*     param_count  = 1
    IMPORTING
      error        = cl_errors.

ENDFORM.                    " sub_process_excel

*CALL METHOD spreadsheet->set_format_string
*EXPORTING rangename = rangename
*formatstring = formatstring
*no_flush = no_flush
*IMPORTING error = error
*retcode = retcode.
*
*formatstring = '0.00_ ;[红色]-0.00'
*or  formatstring = '0.00_ ;[RED]-0.00'

这篇关于SAP DOI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784133

相关文章

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录,BTP集成开发环境的搭建这方面。 目录 1,账号注册 2,BTP登录URL 3,如何在BTP上进行开发? 以下是详细内容。 1,账

SAP项目中沟通的几点总结

最近参与的公司SAP RISE项目,由于是国际项目,全程远程实施,所以沟通显得尤为重要,有几点总结跟大家分享。   1.     提前沟通 提前沟通比事后沟通效果好太多。作为项目管理者,需要把下一步的计划等信息提前通过一定的形式(会议、邮件、Teams Channel等)传播出去。而不是等着这个事情发生了,项目组成员来询问,一方面这样很浪费时间,也会对项目进队产生影响,所以作为项目管理者永

SMIDI-SAP接口配置手册

目录 一、 SAPERP相关接口配置(必要条件) 1. SAP ERP 配置 1.1 配置

SAP HCM 如何计算缺勤实数

导读 INTRODUCTION 缺勤实数:这几天好几个朋友问题有什么办法可以计算出缺勤的时长,因为计算时长需要和排班去匹配,所以逻辑复杂度还是比较高的,希望有标准的函数能完成。其实SAP有个标准的函数可以完成,复杂的时候填充的参数特别多,所以今天介绍一个函数PA30保存2001的时候会调用,这样可以知道标准参数需要填充什么值。 作者:vivi,来源:osinnovation。 一、具体函数

SAP MM模块与FI模块集成之科目配置

1. 定义评估范围 OMWD   评估范围设置在工厂层,那么系统自动建立和工厂具有相同ID的评估范围 IMG:物料管理>评估和科目设置>科目确定>无向导的科目确定>将评估范围群集分组 提示:评估层级——评估分组代码——评估范围。 2. OBYC-BSX(存货科目) IMG:物料管理->评估和科目设置->科目确定->无向导的科目确定->配置自动记帐 双击BSX,输入科目表。

SAP MPS (主生产计划) 与 MRP (物料需求计划) 简介

SAP MPS 主生产计划 与 MRP 物料需求计划 简介 SAP 主生产计划 (MPS):SAP 物料需求计划 (MRP):MPS 与 MRP 的区别:业务场景前台操作演示1、物料主数据准备2、创建销售订单---VA013、运行MPS---MD404、查看物料需求---MD045、运行MRP---MD026、查看需求---MD047、总结 SAP 主生产计划 (MPS): M

SAP 快速输入

进入SM30,输入TPARA  确定   会生成CR号 之后再重新保存,反复确认下。 程序里加上MEMORY ID PARAMETERS pname_1 LIKE suid_st_bname-bname MEMORY ID zpname1 . "签核PARAMETERS pname_2 LIKE suid_st_bname-bname MEMORY ID zpname2

SAP CN22释放物料的可用性的操作方法

SAP PS系统,CN22要释放网络的可用性(直发物料号的需求), 必输要操作路径正确,或者操作的界面正确,否则保存后无法释放可用性。 先进入作业一览 然后进入作业的组件,对网络赋值的界面, 然后选中组建,再使用可用性-复位 然后保存即可。 只有在这个网络,对作业赋值的界面操作,才能释放可用性分配。 其他情况下,均不会生效。

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP? CAP(Cloud Application Programming)是SAP推出的一种现代化开发框架,旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术,如Node.js、Java、OData和SQL,提供了一套工具和库,帮助开发人员快速构建、扩展和运行企业级应用。 1.2 CAP的基础技术框架 CAP框架主要由以下几个部分组成:

SAP物料分类帐差异分摊原理

物料分类帐差异分摊原理 首先明确一点,无论是否使用物料分类帐,只要系统使用了标准价格甚至移动平均价,发生业务时都有可能产生差异。简单的说,物料分类帐不会对差异的产生造成影响,物料分类帐真正的作用是规范了差异的分摊,并利用分摊的结果,计算物料的实际成本 差异类别 在讲述差异分摊的原理之前,首先需要介绍的是差异的类别,物料分类帐中,差异分为两类:单层差异、多层差异。 简单的讲,单层差异就是物料