OLE & DOI {轉載}

提到OLE&DOI,我們不得不先說說兩者這間的關係。

   OLE是SAP早期與微軟Office集成的工具,而DOI是它的替代技術。在實際項目中使用到OLE&DOI的場合多是EXCEL表格的讀入或是填制。有些需要自動畫表格及填數據,有的只是要求在原有的模版上填制數據。根據不同的場合可以選用不同的技術。(有些公司用EXCEL的打印來替代FORM)
   下面主要講一下,OLE&DOI關於EXCEL的處理。
   OLE實際上是類EXCEL中VBA的一種寫法。有一種簡單的方法,就是你可以在EXCEL中把要實現的動作錄製成宏,然後根據宏的代碼把它改成OLE。OLE同時也支持直接調用EXCEL宏程序(沒有禁宏的前提下)。
   DOI完全用類實現。特點是,你不用再去記那些繁瑣的VBA語言了,DOI都給你包裝成類的方法了。同時作爲一個控件,已經集成在了SAP的GUI中了,你就可以在SAP的屏幕中寫Office的東西了,不用再跳出一個窗口來了,減少一些誤操作。當然DOI也是支持調用EXCEL宏程序的,前提是宏沒有被禁。
   兩種方法在實際項目中都有使用,有時候就要看實施顧問擅長於那個了,當然本人還是推薦用新的,但也不要丟了老的(有時候要維護一些老程序或許用得着)。因爲兩種在技術上並沒有什麼難點,只有熟練度的差別。我可記不住那麼多的方法和類名,一般常備兩份模版兩份手冊在身,邊寫邊查,在項目進度之內完工就OK。
   我讀取EXCEL還是比較簡單的,這裏不再講了。既然,EXCEL的填制有自動畫表格和填制模版之分,而自動畫表格,顯然就是什麼都要自己寫,工程量比較大,需要大量的調試(字體、表格寬度、顏色等),沒有什麼捷徑,捧着手冊慢慢寫吧!對於填制模版,那自然要將模版上傳到服務器,程序執行的時候再下載使用。我使用的一般有3中:
  1. FTP
  2. T-code SMW0
  3. T-code OAOR

   FTP顧名思義,就是把文件傳到FTP上,然後在運行的時候,直接輸入文件服務器的路徑,把模版在本地打開填制。

   T-code SMW0。實際上這是用於Web的一種文件存儲,不過我們也可以借用來存儲模版。當然建立之前要維護相應的MIME types(先把文件的類型要註冊),方可上傳此類型的文件。

  DATA:LS_WWWDATATAB TYPE WWWDATATAB,
      LS_PATH TYPE RLGRAP-FILENAME.
  
 CONCATENATE 'c:/SapReport/' 'KEVIN' '.xls' INTO LS_PATH.
  
 LS_WWWDATATAB-RELID = 'MI'.
 LS_WWWDATATAB-OBJID = 'ZKEVIN'.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LS_WWWDATATAB
      DESTINATION = LS_PATH.

  CALL METHOD OF G_WBOOKS 'Open'
        EXPORTING
          #1 = LS_PATH.

   T-code OAOR是將模版傳輸到BDS(Business Document Service),然後程序運行時在本地打開進行填制。老白已經在他的blog中已經寫了,我這裏不再複述。

   DOI和OLE的東西在老白的博客中已經發了很多,大家有興趣可以看看,我添加了一個鏈接。

   下面我放一個能直接跑的OLE。

*----------------------------------------------------------------------*
* Program Name: Z_KEVIN_OLE
* Project     : N/A
* Author      : Kevin.Zhang
* Date        : 2007.1.1
* Module      : N/A
* Description : Template of Program
*
*
*
* Special features: N/A
*
*
*----------------------------------------------------------------------*
* Modifications:
* Author      Date     Commented as  Description
*-----------  --------  -----------  ----------------------------------*
*
*----------------------------------------------------------------------*

REPORT  Z_KEVIN_OLE.
*$*$----------------------------------------------------------------$*$*
*$*$       Global Types, Data Statements, Ranges, Constants         $*$*
*$*$----------------------------------------------------------------$*$*

*-----------------------------------------------------------------------
*                   Type Pools
*-----------------------------------------------------------------------
*--Include for OLE-enabling definitions
INCLUDE OLE2INCL .

*-----------------------------------------------------------------------
*     Global GUI Controls Variables / Structures
*-----------------------------------------------------------------------

