多语言展示
当前在线:742今日阅读:103今日分享:49

表格软件FineReport教程:[10]SAP数据集

下面就通过表格软件FineReport来简单介绍一下SAP数据集。
工具/原料
1

表格软件FineReport7.1.1

2

大小:148.2M 适用平台:windows/linux

自定义取数
1

函数选择从定义上看,自定义取数是直接调用ABAP函数,也就是需要选择函数,点击Function后面的设置按钮,进入函数获取界面,输入需要获取的函数名称的一部分,点击搜索,进行模糊查询,比如说输入BAPI_PRIMWT_GETLIST,如下图:注:function后面的函数输入框不可编辑,只能点击设置按钮,通过函数取数界面选择。另:这里的ABAP函数均是SAP内置的函数,与FineReport无关。

2

参数输入点击确定按钮,下面的输入和输出面板中会自动刷新,输出列表会显示第一个结果集,首先介绍输入。输入是指参数输入,即所选函数需要输入的参数列表,如下图:

3

参数名称:ABAP函数中的参数名称,不可更改,直接从ABAP函数中刷新出来的,可以删除,选中某一个参数,点击删除按钮即可,如果想恢复该参数,点击刷新按钮,SAP数据类型:ABAP函数中参数的数据类型,不可更爱,直接通过函数刷新出来。返回集:如果参数是一个结构体参数的一部分,返回集显示这个结构体的名称。数据类型:指该参数在FR报表中对应的参数数据类型。对应参数:指该参数在FR报表中对应的参数名称,可手动编辑。参数默认值:指该参数在FR报表中参数的默认值,可手动编辑。

4

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

5

SAP列名:ABAP函数输出结果集中的数据列名称,不可编辑,直接从ABAP函数中结果集中读取出来,可以删除,选中某列,点击删除即可,如果想恢复该列,点击刷新按钮。SAP数据类型:ABAP函数输出结果及中数据列对应的SAP数据类型,不可编辑,直接通过函数结果集刷新出来。数据类型:FR报表中数据列对应的数据类型。目前输出只能输出一个结果集,假如函数输出有多个结果集,可以在输出的下拉框中选择要输出的结果集名称,如果需要输出所有结果集,比如说有2个结果集,那么只能通过新建2个SAP数据集,每个数据集选择一个结果集进行输出。

6

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

7

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

简单通用查询取数
1

选择表和列如上图,选择简单通用查询之后,在表的名称栏里面输入表的名称,由于不支持模糊查询,只能完全自定义输入,所以要求使用者对SAP系统中表名称有一定的了解,这里我们输入表KNA1,然后点击设置按钮,选择需要输出的列,我们这里简单设置一下,只选择前面5列数据,如下图:注:如果输入表的名称之后,无法取到数据,这是因为该表中的字段过多,需要将SAP的TAB512大小改大,就可以正常取到数据。

2

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

3

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

4

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

5

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

6

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

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

添加ABAP Function我方的ABAP Function的名称为ZEXTRACT_TABLE_DATA,不可改变,将其添加到SAP系统中,函数内容如下:FUNCTION ZEXTRACT_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:          TYPE ANY,           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 .* 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 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 to .      dataFieldString = .      CONCATENATE returnRowString '|' datafieldstring INTO returnRowString.    ENDDO.    dataline = returnRowString.* finally dataline is added to the return table.    INSERT dataline INTO TABLE data.  ENDSELECT.ENDFUNCTION

2

示例在Function列表中选择通用查询(适用于SAP6以上版本),如下图:我们这里简单做个多表查询,比如说关联KNA1和KNVV这两个表,读取出KNA1表中的NAME2和LAND1两个列以及KNVV表中的KUNNR列,并且NAME2不能为空,用参数动态输入LAND1的值,open sql语句和sql语句的格式是有区别的,点击格式说明,可查看open sql的格式。

3

列设置不同于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 = '${land}'最后结果如下图:

4

结果查看点击预览按钮,可查看上面语句执行的结果,如下图:

5

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

推荐信息