历史版本4 :JS实现根据控件值自动匹配数据 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 问题描述

根据控件值自动匹配数据文档中介绍了2种联动方式,但是都需要在单元格失焦后才能触发联动,且一旦手动修改了联动公式所在单元格的数据,后续就无法再联动了。那么如果有以上两种需求的场景,该如何实现呢?

1.2 解决方案

利用控件的编辑后事件触发联动,在事件中根据当前值获取所需数据,赋给其他单元格。接口说明可以参考:控件接口单元格接口

注:不支持移动端


2. 示例编辑

2.1 设计模板

新建普通报表,设计填报表格,A3 单元格添加下拉框控件,B3~F3 添加文本框控件,如下图所示:


2.2 下拉框设置数据字典

选中 A3 单元格,给下拉框控件绑定数据字典,如下图所示:

2.3 添加数据集

新建数据集ds1,从FRDemo取数,sql语句为:SELECT * FROM 产品

2.4 设置编辑后事件

选中A3单元格,给下拉框控件添加一个编辑后事件。


JavaScript 代码如下:

var id=this.getValue();
//获取当前控件值
var cpmc=FR.remoteEvaluate("value('ds1','产品名称','产品ID','"+id+"')");
var dwsl=FR.remoteEvaluate("value('ds1','单位数量','产品ID','"+id+"')");
var cbj=FR.remoteEvaluate("value('ds1','成本价','产品ID','"+id+"')");
var dj=FR.remoteEvaluate("value('ds1','单价','产品ID','"+id+"')");
var kcl=FR.remoteEvaluate("value('ds1','库存量','产品ID','"+id+"')");
//根据产品ID去ds1数据集中获取其他字段的值
var row=FR.cellStr2ColumnRow(this.options.location).row;
//获取当前行号
_g().setCellValue(0,1,row,cpmc);
_g().setCellValue(0,2,row,dwsl);
_g().setCellValue(0,3,row,cbj);
_g().setCellValue(0,4,row,dj);
_g().setCellValue(0,5,row,kcl);
//给当前行其他单元格赋值

2.5 效果预览

1.gif


3. 模板下载编辑

4. 注意事项编辑

4.1 问题场景

该方案的联动效果在导入Excel时会不生效,原因是导入时不会触发控件的编辑后事件。如果是Excel导入联动的场景,可以采用另一段JS来触发控件的编辑后事件,实现导入联动效果。

4.2 实现步骤

1)给A3单元格的下拉框控件设置一个控件名称:id。

2)模板>模板web属性>填报页面设置处选择为该模板单独设置,添加一个Excel导入后事件。

JavaScript 代码如下:

setTimeout(function() {
var id = _g().getWidgetsByName("id");
//获取所有控件名称为id的控件
if (typeof(id[0]) != "undefined") {
for (i = 0; i < id.length; i++) {
id[i].fireEvent("afteredit");
//如果控件大于1个,则遍历触发编辑后事件
}
} else {
_g().getWidgetByName("id").fireEvent("afteredit");
//如果控件只有1个,则直接触发编辑后事件
}
}, 100)
3)效果预览

1.gif

4.3 模板下载

点击下载模板:JS实现根据导入值自动匹配数据.cpt