二 开发指南

2.1扩展函数

2.1.1扩展的概念

报表工具与电子表格工具的最基本差异就是支持数据扩展。电子表格工具只能在每个单元格中填好需要的内容,并不能根据数据进行自动扩展。

以一个典型单行扩展的网格报表为例:

可以看到运行结果为:

我们可以看到,在excel设计的第五行(R5),数据集p1中的数据,通过select()函数进行纵向单行扩展,将一行扩展为四行。

但有时我们的一条数据可能并不全在一行显示,如下图显示,一条数据需要显示在多行上,这种类型的报表我们称之为卡片报表。

如何才能简单灵活的指定报表的扩展方式?报表工具通过excel中的合并行的概念解决了这个问题。

在卡片报表的设计时,将4-8行进行合并,这样报表工具会自动把4-8行当成一行进行处理,扩展将以这5行为一个单位进行。
如果我们这里不进行合并行的处理,会出现什么情况?

可以看到报表工具就会按照单行扩展的原理进行处理,这是错误的。
以上两个例子分别展现了单行与多行两种扩展方式,但它们表达的概念其实是一样的。即是报表工具有别于表格工具的最基本区别——扩展。
当然除了常见的纵向扩展外,也可以进行横向扩展,控制它们的方式就是使用接下来介绍的扩展函数。

2.1.2 select()、selecth()函数

#    函数说明
从数据集的当前行集中选取符合条件的记录。
select()表示纵向扩展,selecth()表示横向扩展。
语法:
    datasetName.select(select_exp,filter_exp,sort_exp)
    datasetName.selecth(select_exp,filter_exp,sort_exp)

#    参数说明
select_exp    选择的关系、字段、列名
filter_exp    数据过滤表达式,如果不需数据过滤,则此参数可省略,仅用’’占位。
sort_exp    数据排序表达式。格式如field:单价;order:ascending;type:number。
field表示排序关系,order表示升(ascending)降(descending)序,type表示关系类型(text、number)。

#    返回值
一组数据集合,数据由select_exp的运算结果决定。

#    示例
ds1.select(ds1.产品ID) 
从数据源ds1中选取产品ID字段列的所有值。

ds2.select(ds2.订单ID,'ds2.订单ID=ds1.订单ID') 
从数据源ds2中选取订单ID字段列的值,条件是ds2的订单ID值必须等于ds1的订单ID的值。

ds1.select(ds1.产品ID,'','field:单价;order:ascending;type:number')
从数据源ds1中选取产品ID字段列的所有值,并将结果按照单价的值进行升序排序。

2.1.3 group()、grouph()函数

#    函数说明
从数据集中选取符合条件的记录,并按照指定关系(列)进行分组。

#    语法
datasetName.group(select_exp,filter_exp,sort_exp,condition_exp,display_exp)
datasetName.grouph(select_exp,filter_exp,sort_exp,condition_exp,display_exp)

#    参数说明
select_exp        选择的关系、字段、列名
filter_exp        数据过滤表达式,如果不需数据过滤,则此参数可省略,仅用’’占位。
sort_exp        数据排序表达式。格式如field:单价;order:ascending;type:number。
Field            表示排序关系,order表示升(ascending)降(descending)序,type表示关系类型(text、number)。
condition_exp    条件序列,根据条件转换显示值,与显示序列配合使用,且条件个数必须与显示序列相同。
display_exp        显示序列,根据条件转换显示值,与条件序列配合使用,且个数必须与条件序列相同。


#    返回值
一组数据集合,数据由select_exp的运算结果决定。

#    示例
ds1.group(ds1.产品类别) 
把数据源ds1中的所有数据按照产品类别进行分组。

ds1.group(ds1.产品类别,' RUNITPRICE>10 and RUNITPRICE<20 ') 
把数据源ds1中的所有RUNITPRICE(单价)大于10并且小于20数据按照产品类别进行分组。

ds1.group(ds1.产品类别,'','field:单价;order:ascending;type:number') 
把数据源ds1中的所有数据按照产品类别进行分组,并将结果按照单价的值进行升序排序。

