网格视图非空判断¶
网格视图非空判断示例代码:
(function () {
var doc=getCurrentDocument();
var subs = doc.getSubDocuments()
//排除删除
var list = createObject("java.util.ArrayList")
for(var iter = subs.iterator();iter.hasNext();){
var doc = iter.next();
//true表示删除
if(!doc.isDelete()){
//只添加不是删除的数据
list.add(doc);
}
}
if (list.size()==0){
println ("total~~~");
return "单据体没有数据,不允许保存";
}
})()
脚本说明¶
该脚本用于判断网格视图(子表)是否为空。通过获取当前文档的子文档,排除已删除的数据,然后判断是否还有有效数据。如果网格视图为空,则返回错误提示,不允许保存。
脚本功能¶
- 获取子文档: 使用
doc.getSubDocuments()获取当前文档的所有子文档(网格视图数据) - 排除已删除数据: 遍历子文档,使用
doc.isDelete()判断是否已删除,只保留未删除的数据 - 判断是否为空: 检查有效数据列表的大小,如果为0则表示网格视图为空
- 返回错误提示: 如果为空,返回错误提示信息,阻止保存操作
使用场景¶
- 保存前验证网格视图必须有数据
- 提交前验证子表不能为空
- 业务规则要求必须有明细数据
- 数据完整性验证
扩展示例¶
示例1:在保存前脚本中使用¶
(function () {
var doc = getCurrentDocument();
var subs = doc.getSubDocuments();
// 排除删除的数据
var list = createObject("java.util.ArrayList");
for(var iter = subs.iterator(); iter.hasNext(); ){
var subDoc = iter.next();
if(!subDoc.isDelete()){
list.add(subDoc);
}
}
if(list.size() == 0){
return "单据体没有数据,不允许保存!";
}
})();
示例2:判断特定子表是否为空¶
(function () {
var doc = getCurrentDocument();
var subTableName = "子表名称";
var subs = doc.getSubDocuments();
// 排除删除的数据
var list = createObject("java.util.ArrayList");
for(var iter = subs.iterator(); iter.hasNext(); ){
var subDoc = iter.next();
// 判断是否为指定子表
if(subDoc.getFormname().indexOf(subTableName) >= 0 && !subDoc.isDelete()){
list.add(subDoc);
}
}
if(list.size() == 0){
return "【" + subTableName + "】没有数据,不允许保存!";
}
})();
示例3:判断多个子表是否都为空¶
(function () {
var doc = getCurrentDocument();
var subs = doc.getSubDocuments();
// 排除删除的数据
var list = createObject("java.util.ArrayList");
for(var iter = subs.iterator(); iter.hasNext(); ){
var subDoc = iter.next();
if(!subDoc.isDelete()){
list.add(subDoc);
}
}
if(list.size() == 0){
return "所有单据体都没有数据,不允许保存!";
}
// 可以继续判断其他条件
return true;
})();
示例4:判断子表数据数量是否符合要求¶
(function () {
var doc = getCurrentDocument();
var subs = doc.getSubDocuments();
// 排除删除的数据
var list = createObject("java.util.ArrayList");
for(var iter = subs.iterator(); iter.hasNext(); ){
var subDoc = iter.next();
if(!subDoc.isDelete()){
list.add(subDoc);
}
}
var count = list.size();
if(count == 0){
return "单据体没有数据,不允许保存!";
}else if(count < 2){
return "单据体至少需要2条数据!";
}else if(count > 100){
return "单据体数据不能超过100条!";
}
return true;
})();
示例5:判断子表特定字段是否有值¶
(function () {
var doc = getCurrentDocument();
var subs = doc.getSubDocuments();
// 排除删除的数据
var list = createObject("java.util.ArrayList");
for(var iter = subs.iterator(); iter.hasNext(); ){
var subDoc = iter.next();
if(!subDoc.isDelete()){
// 检查关键字段是否有值
var keyField = subDoc.getItemValueAsString("关键字段");
if(keyField != null && keyField.trim().length > 0){
list.add(subDoc);
}
}
}
if(list.size() == 0){
return "单据体中没有有效的关键字段数据,不允许保存!";
}
})();
关键函数说明¶
getCurrentDocument(): 获取当前文档对象doc.getSubDocuments(): 获取当前文档的所有子文档(网格视图数据)createObject("java.util.ArrayList"): 创建ArrayList对象用于存储有效数据subs.iterator(): 获取子文档的迭代器iter.hasNext(): 判断是否还有下一个元素iter.next(): 获取下一个子文档对象doc.isDelete(): 判断文档是否已删除(true表示已删除)list.add(doc): 将文档添加到列表list.size(): 获取列表大小(数据条数)
网格视图说明¶
- 网格视图: 即子表,是主表下的明细数据
- 子文档: 网格视图中的每一行数据对应一个子文档
- 已删除数据: 在网格视图中标记为删除的数据,使用
isDelete()判断
注意事项¶
- ⚠️ 必须排除已删除数据: 使用
isDelete()判断,只统计未删除的数据 - ⚠️ 在保存前脚本中使用: 该脚本通常放在"保存前"脚本中,用于验证数据
- ⚠️ 返回错误信息: 如果验证失败,返回错误提示字符串,系统会阻止保存
- ⚠️ 返回true或空: 如果验证通过,返回
true或不返回值 - 变量名注意:在循环中使用
var doc会覆盖外层的doc变量,建议使用var subDoc getSubDocuments()返回的是所有子文档,包括已删除的- 如果网格视图为空,
getSubDocuments()可能返回空集合,需要判断
验证流程¶
- 获取当前文档
- 获取所有子文档
- 遍历子文档,排除已删除的数据
- 判断有效数据数量
- 如果为0,返回错误提示
- 如果不为0,验证通过
常见应用¶
- 保存前验证: 在保存前验证网格视图必须有数据
- 提交前验证: 在提交前验证子表不能为空
- 数据完整性: 确保业务数据的完整性
- 业务规则: 实现特定的业务规则验证
- 数据质量: 保证数据质量,避免空数据
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f3crahbu4du9
文档更新时间: 2023-10-13 07:50 作者:john