美文网首页ABAP
ABAP DOI详解(1)

ABAP DOI详解(1)

作者: Stone0823 | 来源:发表于2016-12-16 14:17 被阅读821次

    什么是DOI

    DOI是Desktop Office Integration的缩写,,是SAP提供的解决与Office集成的开发技术。早期SAP用于解决Office集成,使用的是OLE技术。OLE有两个比较大的缺点,一是语法参照VBA,在ABAP中使用各种VBA的方法(method),语法的友好性差;二是数据写入到Excel中,速度特别慢,慢得难以接受。
    DOI是SAP提供的OLE的替代品,用面向对象的方式实现。很好的解决了上面所说的两个问题。

    请参考:Desktop Office Integration官方帮助

    DOI开发的要点

    涉及的关对象

    SAP和Office集成,可以通过代码创建Excel文档,也可以将Excel模板文档放在应用程序服务器上。DOI打开这个文档,然后对文档进行操作。我们先介绍创建Excel文档的方式。

    为了操作Excel文档,至少需要四个对象:

    • container: 存放excel电子表格(spreadsheet)的容器。这个开发人员应该比较容易理解,展示spreadsheet肯定需要一个容器来存放。这个容器一般在dialog screen中定义,也可以直接使用ABAP程序默认的screen(即screen号码为1000的屏幕)

    • container control: 容器中用于创建和管理其他Office集成所需要的对象。container control是一个接口,类型是i_oi_container_control

    • document proxy: 每一个document proxy的实例代表用office application打开的文档,可以是excel,也可以是word。如果想打开多个文档,需要定义多个实例。document proxy是一个接口,类型为i_oi_document_proxy

    • spreadsheet: spreadsheet接口,代表最终要操作的excel文档。spreadhseet的类型是i_oi_spreadsheet

    如果读取服务器上的文档模板,需要cl_bds_document_set类:

    • business document set: bds是business document set的缩写。business document set用于管理后续要操作的文档,可以包含一个或多个文档。

    DOI操作文档的步骤

    • 获取container
    • 创建container control对象实例并初始化
    • 创建document proxy对象的实例
    • 打开一个服务器上的模板文档或新建一个excel文档
    • 操作excel文档,设置excel的属性
    • 退出时关闭excel文档,释放资源

    我们的第一个例子,不使用dialog screen,新建一个excel文档,在屏幕1000中显示。

    开始编码

    定义公共变量

    * desktop office integration interface
    data: gr_container type ref to cl_gui_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.
    

    这些就是我们前面提到的四个必须的对象。

    获取container

    cl_gui_container类的静态方法screen0获取屏幕1000,并赋值给gr_container。

    form get_container.
      gr_container = gr_container = cl_gui_container=>screen0.
    endform.                    "get_container
    

    创建container control对象实例并初始化

    form create_container_control.
    * 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 demo by Stone Wang'
          parent                   = gr_container.
    endform.   
    

    代码比较直观,不多说。

    创建document proxy对象的实例

    form create_excel_document.
      call method gr_control->get_document_proxy
        exporting
          document_type  = 'Excel.Sheet'
          no_flush       = 'X'
        importing
          document_proxy = gr_document.
    
      call method gr_document->create_document
        exporting
          document_title = 'DOI test by Stone Wang '
          no_flush       = 'X '
          open_inplace   = 'X'.
    endform.                    "create_excel_document
    

    open_inplace参数控制excel文档是独立显示还是在SAP GUI中嵌入显示。如果嵌入显示,gr_control的init_control方法中,inplace_enabled参数要设为X

    将以上代码综合在一起:

    form main.
      skip 1.
    
      perform get_container.
      perform create_container_control.
      perform create_excel_document.
    endform.
    

    注意第一句skip 1必须,否则不能创建屏幕。

    完整代码

    report  zdoi_hello.
    
    type-pools: soi.
    
    data: gr_container type ref to cl_gui_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.
    
    start-of-selection.
      perform main.
    
    form get_container.
      gr_container = gr_container = cl_gui_container=>screen0.
    endform.                    "get_container
    
    form create_container_control.
    * 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 demo by Stone Wang'
          parent                   = gr_container.
    endform.                    "create_container_control
    
    form create_excel_document.
      call method gr_control->get_document_proxy
        exporting
          document_type  = 'Excel.Sheet'
          no_flush       = 'X'
        importing
          document_proxy = gr_document.
    
      call method gr_document->create_document
        exporting
          document_title = 'DOI test by Stone Wang '
          no_flush       = 'X '
          open_inplace   = 'X'.
    endform.                    "create_excel_document
    
    form main.
      skip 1.
    
      perform get_container.
      perform create_container_control.
      perform create_excel_document.
    endform.
    

    操作excel文档以及获取模板文档放在下一节,以降低学习和理解的难度。

    相关文章

      网友评论

        本文标题:ABAP DOI详解(1)

        本文链接:https://www.haomeiwen.com/subject/ycjnmttx.html