*--Data Definition of OLE
DATA: GS_EXCEL TYPE OLE2_OBJECT ,
      GS_WBOOKLIST TYPE OLE2_OBJECT ,
      GS_APPLICATION TYPE OLE2_OBJECT ,
      GS_WBOOK TYPE OLE2_OBJECT ,
      GS_ACTIVESHEET TYPE OLE2_OBJECT ,
      GS_SHEETS TYPE OLE2_OBJECT ,
      GS_NEWSHEET TYPE OLE2_OBJECT ,
      GS_CELL1 TYPE OLE2_OBJECT ,
      GS_CELL2 TYPE OLE2_OBJECT ,
      GS_CELLS TYPE OLE2_OBJECT ,
      GS_RANGE TYPE OLE2_OBJECT ,
      GS_FONT TYPE OLE2_OBJECT ,
      GS_INTERIOR TYPE OLE2_OBJECT ,
      GS_COLUMNS TYPE OLE2_OBJECT ,
      GS_CHARTS TYPE OLE2_OBJECT ,
      GS_CHART TYPE OLE2_OBJECT ,
      GS_CHARTTITLE TYPE OLE2_OBJECT ,
      GS_CHARTTITLECHAR TYPE OLE2_OBJECT ,
      GS_CHARTOBJECTS TYPE OLE2_OBJECT .

