反饋已提交
網絡繁忙
通用查询较之简单通用查询,增加了表间关联的能力,支持多表查询,但是需要在 ECC6 以上版本使用,且需要在 SAP 系统中添加一个我方提供的 ABAP Function。
通用查询相对于简单通用查询来说,设置过程没有简单通用查询那么简单,选择的表和列不再是可视化选择,而完全是通过 open SQL 语句实现。
我方的 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 数据集支持结构型参数。
在 Function 列表中选择通用查询(适用于 SAP6 以上版本),如下图所示:
注:这里适用于 6 及以上版本
我们这里简单做个多表查询,比如说关联 KNA1 和 KNVV 这两个表,读取出 KNA1 表中的 NAME2 和 LAND1 两个列以及 KNVV 表中的 KUNNR 列,并且NAME2 不能为空,用参数动态输入 LAND1 的值,open SQL 语句和 SQL 语句的格式是有区别的,点击格式说明,可查看 open SQL 的格式。
不同于 SQL 语句,open SQL 中读取某个列应该用表~列这种格式,即 Select 后面的文本框语句应该为:
KNA1~NAME2,KNVV~KUNNR,KNA1~LAND1
将两张表关联起来,open SQL 语句中关联表,用 inner join on 格式,即 From 后面的文本框语句应该为:
KNA1 INNER JOIN KNVV ON KNA1~KUNNR = KNVV~KUNNR
由上面的描述可知,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
按照上面的格式做一个简单示例,数据集配置如下图所示:
简单示例中的查询语句如下:
Select:T001K~MANDT,T001W~BWKEY,T001K~XEFRE
From:T001K INNER JOIN T001W on T001K~BWKEY = T001W~BWKEY
Where:T001K~MANDT <>'' AND T001K~XEFRE = '${a}'
点击预览按钮,可查看上面语句执行的结果,如下图所示:
设置完成后,点击确定,退出 SAP 数据集对话框,在数据集面板中会增加一个名称为 SAP3 的数据集,如下图所示:
FineReport 提供了 EXTRACT_TABLE_DATA 的源码及后续的数据集使用过程。
EXTRACT_TABLE_DATA 的创建过程及出现的问题解决请参见:通用查询取数中的函数
文 檔回 饋
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