ds1.group(ds1.RUNITPRICE_V ,'','','RUNITPRICE > 10, RUNITPRICE = 10, 10 > RUNITPRICE', '大于10, 等于10, 小于10')
把数据源ds1的数据按照RUNITPRICE > 10, RUNITPRICE = 10, 10 > RUNITPRICE的条件进行筛选,且将符合条件的数据分别显示为大于10, 等于10, 小于10。

2.2运行函数

2.2.1 sum()函数

#    函数说明
对扩展后的单元格数据进行求和。

#    语法
sum(cell)

#    参数说明
cell指定单元格

#    返回值
实数类型的数据。

#    示例
sum(A1)    求出A1单元格扩展后所有数据的和。

2.2.2 avg()函数

#    函数说明
对扩展后的单元格数据求平均值。

#    语法
avg(cell)

#    参数说明
cell指定单元格

#    返回值
实数类型的数据。

#    示例
avg(A1)    求A1单元格扩展后所有数据的平均值。

2.2.3 max()函数

#    函数说明
找出扩展后单元格数据中的最大值。

#    语法
max(cell)

#    参数说明
cell指定单元格

#    返回值
实数类型的数据。

#    示例
max(A1)    求出A1单元格扩展后所有数据的最大值。

2.2.4 min()函数

#    函数说明
找出扩展后单元格数据中的最小值。

#    语法
min(cell)

#    参数说明
cell指定单元格

#    返回值
实数类型的数据。

#    示例
min(A1)    求出A1单元格扩展后所有数据的最小值。

2.2.5 count()函数

#    函数说明
对扩展后的单元格数据量进行计算。

#    语法
count(cell)

#    参数说明
cell指定单元格

#    返回值
实数类型的数据。

#    示例
count(A1)    求出A1单元格扩展后所有数据总量。

2.2.6 运算区域的设置

以上介绍的五个运算函数都是作用在一个数据集合上的,这样就产生了运算区域的概念。根据不同的需求,运算区域不尽相同。接下来我们介绍如何才能灵活的指定运算函数的运算区域。
下面这个例子:
在分组报表设计中,需要计算两种合计。一个是第六行(R6)的供应商库存合计,一个是第七行(R7)的库存总合计。SUM中的cell参数指定的都是G5单元格,但最后运算结果并不相同,原因就是它们的运算区域不同。
分组报表运行结果图:

分组报表设计图:

报表工具会根据运算函数所在的行自动匹配一个运算区域,我们可以通过报表设计时的缓存文件看到。

在缓存文件中,可以看到结构化的报表定义,摘录有关运算合计的单元格如下:

<rdl:table-cell id="R6C7" column="C7" type="Number" v-group="$PR5C2" h-group="$ALL" ref="sum($R5C7)">
</rdl:table-cell>
<rdl:table-cell id="R7C7" column="C7" type="Number" v-group="$ALL" h-group="$ALL" ref="sum($R5C7)"> 
</rdl:table-cell>

id=”R6C7”代表报表设计时中第六行第七个单元格,正是计算供应商合计的单元格。相应的,id="R7C7"代表计算总合计的单元格。可以发现,两个单元格中只有v-group属性是不同的,同时还有一个类似的h-group属性,这两个属性即指定了运算函数SUM的运算区域。

R6C7单元格的v-group属性为$PR5C2,这是由报表工具自动计算得出的,代表在纵向上以第五行第二列单元格扩展后的区域进行计算,其中P代表一个决定如何扩展的单元格通常其中含有扩展函数(我们称之为repeat),R代表行,C代表列。

那么如何设置运算函数的区间呢?可以通过设置v-group和h-group属性(批注)来实现。
我们通过一个主从报表来说明设置运算区域的作用,如下图:
主从报表运行结果图:

主从报表设计图:

上图所示序号是分别按照每个子表数据条数进行计算的,如果我们需要按照全部数据计算的话,可以在设计报表时为计算单元格添加v-group属性(批注),设置属性值为$ALL。

2.2.7 表达式

