多语言展示
当前在线:650今日阅读:60今日分享:41

电子表格FineReport教程:[27]下拉树示例

下面就通过电子表格FineReport来简单介绍一下下拉树。
工具/原料
1

电子表格FineReport7.1.1

2

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

下拉树控件自动构建示例
1

问题描述FR7.0能够将满足以下条件的数据自动生成树数据集,完全不用用户手动书写SQL查询语句,使用树数据集自动构建下拉树:

2

定义数据集增加数据集ds1,SQL语句为:SELECT * FROM [公司部门],数据结构如下:

3

转为树数据集新建树数据集Tree1,使用ds1来构建树,如下图:

4

定义下拉树选中下拉树,点击属性表>数据,将构建方式选择自动构建,选择树数据集Tree1,实际值与显示值分别为部分ID和部门名称,这样下拉树便定义好了,预览就可以看到效果。

下拉树控件分层构建示例
1

问题描述FR7.0中的分层构建下拉树其实就是FR6.5版本中的动态SQL,但在FR7.0中需要将每个SQL定义为一个报表数据集,在下拉树数据定义界面选择对应的数据集。

2

示例以下我们用下图地区、省份、城市三列数据,通过分层构建的方式来实现下拉树:

3

定义下拉树要使用的数据集由FR6.5可以知道需要定义动态SQL,在FR7.0中需要将每层的动态SQL定义为一个数据集,然后在下拉树中使用。如该例下拉树共3层,对应3个数据集:数据集ds1,查询出所有地区,SQL语句为SELECT 货主地区 FROM [订单] where 货主地区 is not null;数据集ds2,根据第一层layer1的值查询出省份,SQL语句为SELECT 货主省份 FROM [订单] where 货主地区 = '${layer1}';数据集ds3,根据前两层layer1、layer2的值查询出城市,SQL语句为SELECT 货主城市 FROM [订单] where 货主地区 = '${layer1}' and 货主省份 = '${layer2}'。注:FR6.5中通过@1、@2来引用某层数据,但在FR7.0中是通过layer1、layer2来引用,以此类推。其中@1,@2和layer1,layer2等均是预定义好的,不可更改。

4

定义下拉树在参数界面中,选择下拉树控件,拖曳至参数界面中,选择属性表>数据,构建方式选择分层构建,选择每层对应的数据集,下拉树便完成了。操作方式如下图:

5

效果查看点击分页预览,则可在参数界面上看到下拉树控件,效果如上图所示。

多选下拉树实现不同级别之间的查询
1

问题描述数据库中有3个级别的数据,分别是地区,城市,以及客户名称,如果想实现同时选择查询出华以的数据,这个该怎么实现呢?效果如下:

2

数据准备新建3个数据查询ds1,ds2,ds3ds1:SELECT * FROM [客户]。ds2:SELECT * FROM [客户] where 地区 = '${layer1}'。ds3:SELECT * FROM [客户] where 城市 = '${layer2}',实际值为客户ID。

3

报表主体设计报表主体设计如下图:

4

新建模板参数切换到参数界面,点击菜单栏中的模板>模板参数,点击添加按钮,新建模板参数tree。

5

构建树点击右侧下方的的全部添加按钮,然后将tree控件的类型选择为下拉树。数据选中下拉树控件,在控件属性面板中点击数据,开始构建树。构建方式选择分层构建。层次1:选择ds1,实际值和显示值都为地区。层次2:选择ds2,实际值和显示值都为城市。层次3:选择ds3,实际值为客户ID,显示值为客户名称。

6

属性设置在高级里面勾选多选,即使用多选下拉树,如果不勾选,则为单选下拉树,其他属性默认,属性的具体介绍请查看下拉树控件。结果返回完整层次路径如果勾选该选项,那么,下拉树返回的值为完整的层次路径,在使用时需要通过treelayer函数进行获取最底层的值,如果不勾选,则可以直接使用,这里先勾选上。

7

过滤设置参数界面和报表主体都设计好了之后,由于我们使用的是模板参数,需要通过参数将参数界面和报表主体联系起来,双击A2单元格,在过滤属性中设置,客户ID包含于treelayer($tree),如下图:注:公式treelayer($tree)的意思是返回参数tree中的值的最后一层数据。

8

如果在参数面板设置下拉树属性时没有勾选结果返回完整层次路径,那么其过滤设置如下图:

9

保存和预览点击分页预览,则在BS端看到上图的效果

下拉树实现数据集过滤
1

问题描述我们在制作模板时,经常要使用到参数,参数分为两种,一种是数据集参数,一种的模板参数,因此,过滤也分为两种,一种是数据集参数过滤,一种是模板参数过滤,这两种在前面都有讲到过,也介绍过用法,由于下拉树的特殊性,其返回值是路径数组值,并不是一个字符串,那么如果使用下拉树的话,其过滤的方式也就有所不同,下面分别讲述数据集参数过滤和模板参数过滤的方法。

2

