當前為10.0版本文檔,更多實例內容將在最新幫助文檔中展現,點選跳轉至 最新版幫助文檔

通用查詢取數(适用於ECC6以上版本)

1. 概述

通用查詢較之簡單通用查詢,增加了表間關聯的能力,支持多表查詢,但是需要在 ECC6 以上版本使用,且需要在 SAP 系統中添加一個我方提供的 ABAP Function。

通用查詢相對於簡單通用查詢來說,設置過程沒有簡單通用查詢那麽簡單,選擇的表和列不再是可視化選擇,而完全是通過 open SQL 語句實現。

2. 添加 ABAP Function

我方的 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.
顯示代碼

注1:若出現多個字段到一列的情況,需要将代碼中的一行:CONCATENATE returnRowString '^' datafieldstring INTO returnRowString. 替換成 CONCATENATE returnRowString '|' datafieldstring INTO returnRowString.

注2:sap 數據集支持結構型參數。

3. 示例

在 Function 列表中選擇通用查詢(适用於 SAP6 以上版本),如下圖所示:

注:這裏适用於 6 及以上版本
222

我們這裏簡單做個多表查詢,比如說關聯 KNA1 和 KNVV 這兩個表,讀取出 KNA1 表中的 NAME2 和 LAND1 兩個列以及 KNVV 表中的 KUNNR 列,并且NAME2 不能爲空,用參數動态輸入 LAND1 的值,open SQL 語句和 SQL 語句的格式是有區别的,點擊格式說明,可查看 open SQL 的格式。

3.1 列設置

不同於 SQL 語句,open SQL 中讀取某個列應該用表~列這種格式,即 Select 後面的文本框語句應該爲:

KNA1~NAME2,KNVV~KUNNR,KNA1~LAND1

3.2 表設置

将兩張表關聯起來,open SQL 語句中關聯表,用 inner join on 格式,即 From 後面的文本框語句應該爲:

KNA1 INNER JOIN KNVV ON KNA1~KUNNR = KNVV~KUNNR

3.3 條件設置

由上面的描述可知,Where 條件語句中的語句應該爲:

KNA1~NAME2 <>'' AND KNA1~LAND1 = '${land}'

完整的 open SQL 語句爲:

select KNA1~NAME2,KNVV~KUNNR,KNA1~LAND1 from KNA1 INNER JOIN KNVV ON KNA1~KUNNR = KNVV~KUNNR where KNA1~NAME2 <>'' AND KNA1~LAND1

3.4 簡單示例

按照上面的格式做一個簡單示例,數據集配置如下圖所示:
222

簡單示例中的查詢語句如下:

  • Select:T001K~MANDT,T001W~BWKEY,T001K~XEFRE

  • From:T001K INNER JOIN T001W on T001K~BWKEY = T001W~BWKEY

  • Where:T001K~MANDT <>'' AND T001K~XEFRE = '${a}'

3.5 結果查看

點擊預覽按鈕,可查看上面語句執行的結果,如下圖所示:
222

4. 數據集界面

設置完成後,點擊确定,退出 SAP 數據集對話框,在數據集面板中會增加一個名稱爲 SAP3 的數據集,如下圖所示:
222

FineReport 提供了 EXTRACT_TABLE_DATA 的源碼及後續的數據集使用過程。

EXTRACT_TABLE_DATA 的創建過程及出現的問題解決請參見:通用查詢取數中的函數

附件列表


主題: 原簡體文檔
  • 有幫助
  • 沒幫助
  • 只是瀏覽

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

反饋已提交

網絡繁忙