帆软软件
作者帆软软件·2015-06-01 17:19
产品经理·帆软软件

java报表开发工具FineReport教程之设计思路:数据集【4】SAP数据集

字数 11429阅读 3504评论 0赞 0

java报表开发工具FineReport中:

1. 描述
在SAP数据连接中建立好SAP的一个连接SAP2,接下来就可以通过该数据连接建立SAP数据集了,如果没有建立数据连接,请先建立一个SAP数据连接,设置过程请查看SAP数据连接

2. SAP数据集
新建好数据连接之后,再在模板中添加一个模板数据集或者是服务器数据集,这里我们以模板数据集为例,直接在模板的数据库查询面板中,点击按钮,选择SAP数据集,或者是点击模板>模板数据集,选择SAP数据集,如下图:

进入SAP数据集配置界面:

注:大数据使用SAP取数,如果取数时间过长,最后取数失败(一般是10分钟),是因为SAP自身对取数的限制,当取数时间过长时,事务会自动中止,此时需要联系sap顾问解决此问题。

SAP数据取数的方式有三种,下面详细介绍该三中取数方式的使用方法。

1、自定义

2、简单通用查询

3、通用查询

自定义取数

1. 描述
新建SAP数据集时,默认的为自定义取数方式,使用自定义取数,就是直接调用ABAP Function获取数据。

2. 示例
2.1 函数选择
从定义上看,自定义取数是直接调用ABAP函数,也就是需要选择函数,点击Function后面的设置按钮,进入函数获取界面,输入需要获取的函数名称的一部分,点击搜索,进行模糊查询,比如说输入BAPI_PRIMWT_GETLIST,如下图:

注:function后面的函数输入框不可编辑,只能点击设置按钮,通过函数取数界面选择。

另:这里的ABAP函数均是SAP内置的函数,与FineReport无关。

2.2 参数输入
点击确定按钮,下面的输入和输出面板中会自动刷新,输出列表会显示第一个结果集,首先介绍输入。

输入是指参数输入,即所选函数需要输入的参数列表,如下图:

参数名称:ABAP函数中的参数名称,不可更改,直接从ABAP函数中刷新出来的,可以删除,选中某一个参数,点击删除按钮即可,如果想恢复该参数,点击刷新按钮,

SAP数据类型:ABAP函数中参数的数据类型,不可更爱,直接通过函数刷新出来。

返回集:如果参数是一个结构体参数的一部分,返回集显示这个结构体的名称。

数据类型:指该参数在FR报表中对应的参数数据类型。

对应参数:指该参数在FR报表中对应的参数名称,可手动编辑。

参数默认值:指该参数在FR报表中参数的默认值,可手动编辑。

2.3 结果输出
输出就是所选函数的输出结果集,如下图:

SAP列名:ABAP函数输出结果集中的数据列名称,不可编辑,直接从ABAP函数中结果集中读取出来,可以删除,选中某列,点击删除即可,如果想恢复该列,点击刷新按钮。

SAP数据类型:ABAP函数输出结果及中数据列对应的SAP数据类型,不可编辑,直接通过函数结果集刷新出来。

数据类型:FR报表中数据列对应的数据类型。

目前输出只能输出一个结果集,假如函数输出有多个结果集,可以在输出的下拉框中选择要输出的结果集名称,如果需要输出所有结果集,比如说有2个结果集,那么只能通过新建2个SAP数据集,每个数据集选择一个结果集进行输出。

2.4 结果查看
点击数据集面板上的按钮,可预览SAP数据集,预览结果如下图:

2.5 设置完成后效果
设置完成之后,点击确定按钮,在数据查询面板中就会增加一个SAP1的数据集,如下图:

简单通用查询取数

1. 描述
简单通用查询,即类似SQL语句一样,从某张表中读取出某些列,并列数据满足一些条件,不同于SQL语句的是,简单通用查询并不是全部用语句实现,读取表跟列是可视化界面选择,需要满足的条件是通过语句open sql语句实现的。

注:简单通用查询只支持单表查询,也就是说只能查询一张表。

在Function列表中选择简单通用查询,如下图:

