数据集是E6开发平台新增加的一个取数功能,有什么用呢?我们可以通过“数据集”控件,模拟出一个更安全高效的取数方法,供需要的地方进行调用。如果不用数据集你也可以直接通过ajax调用E6页面接口进行取数,但是你不能直接指定取数字段,取数条件也需要自行构造。所以使用数据集更加安全和高效(1、只取我们指定的字段可有效提升取数性能;2、只取需要的字段避免更多的数据传输和暴露)
如下图,假设我们在“客户信息”表单中增加了一个“数据集”,设置了属性:
数据集名:getOrders
所属单据:Orders 这里是点选的单据编号,表示这个数据集取哪个单据的数据;
列设置:和子表的列设置一样,设置要取“所属单据”的哪几列到数据集中来;
过滤条件:设置数据集的取数条件,如果条件值要用到当前主单据的字段,可以使用E6脚本,如:GetValue("当前主单据上的字段名");
数据权限:如果True则表示数据集返回的数据只能是当前用户有权限的数据,无权限的数据哪怕满足过滤条件也不会返回;
数据行数:表示数据集返回的最大行数,默认1,0则表示不限制,如果你所属单据对应的记录过多不建议设置为0.
上面设置好了数据集,怎么用呢?
上面我们设置了“数据集名”,那么就自动在页面中生成一个javascript方法,方法名就是我们设置的“程序集名”,所以程序集名只能是字母、数字、下划线组成
可以看出来程序集其实就是给我们在页面上构造了一个取数方法,好处就是让用户可以很轻松使用。
怎么用呢?假设我们需要在某个字段改变后调某个“数据集”取数并计算的话,可以直接在这个字段的“内容改变”事件(如果是选择引用数据按钮的就是“选择后事件”)中写javascript代码,其实就是调数据集生成的getOrders方法,getOrders取数成功后,会通过我们提供的回调函数把数据传回来:
getOrders(function(data){ if(!data) { console.error('返回结果为null请开发人员检查'); return; } if(data.code == '1') { // 出错了 console.error(data.msg); return; } if(!data.rows || data.rows.length == 0) { console.error('没有数据,请自行处理'); } var row = data.rows[0]; var str = row['这里填数据集上取的字段名']; setvalue('这里填此主表单上的字段名', str); });
回调的data结构如下,其中code为0表示成功返回数据,code为1表示出错 ,错误信息在msg字段,如果成功返回了数据,则rows中可以取到返回的数据:
{ "code": "0", "msg": "", "rows": [ { "__ID__": "", "__NO__": "", "__Name__": "", } ] }
这就是“数据集”,让您可以更轻松获取想要的数据,而不需要关注于E6的取数API。
案例:下面我们以2个实际案例来进行说明,通过这两个案例,你可以更好地理解数据集怎么能够做到帮助我们快速实现想要的校验功能,因为数据集本就是提供了一种可视化的取数方法封装,方便对这个取数方法进行调用。
案例1:录入保单编号的时候,如果保单编号存在了则用tips的方式进行提醒,如:
案例2:保存保单的时候,校验保单编号如果存在了,则提醒:
在保单表单上增加数据集(方法上面说过,这里仅看属性怎么设置即可):
数据集名:policyExists 这就是我们后面脚本中调用的方法名;
所属单据:点击此属性后面的按钮选择,由于我们要校验保单编号是否已经存在了,所以这里选择的就是当前表单的编号;
列设置:由于我们只需要判断是否存在,所以这里我们只选择一列“保单编号”即可,如果无需要避免选择太多列;
过滤条件:这个非常重要,要判断保单编号是否已经存在了,可以这么理解:取当前正在输入的保单号(用E6脚本:GetValue("__Name__"),因为保单号字段我们用了__Name__),然后去系统中查询,所以有:保单管理.保单编号 = GetValue("__Name__") 这一行,那我们查询的时候总不可能连当前自己这一条记录也判断吧?我们要判断的是除了我这一条记录以外还有没有保单号相同的,所以我们要排除本条记录,所以有:保单管理.记录ID 不等于 GetValue("__ID__")这一行。所以正确设置条件是关键。
设置好记录集后,怎么使用?
案例1需求:“录入保单编号的时候,如果保单编号存在了则用tips的方式进行提醒”,所以如下图选中“保单编号”字段后,设置其“内容改变”事件,在“JS脚本”页输入脚本,可以看到我们脚本中直接调用前面的数据集policyExists,并在回调方法中,判断data.rows是否大于0(表示返回了数据,表示此保单号已经存在)是否有数据,并调用tips在保单号上方显示一个tips。
policyExists(function(data){ if(data.rows && data.rows.length > 0) { $("#__Name__").tips({msg:"保单号"+getvalue("__Name__")+"已经存在。"}); } });
案例2需求:“保存保单的时候,校验保单编号如果存在了,则提醒。”在保单表单的“保存后事件”的“JS脚本”中输入使用下面的脚本。同样是调用policyExists数据集方法,当判断data.rows大于0,表示保单编号已经存在了,那么调用E6的$.bo.confirm进行弹消息提醒,如果点了确认,则继续调用doSaveSubit()提交保存数据,否则执行最后的return(这个很重要)
policyExists(function(data){ if(data.rows && data.rows.length > 0) { $.bo.confirm("保单号"+getvalue("__Name__")+"已经存在。是否继续保存?", function(r) { if (r) { doSaveSubmit(); } }) } else { doSaveSubmit(); } }); return;
小知识:
怎能查看数据集对于的javascript方法呢?打开浏览器,进入程序集所在的这个主表单(不是程序集要取数的“所属单据”属性对应的 表单),然后空白处(别点字段)右键 - 查看框架的源代码(记住:不是查看网页源代码)
然后在打开的框架源代码中,CTRL+F搜索数据集名(比如这里例子的是getOrders),这样的话如果您稍微了解下javascript那就哪怕没有上面的调用例子,您也可以很轻松调用这个程序集的取数方法了:
那怎么知道程序集返回的字段名呢?以Chrome浏览器为例,按F12进入开发者模式后,在“Network”也,过滤框中输入“.action”后,当你的字段改变触发程序集调用后,会出现如下图所示的一条DataSet.action的记录,单击后在右侧Response中可以看到返回值,全选拷贝出来就可以看到程序集返回的数据了: