一、概述
使用者SAP系統整合時,只能通過程式資料集或者是 ETL 工具進行取數,實現起來非常麻煩。
安裝該插件後,在FineReport8.0 及後續版本中,可在伺服器資料連線處新增資料連線型別 SAP 資料連線,在資料集中新增 SAP 資料集型別。
與 SAP 系統進行連線,需要匯入 SAP API包和本地庫,並確保執行的 JVM 能夠找到API包和本地庫。
插件安裝方式,可參考A11-18伺服器-插件管理。
二、環境準備
1
Windows系統伺服器。
如果資料連線失敗,可以嘗試將 sapjco3.dll 檔案放置在系統 jre 的 bin 目錄下,例如:%JAVA_HOME%\jre\bin。
Windows Server 2003 和 Windows XP 的系統在連線 SAP 時,需要下載安裝 Microsoft Visual C++ 2005 SP1。
2
Mac OS系統伺服器。
將驅動檔案解壓後放置在…/FineReport/lib下。
開啟設計器 bin 目錄,右擊designer,選擇顯示包內容,開啟 vmoptions.txt 檔案,在檔案中寫入:-Djava.library.path=/Applications/FineReport10.0/lib(所放置的檔案路徑)。

libsapjco3.zip
3
Linux系統伺服器。
JDK位數
| 檔案包 | SAP檔案匯入位置 |
---|
32位 | sapjco3_linux_32bit.rar
| sapjco3.jar 放在%TOMCAT_HOME%\lib路徑下 libsapjco3.so 放在%JAVA_HOME%\jre\bin路徑下 libsapjco3.so 放在usr\lib資料夾下,若 Linux 為 64 位,放到usr\lib64路徑下 |
64位 | sapjco3_linux_64bit.rar
| sapjco3.jar 放在%TOMCAT_HOME%\lib路徑下 libsapjco3.so 放在%JAVA_HOME%\jre\bin路徑下 libsapjco3.so 放在usr\lib64路徑下 |
4
本地設計器。
根據安裝的設計器位數,下載 Windows 系統下對應位數的 JDK1.6 版本的 SAP 檔案包。
三、屬性設定-新增資料集
1
新增SAP資料連結。
點選【伺服器】→【定義資料連結】→【+】,選擇【SAP】。
輸入資料庫連結資訊,點選【測試連結】,連結成功後點擊確定即可。

2
連結資訊說明。
【主機名】區域網中已配置的 SAP 的主機名稱,也可以寫此機器的 IP 地址,不是資料庫伺服器的主機名。
【SAP系統名】SAP 系統中設定的屬性,用於互動的埠號,一般來說是 00。
【客戶端】SAP 系統管理的業務和資料的最大有效集合,也是 SAP 系統的一個屬性。
【使用者】連線 SAP 時使用的賬號的使用者名稱,不是資料庫使用者名稱。
【密碼】連線 SAP 時使用的賬號的密碼,不是資料庫密碼。
【連結池屬性】SAP 系統中的容量和最大連結數。

3
新增SAP資料集。
在範本資料集設定處,點選【+】按鈕,選擇【SAP資料集】,進入SAP資料集配置介面。
資料集名稱可自訂修改。
SAP取數有三種方式:自訂、簡單通用查詢和通用查詢。
【自訂】取數就是直接呼叫 ABAP Function 獲取資料。
【簡單通用查詢】取數是通過 open SQL 語句,從某張表中讀取出某些欄,並列出資料需要滿足的一些條件。
【通用查詢】取數較之簡單通用查詢,增加了表間關聯的能力,支援多表查詢。
點選【
】按鈕,可預覽資料集。

四、屬性設定-自訂取數
1
函式選擇。
【Function】下拉框選擇【自訂】,點選後面的【設定】按鈕,進入函式獲取介面。
輸入需要獲取的函式名稱的一部分,點選搜尋,進行模糊查詢。
選定函式後,點選【確定】按鈕。

2
參數輸入。
輸入是指參數輸入,即所選函式的參數輸入列表。
【參數名稱】ABAP 函式中的參數名稱,不可更改,直接從ABAP函式中刷新出來的,可以刪除,選中某一個參數,點選刪除按鈕即可,如果想恢復該參數,點選重新整理按鈕。
【SAP 資料型別】ABAP 函式中參數的資料型別,不可更改,直接通過函式重新整理出來。
【傳回集】如果參數是一個結構體參數的一部分,傳回集顯示這個結構體的名稱。
【資料型別】指該參數在 FR 報表中對應的參數資料型別。
【對應參數】指該參數在 FR 報表中對應的參數名稱,可手動編輯。
【參數預設值】指該參數在 FR 報表中參數的預設值,可手動編輯。

3
結果輸出。
輸出就是所選函式的輸出結果集。
【SAP 欄名】ABAP 函式輸出結果集中的資料欄名稱,不可編輯,直接從 ABAP 函式中結果集中讀取出來,可以刪除,選中某欄,點選刪除即可,如果想恢復該欄,點選重新整理按鈕。
【SAP 資料型別】ABAP 函式輸出結果及中資料欄對應的 SAP 資料型別,不可編輯,直接通過函式結果集重新整理出來。
【資料型別】FR 報表中資料欄對應的資料型別。

