跳转至

网格视图非空判断

网格视图非空判断示例代码:

(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 "单据体没有数据,不允许保存";  
    }
})()

脚本说明

该脚本用于判断网格视图(子表)是否为空。通过获取当前文档的子文档,排除已删除的数据,然后判断是否还有有效数据。如果网格视图为空,则返回错误提示,不允许保存。

脚本功能

  1. 获取子文档: 使用 doc.getSubDocuments() 获取当前文档的所有子文档(网格视图数据)
  2. 排除已删除数据: 遍历子文档,使用 doc.isDelete() 判断是否已删除,只保留未删除的数据
  3. 判断是否为空: 检查有效数据列表的大小,如果为0则表示网格视图为空
  4. 返回错误提示: 如果为空,返回错误提示信息,阻止保存操作

使用场景

  • 保存前验证网格视图必须有数据
  • 提交前验证子表不能为空
  • 业务规则要求必须有明细数据
  • 数据完整性验证

扩展示例

示例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() 可能返回空集合,需要判断

验证流程

  1. 获取当前文档
  2. 获取所有子文档
  3. 遍历子文档,排除已删除的数据
  4. 判断有效数据数量
  5. 如果为0,返回错误提示
  6. 如果不为0,验证通过

常见应用

  1. 保存前验证: 在保存前验证网格视图必须有数据
  2. 提交前验证: 在提交前验证子表不能为空
  3. 数据完整性: 确保业务数据的完整性
  4. 业务规则: 实现特定的业务规则验证
  5. 数据质量: 保证数据质量,避免空数据

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f3crahbu4du9
文档更新时间: 2023-10-13 07:50 作者:john