数据集参数过滤单选下拉树数据准备新建数据集ds1:SELECT * FROM [S订单] where 1=1 ${if(len(aa)==0,'',' and 货主城市 = ''+treelayer(aa)+''')}新建数据集layer1:SELECT 货主地区 FROM [订单] where 货主地区 is not null新建数据集layer2:SELECT 货主省份 FROM [订单] where 货主省份 is not null and 货主地区='${layer1}'新建数据集layer3:SELECT 货主城市 FROM [订单] where 货主城市 is not null and 货主省份='${layer2}'注:数据集ds1中使用到了treelayer函数,即取得参数aa的最后一层值

3

下拉树创建在参数界面由参数aa生成控件,控件类型选择下拉树,下拉树的数据字典选择分层构建方式,数据来源是layer1,layer2和layer3下拉树控件默认为单选下拉树,勾选结果返回完整层次路径。参数界面如下图:

4

注:如果下拉树属性中不勾选结果返回完整层次路径,那么下拉树返回值不是路径值,故无需使用treelayer函数对下拉树返回值进行再次修改,直接使用即可,此时,可以将ds1数据集的SQL语句修改为SELECT * FROM [S订单] where 1=1 ${if(len(aa)==0,'',' and 货主城市 = ''+aa+''')}

5

报表设计如下图:

6

效果查看

7

多选下拉树数据准备打开上面的单选下拉树模板,更改数据集ds1:SELECT * FROM [S订单] where 1=1 ${if(len(aa)==0,'',' and 货主城市 in ('+'''+treelayer(aa,true,'\',\'')+'''+')')}注:treelayer(aa,true,'\',\'')返回的值是以“'”为分隔符的字符串,形如“北京,天津”这样的字符串,但是在sql语句中实现in过滤必须形如“'北京,天津'”,两者比较,后者比前者最前面和最后面多了两个单引号,则在treelayer(aa,true,'\',\'')前面和后面拼接两个单引号即可。下拉树选中下拉树控件,在控件属性表中,勾选多选复选框,。如下图:

8

注:不论下拉树属性中勾选不勾选结果返回完整层次路径选项,在ds1数据集实现过滤的时候都需要使用treelayer函数,勾选该选项treelayer有两个作用,一个是获取最底层值,另一个是将数组转换为字符串,而不勾选该选项,则只是将数组转换为字符串。

9

效果查看

填报页面下拉树控件返回所选层级值
1

问题描述前面几篇文档介绍了参数界面下拉树的使用方法,以及treelayer函数的使用,那么在填报页面使用下拉树控件时,如果不做任何处理,控件的返回值就会是层级路径,而不是所选层级的值,并且往数据库中填报的值也会是路径值,那么怎样设置才能使单元格显示为所选层级值,并且录入数据库也是所选层级值呢。

2

示例在填报页面使用下拉树展现部门结构,实际值为部门ID,显示值为部门名称,希望实现下拉树所在单元格返回值为所选层级值的显示值,入库时时所选层级值的实际值。如下图所示:

3

数据准备新建一张模板,添加数据集ds1:SELECT * FROM [公司部门]。接着添加树数据集tree1:,如下图:

4

添加下拉树在报表主体添加一个下拉树控件,在属性设置页面去掉只返回叶子节点前面的勾选,新建一个单选下拉树,构建方式选择自动构建,实际值为部门ID,显示值为部门名称,设置如下图:

5

此时,下拉树就可以正常使用,但是控件的返回值是路径值,并且还是实际值,如下图:那么,为了让其返回为所选层级的显示值,即返回“财务部”,就需要在形态中设置,将控件返回实际值的路径转化成所选层级的显示值,即获取到控件返回值部门ID“1,13”中的“13”,并通过sql语句,将部门ID转换为部门名称即可。

6

形态设置如上所说,获取路径值的最后一个部门id的值,可用treelayer函数实现,即treelayer($$$),用sql语句转换部门ID和部门名称,则可用sql函数,完整的公式如下:sql('FRDemo','select 部门名称 from 公司部门 where 部门id=''+treelayer($$$)+''',1)如下图:注:如果此处的下拉树是多选下拉树,那么sql函数应该为:sql('FRDemo','select 部门名称 from 公司部门 where 部门id in (''+treelayer($$$)+'')',1)

7

填报属性设置到此为止,报表展示时的数据显示已经满足需求,但是上面所做的一切设置都只是改变了数据的形态,并没有改变数据的实际值,那么在入库的时候还是会用实际值入库,比如说,选择了“财务部”,填报进数据库的值却是“1,13”,很明显,填报进数据库的值应该是“财务部”对应的部门ID“13”,所以在填报属性处也需要使用公式treelayer(B2),B2单元格为下拉树所在单元格,如下图:

8

结果查看点击填报预览,选择“财务部”,web端的结果如上所示,点击提交按钮之后,查看表里面的数据,会发现填报进去的是财务部的实际值“13”。而不是“1,13”,如下图:注:不论是单选下拉树还是多选下拉树均可这么设置。

推荐信息