DOI成功的例子

来源:互联网 发布:shop域名注册 编辑:程序博客网 时间:2024/04/29 08:33
************************************************************************
**  声明数据库表 Declaration of database                              **
************************************************************************
TABLES:mara.     "物料主数据

************************************************************************
**  定义结构类型 Define the structure's type                          **
************************************************************************
*     结果内表结构
TYPES:BEGIN OF typ_result,
        matnr TYPE matnr,      "物料编号
        werks TYPE werks_d,    "工厂
        lgort TYPE lgort_d,    "库存地点
        charg TYPE charg_d,    "批次
        box   TYPE c,
      END OF typ_result.

************************************************************************
**  定义变量与内表 Define the variants and Internal tables            **
************************************************************************
DATA:gt_result TYPE TABLE OF typ_result WITH HEADER LINE.     "结果内表

*@---------------------------------------------------------------------*
*调用相关对象使用的变量***********固定的
TYPE-POOLS:vrmsbdstsoi.
*     定位EXCEL的单元格,
TYPES:BEGIN OF typ_excel,
        row   TYPE kcd_ex_row_n,
        col   TYPE kcd_ex_col_n,
        value TYPE char50,
      END OF typ_excel.
DATA:gt_tabcontent TYPE TABLE OF typ_excel.
DATA:wa_tabcontent TYPE typ_excel.

TYPEStyp_url LIKE bapiuri-uri.
TYPESBEGIN OF typ_docu_descr,
          document_name(40),
          document_id(64),
       END OF typ_docu_descr.

