历史版本2 :通用查询取数(适用于ECC6以上版本) 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 描述编辑

通用查询较之简单通用查询,增加了表间关联的能力,支持多表查询,但是需要在ECC6以上版本使用,且需要在SAP系统中添加一个我方提供的ABAP Function,并且通用查询相对于简单通用查询来说,设置过程没有简单通用查询那么简单,选择的表和列不再是可视化选择,而完全是通过open sql语句实现。
1.1 添加ABAP Function
我方的ABAP Function的名称为EXTRACT_TABLE_DATA,不可改变,将其添加到SAP系统中,函数内容如下:
  1. FUNCTION EXTRACT_TABLE_DATA.  
  2. *"---------------------------------------------------------------------- 
  3. *"*"Local Interface: 
  4. *"  TABLES  
  5. *"      FIELDS STRUCTURE  ZSQL_CLAUSE_ELEMENTS 
  6. *"      FROMCLAUSE STRUCTURE  ZSQL_CLAUSE_ELEMENTS  
  7. *"      WHERECLAUSE STRUCTURE  ZSQL_CLAUSE_ELEMENTS 
  8. *"      DATA STRUCTURE  ZTABLEROWS  
  9. *"---------------------------------------------------------------------- 
  10.  
  11.  
  12. *"----------------------------------------------------------------------  
  13. *" Copy selected fields from QUERY_TABLE to DATA_STRUCTURE 
  14. *"----------------------------------------------------------------------  
  15.   TYPE-POOLS: abap.  
  16.   DATA:  
  17.         columnName TYPE SO_TEXT,   
  18.         fieldDataDescrRef  TYPE REF TO abap_componentdescr,   
  19.         numberFields TYPE i,   
  20.         fieldDescr TYPE abap_componentdescr,   
  21.         fieldname TYPE string,   
  22.         fieldDescrTab TYPE abap_component_tab,  
  23.         rowStructDescr TYPE REF TO cl_abap_structdescr,   
  24.         rowReference TYPE REF TO data,   
  25.         returnRowString TYPE string,   
  26.         dataFieldString TYPE string,   
  27.         dataline LIKE data,   
  28.         fromClauseRow TYPE ZALBUS_STRUCT_WHERECLAUSE,  
  29.         fromClauseString TYPE string,  
  30.         whereClauseRow TYPE ZALBUS_STRUCT_WHERECLAUSE,  
  31.         whereClauseString TYPE string,  
  32.         fieldsRow TYPE ZALBUS_STRUCT_WHERECLAUSE.  
  33.   FIELD-SYMBOLS:  
  34.           <datarow> TYPE ANY,   
  35.           <datafield> TYPE ANY.   
  36.   
  37.   
  38. * CREATE DataStructure with field names   
  39. * Datatypes are read from fieldnames of FIELDS input table  
  40.   DESCRIBE TABLE FIELDS LINES numberFields.  
  41.   LOOP AT FIELDS INTO fieldsRow.  
  42.     fieldname = SY-TABIX.  
  43. * names need to be unique and must start with a char  
  44.     CONCATENATE 'string' fieldname INTO fieldname.  
  45.     CONDENSE fieldname.  
  46.     fieldDescr-name = fieldname.  
  47. for dictionary lookup we need to change columnnames from Open SQL  
  48. * to dictionary notation  
  49.     columnName = fieldsRow-TEXT.  
  50.     REPLACE FIRST OCCURRENCE OF SUBSTRING '~' IN columnName WITH '-' RESPECTING CASE.  
  51.   
  52.     fieldDescr-type ?= cl_abap_typedescr=>describe_by_name( columnName ).  
  53.     APPEND fieldDescr TO fieldDescrTab.  
  54.   ENDLOOP.  
  55.   
  56.   rowStructDescr = cl_abap_structdescr=>create( fieldDescrTab ).  
  57.   
  58. * now we create the actual data structure in memory  
  59.   create data rowReference type HANDLE rowStructDescr.  
  60. finally we assign it to the Field-symbol used by the select statement  
  61.   ASSIGN rowReference->* TO <datarow>.  
  62. * End Create DataStructure  
  63.   
  64. * to simplify calls we concatenate from and whereclause into strings  
  65. this way caller doesn't need to check word wrappings 
  66.   fromClauseString = ''. 
  67.   LOOP AT FROMCLAUSE INTO fromClauseRow. 
  68.     CONCATENATE fromClauseString fromClauseRow-TEXT INTO fromClauseString. 
  69.   ENDLOOP. 
  70.  
  71.   whereClauseString = ''. 
  72.   LOOP AT WHERECLAUSE INTO whereClauseRow. 
  73.     CONCATENATE whereClauseString whereClauseRow-TEXT INTO whereClauseString. 
  74.   ENDLOOP. 
  75.  
  76. * Now start actual select operation 
  77.   SELECT (FIELDS) FROM (fromClauseString) INTO <datarow> WHERE (whereClauseString). 
  78. * we read all fields of the current row, cast it to string and 
  79. * concatenate it into a dataline with division chars. 
  80.     CLEAR: returnRowString. 
  81.     DO numberFields TIMES. 
  82.       ASSIGN component sy-index of structure <datarow> to <datafield>. 
  83.       dataFieldString = <datafield>. 
  84.       CONCATENATE returnRowString '|' datafieldstring INTO returnRowString.  
  85.     ENDDO.  
  86.     dataline = returnRowString.  
  87. finally dataline is added to the return table.  
  88.     INSERT dataline INTO TABLE data.  
  89.   ENDSELECT.  
  90.   
  91. ENDFUNCTION  
注:sap数据集支持结构型参数。

2. 示例编辑

在Function列表中选择通用查询(适用于SAP6以上版本),如下图:
我们这里简单做个多表查询,比如说关联KNA1和KNVV这两个表,读取出KNA1表中的NAME2和LAND1两个列以及KNVV表中的KUNNR列,并且NAME2不能为空,用参数动态输入LAND1的值,open sql语句和sql语句的格式是有区别的,点击格式说明,可查看open sql的格式。
2.1 列设置
不同于sql语句,open sql中读取某个列应该用表~列这种格式,即select后面的文本框语句应该为:
KNA1~NAME2,KNVV~KUNNR,KNA1~LAND1
2.2 表设置
将两张表关联起来,open sql语句中关联表,用inner join on格式,即from后面的文本框语句应该为:
KNA1 INNER JOIN KNVV ON KNA1~KUNNR = KNVV~KUNNR
2.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 = '${land}'
最后结果如下图:
2.4 结果查看
点击预览按钮,可查看上面语句执行的结果,如下图:

3. 设置完成后效果编辑

设置完成后,点击确定,退出SAP数据集对话框,在数据集面板中会增加一个名称为SAP3的数据集,如下图:

FR提供了EXTRACT_TABLE_DATA 的源码及后续的数据集使用过程,EXTRACT_TABLE_DATA的创建过程及出现的问题解决进行详细说明通用查询取数中的函数