DATA GV_SHEET_NAME(20TYPE C .
DATA GV_OUTER_INDEX LIKE SY-INDEX .
DATA GV_INTEX(2TYPE C .
DATA GV_LINE_CNTR TYPE I . "line counter
DATA GV_LINNO TYPE I . "line number
DATA GV_COLNO TYPE I . "column number
DATA GV_VALUE TYPE I . "data
*$*$----------------------------------------------------------------$*$*
*$*$                      Selection Screen                          $*$*
*$*$----------------------------------------------------------------$*$*
*-----------------------------------------------------------------------
*                   Selection Screen
*-----------------------------------------------------------------------
PARAMETERS: P_SHEETS TYPE I .

*$*$----------------------------------------------------------------$*$*
*$*$                          Main Program                          $*$*
*$*$----------------------------------------------------------------$*$*

*--------- START-OF-SELECTION ----------

START-OF-SELECTION .

  DO P_SHEETS TIMES .
*--Forming sheet name
    GV_INTEX = SY-INDEX .
    GV_OUTER_INDEX = SY-INDEX .
    CONCATENATE 'Excel Sheet #' GV_INTEX INTO GV_SHEET_NAME .
*--For the first loop, Excel is initiated and one new sheet is added
    IF SY-INDEX = 1 .
      CREATE OBJECT GS_EXCEL 'EXCEL.APPLICATION' .
      SET PROPERTY OF GS_EXCEL 'Visible' = 1 .
      GET PROPERTY OF GS_EXCEL 'Workbooks' = GS_WBOOKLIST .
      GET PROPERTY OF GS_WBOOKLIST 'Application' = GS_APPLICATION .
      SET PROPERTY OF GS_APPLICATION 'SheetsInNewWorkbook' = 1 .
      CALL METHOD OF GS_WBOOKLIST 'Add' = GS_WBOOK .
      GET PROPERTY OF GS_APPLICATION 'ActiveSheet' = GS_ACTIVESHEET .
      SET PROPERTY OF GS_ACTIVESHEET 'Name' = GV_SHEET_NAME .
*--For the rest of loops, other sheets are added
    ELSE .
      GET PROPERTY OF GS_WBOOK 'Sheets' = GS_SHEETS .
      CALL METHOD OF GS_SHEETS 'Add' = GS_NEWSHEET .
      SET PROPERTY OF GS_NEWSHEET 'Name' = GV_SHEET_NAME .
    ENDIF .

    GV_LINE_CNTR = 1 . "line counter

*--Title
*--Selecting cell area to be merged.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = 1
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = 1
      #2 = 4.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .


*--Merging
    CALL METHOD OF GS_CELLS 'Merge' .

*--Setting title data
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 1.
    SET PROPERTY OF GS_CELL1 'Value' = 'TITLE' .
*--Formatting the title
    GET PROPERTY OF GS_CELL1 'Font' = GS_FONT .
    SET PROPERTY OF GS_FONT 'Underline' = 2 .
    SET PROPERTY OF GS_FONT 'Bold' = 1 .
    SET PROPERTY OF GS_CELL1 'HorizontalAlignment' = -4108 .
    GET PROPERTY OF GS_CELL1 'Interior' = GS_INTERIOR .
    SET PROPERTY OF GS_INTERIOR 'ColorIndex' = 15 .
    SET PROPERTY OF GS_INTERIOR 'Pattern' = -4124 .
    SET PROPERTY OF GS_INTERIOR 'PatternColorIndex' = -4105 .

    GV_LINE_CNTR = GV_LINE_CNTR + 1 .
*--Writing some additional data for the title
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 1.
    SET PROPERTY OF GS_CELL1 'Value' = 'Sheet No' .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 5.
    SET PROPERTY OF GS_CELL1 'Value' = ':' .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 6.
    SET PROPERTY OF GS_CELL1 'Value' = GV_INTEX .
*--Formatting the area of additional data 1
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = 1
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 5.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .
    GET PROPERTY OF GS_CELLS 'Font' = GS_FONT .
    SET PROPERTY OF GS_FONT 'Bold' = 1 .

*--Formatting the area of additional data 2
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = 1
      #2 = 5.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 5.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .
    GET PROPERTY OF GS_CELLS 'Columns' = GS_COLUMNS .
    CALL METHOD OF GS_COLUMNS 'AutoFit' .
*--Bordering title data area
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = 1
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 6.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .
    CALL METHOD OF GS_CELLS 'BorderAround'
    EXPORTING
    #1 = 1 "continuous line
    #2 = 4"thick

*--Putting axis labels
    GV_COLNO = 2 .
    GV_LINE_CNTR = GV_LINE_CNTR + 5 .
    GV_LINNO = GV_LINE_CNTR - 1 .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINNO
      #2 = 1.
    SET PROPERTY OF GS_CELL1 'Value' = 'X' .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 1.
    SET PROPERTY OF GS_CELL1 'Value' = 'Y' .

*--Generating some data
    DO 3 TIMES .
      GV_VALUE = GV_OUTER_INDEX * SY-INDEX * 10 .
      CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
        EXPORTING
        #1 = GV_LINNO
        #2 = GV_COLNO.
      SET PROPERTY OF GS_CELL1 'Value' = SY-INDEX .
      CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
        EXPORTING
        #1 = GV_LINE_CNTR
        #2 = GV_COLNO.
      SET PROPERTY OF GS_CELL1 'Value' = GV_VALUE .
      GV_COLNO = GV_COLNO + 1 .
    ENDDO .
*--Source data area
    GV_COLNO = GV_COLNO - 1 .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINNO
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = GV_COLNO.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .

    GET PROPERTY OF GS_APPLICATION 'Charts' = GS_CHARTS .
    CALL METHOD OF GS_CHARTS 'Add' = GS_CHART .
    CALL METHOD OF GS_CHART 'Activate' .
    SET PROPERTY OF GS_CHART 'ChartType' = '51' . "Vertical bar graph
    CALL METHOD OF GS_CHART 'SetSourceData'
      EXPORTING
      #1 = GS_CELLS
      #2 = 1.
    SET PROPERTY OF GS_CHART 'HasTitle' = 1 .
    GET PROPERTY OF GS_CHART 'ChartTitle' = GS_CHARTTITLE .
    GET PROPERTY OF GS_CHARTTITLE 'Characters' = GS_CHARTTITLECHAR .
    SET PROPERTY OF GS_CHARTTITLECHAR 'Text' = 'Sample Graph' .

*--Locate the chart onto the current worksheet
*--Activate current sheet
    CALL METHOD OF GS_EXCEL 'WorkSheets' = GS_ACTIVESHEET
      EXPORTING
      #1 = GV_SHEET_NAME.
    CALL METHOD OF GS_ACTIVESHEET 'Activate' .
    CALL METHOD OF GS_CHART 'Location'
      EXPORTING
      #1 = 2
      #2 = GV_SHEET_NAME.

*--Reposition the chart on the worksheet (cut&paste)
    CALL METHOD OF GS_ACTIVESHEET 'ChartObjects' = GS_CHARTOBJECTS .
    CALL METHOD OF GS_CHARTOBJECTS 'Select' .
    CALL METHOD OF GS_CHARTOBJECTS 'Cut' .
*--Select new area
    GV_LINE_CNTR = GV_LINE_CNTR + 2 .
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL1
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Cells' = GS_CELL2
      EXPORTING
      #1 = GV_LINE_CNTR
      #2 = 1.
    CALL METHOD OF GS_EXCEL 'Range' = GS_CELLS
      EXPORTING
      #1 = GS_CELL1
      #2 = GS_CELL2.
    CALL METHOD OF GS_CELLS 'Select' .
    CALL METHOD OF GS_ACTIVESHEET 'Paste' .

  ENDDO.

*--Deallocating memory
  FREE: GS_EXCEL, GS_WBOOKLIST, GS_APPLICATION, GS_WBOOK,
  GS_ACTIVESHEET,GS_SHEETS, GS_NEWSHEET, GS_CELL1,
  GS_CELL2, GS_CELLS, GS_RANGE, GS_FONT, GS_INTERIOR,
  GS_COLUMNS, GS_CHARTS, GS_CHART, GS_CHARTTITLE,
  GS_CHARTTITLECHAR, GS_CHARTOBJECTS .

*--------- END-OF-SELECTION ----------

 

轉自: http://blog.chinaunix.net/u1/59700/showart_1089737.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章