五、屬性設定-簡單通用查詢取數
1
選擇表和欄。
【Function】下拉框選擇【簡單通用查詢】,手動輸入表名稱。
點選【選擇欄】後的【設定】按鈕,彈出選擇欄介面,選擇需要輸出的欄。
點選【確定】,【選擇欄】後面的文字框中會列出所選擇的幾個欄。

2
過濾條件。
【過濾條件】後的文字框中用 open SQL 語句編寫輸出資料需要滿足的條件。
點選後面的【格式說明】按鈕,可查看 open SQL 的基本格式。
如果條件的值是動態變化的,則可用參數來實現,參數以${para}的形式展現。
點選下方的【
】按鈕,可將參數重新整理展示,給參數設定一個預設值。

六、屬性設定-通用查詢取數
1
新增ABAP Function。
將EXTRACT_TABLE_DATA函式新增到SAP系統中。
FUNCTION EXTRACT_TABLE_DATA.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" TABLES
*" FIELDS STRUCTURE ZSQL_CLAUSE_ELEMENTS
*" FROMCLAUSE STRUCTURE ZSQL_CLAUSE_ELEMENTS
*" WHERECLAUSE STRUCTURE ZSQL_CLAUSE_ELEMENTS
*" DATA STRUCTURE ZTABLEROWS
*"----------------------------------------------------------------------
*"----------------------------------------------------------------------
*" Copy selected fields from QUERY_TABLE to DATA_STRUCTURE
*"----------------------------------------------------------------------
TYPE-POOLS: abap.
DATA:
columnName TYPE SO_TEXT,
fieldDataDescrRef TYPE REF TO abap_componentdescr,
numberFields TYPE i,
fieldDescr TYPE abap_componentdescr,
fieldname TYPE string,
fieldDescrTab TYPE abap_component_tab,
rowStructDescr TYPE REF TO cl_abap_structdescr,
rowReference TYPE REF TO data,
returnRowString TYPE string,
dataFieldString TYPE string,
dataline LIKE data,
fromClauseRow TYPE ZALBUS_STRUCT_WHERECLAUSE,
fromClauseString TYPE string,
whereClauseRow TYPE ZALBUS_STRUCT_WHERECLAUSE,
whereClauseString TYPE string,
fieldsRow TYPE ZALBUS_STRUCT_WHERECLAUSE.
FIELD-SYMBOLS:
<datarow> TYPE ANY,
<datafield> TYPE ANY.
* CREATE DataStructure with field names
* Datatypes are read from fieldnames of FIELDS input table
DESCRIBE TABLE FIELDS LINES numberFields.
LOOP AT FIELDS INTO fieldsRow.
fieldname = SY-TABIX.
* names need to be unique and must start with a char
CONCATENATE 'string' fieldname INTO fieldname.
CONDENSE fieldname.
fieldDescr-name = fieldname.
* for dictionary lookup we need to change columnnames from Open SQL
* to dictionary notation
columnName = fieldsRow-TEXT.
REPLACE FIRST OCCURRENCE OF SUBSTRING '~' IN columnName WITH '-' RESPECTING CASE.
fieldDescr-type ?= cl_abap_typedescr=>describe_by_name( columnName ).
APPEND fieldDescr TO fieldDescrTab.
ENDLOOP.
rowStructDescr = cl_abap_structdescr=>create( fieldDescrTab ).
* now we create the actual data structure in memory
create data rowReference type HANDLE rowStructDescr.
* finally we assign it to the Field-symbol used by the select statement
ASSIGN rowReference->* TO <datarow>.
* End Create DataStructure
* to simplify calls we concatenate from and whereclause into strings
* this way caller doesn't need to check word wrappings
fromClauseString = ''.
LOOP AT FROMCLAUSE INTO fromClauseRow.
CONCATENATE fromClauseString fromClauseRow-TEXT INTO fromClauseString.
ENDLOOP.
whereClauseString = ''.
LOOP AT WHERECLAUSE INTO whereClauseRow.
CONCATENATE whereClauseString whereClauseRow-TEXT INTO whereClauseString.
ENDLOOP.
* Now start actual select operation
SELECT (FIELDS) FROM (fromClauseString) INTO <datarow> WHERE (whereClauseString).
* we read all fields of the current row, cast it to string and
* concatenate it into a dataline with division chars.
CLEAR: returnRowString.
DO numberFields TIMES.
ASSIGN component sy-index of structure <datarow> to <datafield>.
dataFieldString = <datafield>.
CONCATENATE returnRowString '^' datafieldstring INTO returnRowString.
ENDDO.
dataline = returnRowString.
* finally dataline is added to the return table.
INSERT dataline INTO TABLE data.
ENDSELECT.
ENDFUNCTION.
2
Select-欄設定。
【Function】下拉框選擇【通用查詢】。
Select即選擇所需欄,使用open SQL ,格式為表~欄。
這邊設定為KNA1~NAME2,KNVV~KUNNR,KNA1~LAND1。

3
From-表設定。
From即將兩張表關聯起來,open SQL 語句中關聯表,用 inner join on 格式。
這邊設定為KNA1 INNER JOIN KNVV ON KNA1~KUNNR = KNVV~KUNNR。

4
Where-條件設定。
Where設定選擇條件,可使用參數。
這邊設定為KNA1~NAME2 <>'' AND KNA1~LAND1 = '${land}'。