2. 示例
2.1 选择表和列
如上图,选择简单通用查询之后,在表的名称栏里面输入表的名称,由于不支持模糊查询,只能完全自定义输入,所以要求使用者对SAP系统中表名称有一定的了解,这里我们输入表KNA1,然后点击设置按钮,选择需要输出的列,我们这里简单设置一下,只选择前面5列数据,如下图:

注:如果输入表的名称之后,无法取到数据,这是因为该表中的字段过多,需要将SAP的TAB512大小改大,就可以正常取到数据。

2.2 过滤条件不带参数
点击确定,选择的列后面的文本框中会列出所选择的几个列,然后在过滤条件中用open sql语句编写输出数据需要满足的条件,点击后面的格式说明按钮,可查看open sql的基本格式,上图中,我们选择了KNA1表的前面5列,希望输出的NAME2列中没有空数据,过滤条件应该为:

NAME2 <>''

如下图:

  • 预览

点击上面的预览按钮,查看查询结果,如下图:

2.3 过滤条件带参数
在编写过滤条件的时候,如果条件的值是动态变化的,则可用参数来实现,与数据库查询中的参数一样,比如说,上面的过滤条件中再加一个带参数的条件,LAND1列的值为参数LAND,过滤条件如下:

NAME2 <>'' and LAND1='${LAND}'

如下图:

  • 结果查看

点击预览按钮,结果如下:

3. 设置完成后效果
点击确定,退出SAP数据集对话框,数据集面板如下图:

通用查询取数(适用于ECC 6以上版本)

1. 描述
通用查询较之简单通用查询,增加了表间关联的能力,支持多表查询,但是需要在ECC6以上版本使用,且需要在SAP系统中添加一个我方提供的ABAP Function,并且通用查询相对于简单通用查询来说,设置过程没有简单通用查询那么简单,选择的表和列不再是可视化选择,而完全是通过open sql语句实现。

1.1 添加ABAP Function
我方的ABAP Function的名称为ZEXTRACT_TABLE_DATA,不可改变,将其添加到SAP系统中,函数内容如下:

  1. FUNCTION ZEXTRACT_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的数据集,如下图:

通用查询取数中的函数

1. 描述
FR提供了EXTRACT_TABLE_DATA 的源码及后续的数据集使用过程,本篇对EXTRACT_TABLE_DATA的创建过程及出现的问题解决进行详细说明

2. 操作步骤

  • 新建abap function

先把EXTRACT_TABLE_DATA的源码贴进去

点击左边的table表格tab,新家4个表,FIELDS /FROMCLAUSE /WHERECLAUSE /DATA,类型都为LIKE,后面的结构类型按照文档源码,前三个输入ZSQL_CLAUSE_ELEMENTS,最后一个输入ZTABLEROW

这个时候可能会报错,没有ZSQL_CLAUSE_ELEMENTS和ZTABLEROWS,先保存一下function

展开ABAP 工作台,双击ABAP Dictionary 字典:

选择第三个data type,输入数据结构名称ZSQL_CLAUSE_ELEMENTS,点击创建:

选中structure结构,点击确定:

输入简称,增加一个数据元素TEXT,类型为SO_TEXT

同样的方法,我们创建structure结构ZTABLEROWS,增加一条数据元素,名字任意如ZTABLEROWS,数据元素 CHAR2000

保存这两个structure,然后点击上方的结构树按钮,打开structure所在包目录

展开structure目录,就可以看到我们定义的那两个结构了,分别右击>activate激活

回到EXTRACT_TABLE_DATA,重新点击左边的table表格tab,新加4个表,FIELDS /FROMCLAUSE /WHERECLAUSE /DATA 类型都为LIKE,后面的结构类型按照文档源码,前三个输入ZSQL_CLAUSE_ELEMENTS,最后一个输入ZTABLEROWS

  • 保存function,并且点击工具栏的check按钮进行语法检查

可能会报错,如右图则把function里面的ZALBUS_STRUCT_WHERECLAUSE都改成 ZSQL_CLAUSE_ELEMENTS

  • 再次check

没有错误则表示function 可以了,注意还需要设置函数可以远程访问

  • 最后激活函数,完成设置

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广