反馈已提交

网络繁忙

当前为10.0版本文档,只有最新版本的文档支持在线编辑修改,如果想创建/编辑文档,请移步至 最新版帮助文档

JS实现根据控件值自动匹配数据

  • 文档创建者:星踪
  • 历史版本:4
  • 最近更新:Leo.Tsai 于 2021-10-20
  • 1. 概述

    1.1 问题描述

    在 根据控件值自动匹配数据 中介绍了 2 种联动方式,但都需要在单元格失焦后才能触发联动,且一旦手动修改了联动公式所在单元格的数据,后续就无法再联动了。

    那么如果有以上两种需求的场景,该如何实现呢?

    1621395518878172.gif

    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. 模板下载

    已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\填报预览JS实例\JS实现根据控件值自动匹配数据.cpt

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


    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

    附件列表


    主题: 填报应用
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览

    售前咨询电话

    400-811-8890转1

    在线技术支持

    请前往「服务平台」,选择「在线支持」

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526