TYPES:BEGIN OF typ_area_excel,
        areano(2TYPE n,
        tabcontent LIKE gt_tabcontent,
      END OF typ_area_excel.
* SAP Desktop Office Integration Interfaces
DATAcl_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 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:gt_itab     TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
     gt_imt_tab  TYPE TABLE OF typ_area_excel,
     wa_imt_tab  LIKE LINE OF gt_imt_tab,
     g_macro     TYPE text100,
     g_sheet(10TYPE c,
     g_cell_fit  TYPE c.

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,
     gt_applist TYPE vrm_values,
     g_excel    TYPE text80 VALUE 'Excel.Sheet',       "EXCEL的表单
     g_docu_type TYPE text80,
     g_url(256)  TYPE c,
     g_has_activex TYPE c,
     g_col TYPE i,         "字段所在的列数
     g_row TYPE i.         "字段所在的行数
*以下三个值为Tcode:OAOR里面新建模板文件的参数
DATAg_classname  TYPE sbdst_classname VALUE 'HRFPM_EXCEL_STANDARD',
      g_classtype  TYPE sbdst_classtype VALUE 'OT',
      g_object_key TYPE sbdst_object_key VALUE 'ZMB51_FZ'.
************************************************************************
**  宏定义 Define the macro                                           **
************************************************************************
DEFINE m_value.
  clear &1.
  &1-key &2.
  &1-text &3.
  append &1.
  CLEAR &1.
END-OF-DEFINITION.
* 将数据对应到EXCEL的单元格,并添加到内表中
DEFINE m_excel_cell.
  clear wa_tabcontent.
  g_col g_col + 1.
  wa_tabcontent-row  g_row.
  wa_tabcontent-col  g_col.
  wa_tabcontent-value &1.
  shift wa_tabcontent-value left deleting leading space.
  append wa_tabcontent to gt_tabcontent.
  CLEAR wa_tabcontent.
END-OF-DEFINITION.
************************************************************************
**  选择屏幕 Customize the selection-screen                           **
************************************************************************
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.
************************************************************************
**  执行程序事件 Executing the program's events                       **
************************************************************************
INITIALIZATION.

START-OF-SELECTION.
  PERFORM sub_query_mara.

END-OF-SELECTION.
  PERFORM sub_process_excel.
  CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*&      Form  sub_query_mara
*&---------------------------------------------------------------------*
*       从物料主数据表MARA中取数
*----------------------------------------------------------------------*
FORM sub_query_mara .
* 取物料主数据
  SELECT matnr
      FROM mara
      INTO CORRESPONDING FIELDS OF TABLE gt_result
      WHERE matnr IN s_matnr.
ENDFORM.                    " sub_query_mara
************************************************************************
** Dialog Modules PBO and PAI
************************************************************************
MODULE status_0100 OUTPUT.
  DATAwa_tab TYPE typ_area_excel.
  DATAits_tab TYPE TABLE OF typ_excel.

  SET PF-STATUS 'XAVERY_HSUEH'.
  SET TITLEBAR 'TIT_100' WITH '活动界面示例'.

  PERFORM sub_create_basic_object.

  LOOP AT gt_imt_tab INTO wa_tab.
    REFRESH gt_itab.
    gt_itab[] wa_tab-tabcontent[].
    PERFORM sub_set_cell.
  ENDLOOP.
  IF g_cell_fit 'X'.
    CALL METHOD cl_spreadsheet->fit_widest
      EXPORTING
        name     space
        no_flush 'X'.
  ENDIF.
* 修改WORK SHEET 的名字
  CALL METHOD cl_spreadsheet->set_sheet_name
    EXPORTING
      newname '无聊主数据清单'
      oldname 'Sheet1'
    IMPORTING
      error   cl_errors.
* 宏执行
  IF NOT g_macro IS INITIAL.
*    CALL METHOD DOCUMENT->EXECUTE_MACRO
*      EXPORTING
*        g_macro = g_macro
**      SCRIPT_NAME  = 'Open_text'
**      NO_FLUSH     = ' '
*      IMPORTING
*        cl_error        = cl_errorS.
**    CALL METHOD C_OI_ERRORS=>SHOW_MESSAGE
**      EXPORTING
**        TYPE = 'E'.
*    APPEND cl_errorS.
  ENDIF.
ENDMODULE.                    "status_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Dialog Modules PAI
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  LEAVE TO SCREEN 0.
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 occured
  CALL METHOD cl_error->raise_message
    EXPORTING
      type 'E'.
* 创建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_containerrow column ).
* 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'                   "#EC NOTEXT
      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 'PP_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" WHERE uri CP '*ZSDR17.xls*'.
    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.
*      STARTUP_MACRO = g_macro.
  DATAhas 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
  g_sheet '物料'.
  DATAg_def_active_sheetname(50VALUE 'REPORT'.
  CALL METHOD cl_spreadsheet->select_sheet
    EXPORTING
      name  g_sheet
    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 sub_set_cell .
  DATA:  i_top TYPE ii_left TYPE i,
             i_rows TYPE ii_cols TYPE i,
             t_row TYPE it_col TYPE i,
             s_row TYPE is_col TYPE i.
  SORT gt_itab BY row col.
  READ TABLE gt_itab INDEX 1.
  IF sy-subrc 0.
    MOVE gt_itab-row TO  i_top.
    MOVE gt_itab-col  TO  i_left.
  ENDIF.
  SORT gt_itab BY row DESCENDING col DESCENDING.
  READ TABLE gt_itab INDEX 1.
  IF sy-subrc 0.
    i_rows gt_itab-row i_top + 1.
    i_cols gt_itab-col i_left + 1.
  ENDIF.
  SORT gt_itab BY row col.
  CALL METHOD cl_spreadsheet->insert_range_dim
    EXPORTING
      name     'cell'
      no_flush 'X'
      top      i_top
      left     i_left
      rows     i_rows
      columns  i_cols
    IMPORTING
      error    cl_errors.
  APPEND cl_errors.
  REFRESH gt_ranges.
  wa_rangeitem-name 'cell'.
  wa_rangeitem-columns i_cols.
  wa_rangeitem-rows i_rows.
  wa_rangeitem-code 4.
  APPEND wa_rangeitem TO gt_ranges.
  PERFORM sub_fill_blank USING i_top i_left i_rows i_cols .
  REFRESH gt_excel_input.
  REFRESH gt_excel_format.
  LOOP AT gt_itab.
    wa_excel_input-column gt_itab-col i_left + 1.
    wa_excel_input-row gt_itab-row i_top + 1.
    MOVE gt_itab-value TO wa_excel_input-value.
*    CONDENSE  wa_excel_input-value  NO-GAPS.
    APPEND wa_excel_input TO gt_excel_input.
  ENDLOOP.
* set data
  CALL METHOD cl_spreadsheet->set_ranges_data
    EXPORTING
      ranges   gt_ranges
      contents gt_excel_input
*      UPDATING = '1'
      no_flush 'X'
    IMPORTING
      error    cl_errors.
  APPEND cl_errors.
*  设置 FRAME.给输出的数据加上边框,不加的话就没有边框
  IF wa_tab-areano NE 1.
    CALL METHOD cl_spreadsheet->set_frame
      EXPORTING
        rangename 'cell'
        typ       '127'
        color     '1'
        no_flush  'X'
      IMPORTING
        error     cl_errors.
  ENDIF.
ENDFORM.                    " SUB_SET_CELL
*&---------------------------------------------------------------------*
*&      Form  SUB_FILL_BLANK
*&---------------------------------------------------------------------*
*       将数据填充到 EXCEL 表中
*----------------------------------------------------------------------*
FORM sub_fill_blank  USING  i_top  TYPE i
                            i_left TYPE i
                            i_rows TYPE i
                            i_cols TYPE .
  DATAinx_col(4TYPE n,
        inx_row(4TYPE n.
  DATABEGIN OF it_row OCCURS 0,
         row(4TYPE n,
        END OF it_row.
  MOVE i_top TO inx_row.
  DO i_rows TIMES.
    MOVE i_left TO inx_col.
    DO i_cols TIMES.
      READ TABLE gt_itab WITH KEY row inx_row
                               col inx_col.
      IF sy-subrc <> 0.
        MOVE inx_row TO gt_itab-row.
        MOVE inx_col TO gt_itab-col.
        MOVE ''      TO gt_itab-value.
        APPEND gt_itab.
      ENDIF.
      ADD TO inx_col.
    ENDDO.
    ADD TO inx_row.
  ENDDO.
  SORT gt_itab BY row col.
ENDFORM.                    " SUB_FILL_BLANK
*&---------------------------------------------------------------------*
*&      Form  sub_process_excel
*&---------------------------------------------------------------------*
*       处理结果内表
*----------------------------------------------------------------------*
FORM sub_process_excel .
  g_row 2."控制行的选择,比如无聊选择23的时候,出来的23紧挨着物料下面
  CLEAR g_col.
* 将数据添充到EXCEL内表中
  REFRESH gt_tabcontent.
  LOOP AT gt_result.
    g_col 1."(加上了这个会使出来的数据从第二列开始)
    m_excel_cell   gt_result-matnr.
    m_excel_cell   gt_result-werks.
    m_excel_cell   gt_result-lgort.
    m_excel_cell   gt_result-charg.
    g_row g_row + 1.
  ENDLOOP.
  wa_imt_tab-areano 2"控制外面的框框
  wa_imt_tab-tabcontent gt_tabcontent.
  APPEND wa_imt_tab TO gt_imt_tab.

*  g_col = 1.                 (相当于是个页码的概念,始终在下面)
*  m_excel_cell   '执行日期'.
*  m_excel_cell   sy-datum.
*  m_excel_cell   '登录用户'.
*  m_excel_cell   sy-uname.
*  wa_imt_tab-areano = 1.
*  wa_imt_tab-tabcontent = gt_tabcontent.
*  APPEND wa_imt_tab TO gt_imt_tab.
  CLEAR wa_imt_tab.
ENDFORM.                    " sub_process_excel
0 0
原创粉丝点击