报表工具提供了加减乘除四种表达式。
加法符号——“+” 减法符号——“-”
乘法符号——“*” 除法呼号——“div”

我们先来看一个乘法的例子:

如图,在I5单元格将单价与库存数量做乘法计算每个产品的库存成本。
运行结果如下:

可以看到扩展后,报表工具将每行的单价都乘以库存数量得到成本值。
再通过一个占比的例子来说明表达式的用法:

如图,在D4和F4单元格,我们将产品数量与总数量进行了除法,得到的就是每个产品数据占总数量的比重。

2.3属性(批注)

报表工具中属性的设置是通过excel的批注方式来实现的。
我们将属性划分为四大类:全局属性、行属性、列属性、单元格属性。
详细的属性列表可参考5.1节。

2.3.1全局属性

作用在整个报表上的属性称之为全局属性。全局属性需要在报表设计时的第一行第一列单元格设置。

我们以auto-height(自动列高)属性为例,如果报表单元格中的内容过多时,可能会造成下图这种情况:

遇到这种情况我们需要设置全局属性auto-height:true,代表报表的行高度根据内容自适应。在报表设计工具中设置auto-height属性后,属性值会生成在excel的第一行一列的单元格上。

再看一下这个页面的运行效果就可以发现,单元格的高度根据内容高度自动撑开了。

2.3.2行属性

作用在报表一行上的属性称之为行属性。行属性需要设置在作用行的第一列上。

当我们需要隐藏报表上的一行时,可以使用行属性v-visible,如下图,当在第四行的第一列设置了v-visible:false后,在运行时第三行整行都会被隐藏。

2.3.3列属性

作用在报表每列上的属性称之为列属性。列属性需要设置在作用列的第一行上。

当我们需要隐藏报表上的一列时,可以使用列属性h-visible,如下图,当在F行的第一列设置了h-visible:false后,在运行时F列整列都会被隐藏。

2.3.4格属性

只作用在报表单元格上的属性称之为格属性。
在2.2.6节我们使用的v-group就是一个格属性,这里不在赘述格属性的设置方法。

2.4显示

2.4.1显示格式、边框、对齐、字体

报表工具对于报表显示格式的设置,都是基于excel上的单元格格式而来。也就是说,在excel中定义的格式,最终会作为报表运行时的格式显示。

除了单元格格式外,报表工具也读取了excel的页面设置作为报表的默认打印设置。

2.4.2显示扩展

如图所示的交叉报表,是一个具有横向扩展的报表,如果我们按照这样进行报表设计的话:

运行结果就会这样,标题会按照数据进行横向扩展,这不是我们需要的。

因此我们就需要使用到显示扩展功能,如下图所示。colspan是列合并属性,$ALL.PR4C3表示按照第四行第三列定义的扩展函数的所有数据进行扩展,并在最后扩展结果上加上1列(指B列)。

通过在B2列添加colspan属性,使得标题可以按照函数扩展的列进行自适应居中,运行效果如下:

2.5组件

开发报表功能需要报表组件,同时还需要企业报表这个应用,需要用租户管理员添加这个应用并进行服务注册。

2.5.1 报表组件

报表组件(report),报表样式的展现组件。含有下列属性:

xid:组件唯一标识。
report-name:报表名称,导出文件采用该名称保存。
Excel文件:报表定义excel的路径。
数据源:报表引用数据集,对应数据组件的xid。
自动加载:报表是否在页面打开时自动加载。

增加报表工具栏可以在页面中生成打印和导出相关的操作按钮,如下:

进入报表设计会打开如下的报表设计页面:

如果没有下载过报表设计客户端,需要先执行“下载客户端”,会下载一个reportdesigner.zip包进行解压后,打开“报表设计客户端.xls”文件,如果有提示宏警告选择启用宏,如下:

下面就可以打开报表文件,进行excel的设置,如果是需要输入数据源的列的,可以把焦点定位在对应的操作输入框上,然后双击右边的字段就可以自动填充上,单元格设置后点击“设置单元格”excel文件中就可以生成相关的内容,报表都设计完毕后可以点击excel文件上的保存或者执行“保存报表文件”。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""