表体数据量较大且配置公式情况说明

1.1场景:
当主子表详情页面中的明细表体行中的某列是通过查询yonql获取值时,如果用公式实现,每行的数据加载都会去执行一次yonql。如果加载的数据量比较大时,就会出现卡顿且浏览器崩溃的情况。
如何解决这个问题,首先尽量不在子表中使用公式计算,推荐通过写脚本的方式代替公式计算。如果涉及到每行都有查询yonql操作,要用分页的方式去执行查询,分批返回后再做匹配赋值处理,减少查询yonql的次数。 具体操作步骤如下:
1.2操作步骤:
1.首先在表体行的右上方添加触发按钮
2.编写脚本,主要包括:分页处理、同步调用api函数、返回结果匹配赋值、查询yonql的api函数
//前端分页处理、同步调用api函数以及匹配赋值处理脚本
viewModel.get('button27vb') && viewModel.get('button27vb').on('click', function (data) {
// 单击按钮触发
let kehufenlei = viewModel.get('kehufenlei').getValue();//客户分类【yonql查询条件】
//处理分页
var gridModel = viewModel.get("X00301List");//实体清单中的子表集合属性
//获取表格当前页面所有的行数据
const rowAllDatas = gridModel.getRows();
if(rowAllDatas==0){
cb.utils.alert("请输入表体行数据");
return;
}
let arrData = []; //存储每页的结果
let pageSize = 100; //每页数量【可根据实际情况进行调整】
let rowSize = rowAllDatas.length;
let totalNum = Math.ceil(rowSize/pageSize); //总分页
let productConditions = "";
let productConditionsArr = []; //存储生成条件的数组
//下面的wuliaobianma为表体行的必填项且唯一标识类的字段名,使用时根据实际情况替换
if(rowAllDatas[rowSize-1].wuliaobianma==undefined||rowAllDatas[rowSize-1].wuliaobianma==null){
delete rowAllDatas[rowSize-1]; //移除最后一行空数据
rowSize = rowSize-1;
}
for(let i=0;i<rowSize;i++){
if(rowAllDatas[i].wuliaobianma==undefined||rowAllDatas[i].wuliaobianma==null){
let currentRowPage = i+1; //页面显示的表格行数据
cb.utils.alert("第"+currentRowPage+"行没有选择物料");
return;
}
//当前存储数据的数组下标
let currentBottom = i>=pageSize?parseInt(i/pageSize):0;
if ((i+1)%pageSize != 1 && rowAllDatas[i].wuliaobianma) {
productConditions = (productConditions + ", '" + rowAllDatas[i].wuliaobianma + "'");
} else if (rowAllDatas[i].wuliaobianma) {
productConditions = (productConditions + "'" + rowAllDatas[i].wuliaobianma + "'");
}
productConditionsArr.push(rowAllDatas[i]);//将数据添加到条件数组中
if(((i+1)%pageSize==0&¤tBottom<Math.ceil(rowSize/pageSize))||i==rowSize-1){
////定义两个键值对,condition:存储条件字符串,arr:存储生成条件的数组
arrData[currentBottom]={"condition":productConditions,"arr":productConditionsArr};
productConditions="";
productConditionsArr=[];
}
}
//调用后端函数
for(let i=0;i<arrData.length;i++){
//使用同步的方式调用api函数
let result = cb.rest.invokeFunction("GT9640AT12.api.queryYjByWlbm01", {kehufenlei: kehufenlei, _productConditions: arrData[i].condition},
function(err, res) {},viewModel, {async:false});
if (result.error != undefined) {
cb.utils.alert("请先选择促销地点编码!");
表体数据量较大且配置公式情况说明
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



