fvs实现控件查询
需求
思路
- 通过在数据集中定义数据集参数,再在化不中添加控件,控件绑定带有参数的数据字典,即可实现后面的控件根据前面控件数据进行过滤。
- 通过单元格添加过滤条件实现表格数据自动查询;
参数
模板参数
- 使用模板参数绑定控件,实现参数查询的效果;
- 模板参数只适用于当前报表的参数,需要与数据列的过滤条件结合使用。
- 模板参数适用于数量小的情况,先通过数据集取出所有数据,再在报表中设置模板参数,在数据查询时使用模板参数过滤出有用的数据。
数据级参数
- 类似通信、监控行业,每天都有海量数据生成,数据库表中数据量非常大,而报表往往只需要几百条;
- 如果使用模板参数,就先取出所有数据,再进行过滤,取数+过滤,将消耗大量时间。
- 而数据集参数在数据库查询时就已经完成了数据过滤,所以使用数据级参数设计的查询报表查询会比模板参数效率高。
- 定义数据集时,通过SQL语句中添加${para}格式的内容
SELECT * FROM 销量 where 地区 = '${area}'
- 带公式的应用,
```
SELECT * FROM 订单 where 1=1 ${if(len(area)==0, "","and货主地区='"+area+"'")}
```
- 解析上面的代码
- 基础部分SELECT * FROM 订单,查询订单表的所有字段;
- WHERE 1=1,恒真条件,用于简化后续动态条件的拼接;
len(area)==0,判断参数area,如果area参数的长度为0,则内容为空,SQL拼接后为SELECT * FROM 订单 where 1=1;
- 如果area的参数长度不为0, 则将字符串
and 货主地区 、参数area,拼接成一句SQL,,如area的值为华东,那么参数定义部分的执行结果为and 货主地区='华东',完整的 SQL 语句就变成:SELECT * FROM 订单 where 1=1 and 货主地区='华东'
- 定义多个参数
SELECT * FROM 订单 where 1=1
${if(len(area)==0,"","and 货主地区 = '"+area+"'")}
${if(len(provience)==0,"","and 货主省份='"+provience+"'")}
- 其中使用了两次${},定义了两个数据集参数area和provience
切换按钮查询参数
- 第一步:按钮的显示,每个按钮都设置正常的字符串的显示值;
- 第二步:在模板参数上,新增一个按钮参数"Button",给它一个默认值;当切换不同的按钮时,
Button就等于不同的值;这个值随便写就行,相当于一个中间介绍人。
- 这个用的是单元格数据集,我现在去看一下,数据来源,单元格数据和数据集数据有什么区别;刚才没找到。接着往下看吧。
- 当时好像是单元格的数据集可以用下面这种写法。
横坐标:
- 分类名,选公式;
- 直接选中数据集的第几列
feng_chart.select(#4);
纵坐标
switch(
$button,"a",value("feng_chart",5),
"arms",value("feng_chart",6),
"v",value("feng_chart",23),
"vrms",value("feng_chart",24),
"s",value("feng_chart",14),
"srms",value("feng_chart",15)
)
- 如果模板参数
buttton的值等于a,那么值就等于feng_chart这个表的第五列;
- 关键函数说明switch(条件,条件值1,结果1,条件值2,结果2,)
- 帆软给的说明:
switch(表达式, 值 1, 结果 1, 值 2, 结果 2, ...)
如果表达式的结果是值 1,整个函数返回结果 1
如果表达式的结果是值 2,整个函数返回结果 2
如果表达式的结果是值 3,整个函数返回结果 3
Value的取值用法
- 最简单的形式为:Value(设计器中的数据集名称,数据集列号)
- 例如:
=value("ds1",3);取ds1数据集中第3列的数据,返回一个数组。
下拉框的用法
- 多级下拉框是写死的的一个数据集;
- 对下拉框的绑定参数,就选择模板参数里面定义好的参数;
- 选项值来源,数据来源-数据集-然后选择对应的实际值和显示值;
- 如果是正常的下拉框就直接选择数据就可以了;
多级联动下拉框的使用
- 如果是多级联动的话,就是得用公式的写法,进行判断;
if(
len($分厂车间) = 0,
Embedded2.select(设备编号),
eval("Embedded2.select(设备编号,分厂车间='" + $分厂车间 + "')")
)
- if的用法,if就是简单的判断。如果true,就是第一个;false,就是第二个;

IF(
FIND("女士",A2) != 0,
"女士类商品",
IF(FIND("男士",A2) != 0,"男士类商品","其他")
)
- 如果「品类描述」中包含「女士」字段的就等于「女士类商品」,如果包含「男士」字段的就等于「男士类商品」,否则就为「其他」
Eval的用法

获取值-传值
- 通过JS传值;
- 通过getValue获取值,再通过setValue()传值。
setTimeout(function() {
var a = duchamp.getWidgetByName("设备编号下拉框").getValue();
if (a) {
duchamp.getWidgetByName("设备编号实际值").setValue(a);
} else {
}
}, 1000)
更新事件
在模板加载结束事件写 setInterval(function(){ duchamp.getWidgetByName("X轴折线图").refresh(); },3000)
单元格过滤
<https://help.fanruan.com/finereport/doc-view-327.html?source=4>