跳转至

视图跳转生成子表数据

本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1msnte15hck

脚本说明

该脚本用于在视图跳转时生成子表数据。当从视图跳转到表单时,可以根据视图选中的数据生成对应的子表记录。

常见实现方式

方式1:基本生成子表数据

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId != null && selectId.trim().length > 0){
        var relateId = relate.getId();
        var sel = selectId.replace(";","','");
        sel = "('"+sel+"')";

        // 查询选中的数据
        var sql = "select domainid,id,item_字段1,item_字段2 ";
        sql += "from tlk_源表单 ";
        sql += "where id in "+sel;

        var datas = queryBySQL(sql);

        if(datas != null && datas.size() > 0){
            var docProcess = getDocumentProcess();
            var formProcess = getFormProcess();
            var subForm = formProcess.doViewByFormName("子表表单名", getApplication());

            for(var it = datas.iterator(); it.hasNext(); ){
                var data = it.next();
                var dataId = data.getId();

                // 检查是否已存在
                var isExistSql = "select domainid ";
                isExistSql += "from tlk_子表表单 ";
                isExistSql += "where parent = '"+relateId+"' ";
                isExistSql += "and item_关联字段 = '"+dataId+"'";

                var isExist = countBySQL(isExistSql);

                if(isExist <= 0){
                    // 创建子表文档
                    var newDoc = docProcess.doNew(subForm, getWebUser(), createParamsTable());
                    newDoc.setParent(relateId);
                    newDoc.setAuthor(getWebUser().getId());
                    newDoc.setIstmp(false);
                    newDoc.setApplicationid(getApplication());
                    newDoc.setDomainid(getWebUser().getDomainid());

                    // 复制数据
                    newDoc.addStringItem("字段1", data.getItemValueAsString("字段1"));
                    newDoc.addDoubleItem("字段2", data.getItemValueAsDouble("字段2"));
                    newDoc.addStringItem("关联字段", dataId);

                    docProcess.doCreate(newDoc);
                }
            }
        }
    }
})();

方式2:使用DOC.buileDocument生成

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId != null && selectId.trim().length > 0){
        var relateId = relate.getId();
        var sel = selectId.replace(";","','");
        sel = "('"+sel+"')";

        var sql = "select domainid,id,item_字段1,item_字段2 ";
        sql += "from tlk_源表单 ";
        sql += "where id in "+sel;

        var datas = queryBySQL(sql);

        if(datas != null && datas.size() > 0){
            var formName = "子表表单名";

            for(var it = datas.iterator(); it.hasNext(); ){
                var data = it.next();
                var dataId = data.getId();

                // 检查是否已存在
                var isExistSql = "select domainid ";
                isExistSql += "from tlk_子表表单 ";
                isExistSql += "where parent = '"+relateId+"' ";
                isExistSql += "and item_关联字段 = '"+dataId+"'";

                var isExist = countBySQL(isExistSql);

                if(isExist <= 0){
                    // 使用DOC.buileDocument生成
                    var params = createParamsTable();
                    params.setParameter("字段1", data.getItemValueAsString("字段1"));
                    params.setParameter("字段2", data.getItemValueAsString("字段2"));
                    params.setParameter("关联字段", dataId);

                    var subDoc = DOC.buileDocument(formName, params);
                    subDoc.setParent(relateId);
                    DOC.createOrUpdate(subDoc);
                }
            }
        }
    }
})();

方式3:批量生成并返回结果

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId == null || selectId.trim().length == 0){
        return "请选择数据";
    }

    var relateId = relate.getId();
    var sel = selectId.replace(";","','");
    sel = "('"+sel+"')";

    var sql = "select domainid,id,item_字段1 ";
    sql += "from tlk_源表单 ";
    sql += "where id in "+sel;

    var datas = queryBySQL(sql);
    var successCount = 0;
    var failCount = 0;
    var existCount = 0;

    if(datas != null && datas.size() > 0){
        var docProcess = getDocumentProcess();
        var formProcess = getFormProcess();
        var subForm = formProcess.doViewByFormName("子表表单名", getApplication());

        for(var it = datas.iterator(); it.hasNext(); ){
            var data = it.next();
            var dataId = data.getId();

            // 检查是否已存在
            var isExistSql = "select domainid ";
            isExistSql += "from tlk_子表表单 ";
            isExistSql += "where parent = '"+relateId+"' ";
            isExistSql += "and item_关联字段 = '"+dataId+"'";

            var isExist = countBySQL(isExistSql);

            if(isExist > 0){
                existCount++;
            }else{
                try{
                    var newDoc = docProcess.doNew(subForm, getWebUser(), createParamsTable());
                    newDoc.setParent(relateId);
                    newDoc.setAuthor(getWebUser().getId());
                    newDoc.setIstmp(false);
                    newDoc.setApplicationid(getApplication());
                    newDoc.setDomainid(getWebUser().getDomainid());
                    newDoc.addStringItem("字段1", data.getItemValueAsString("字段1"));
                    newDoc.addStringItem("关联字段", dataId);
                    docProcess.doCreate(newDoc);
                    successCount++;
                }catch(e){
                    failCount++;
                }
            }
        }
    }

    return "成功:" + successCount + ",已存在:" + existCount + ",失败:" + failCount;
})();

扩展示例

示例1:生成子表并设置更多字段

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId != null && selectId.trim().length > 0){
        var relateId = relate.getId();
        var sel = selectId.replace(";","','");
        sel = "('"+sel+"')";

        var sql = "select domainid,id,item_字段1,item_字段2,item_字段3 ";
        sql += "from tlk_源表单 ";
        sql += "where id in "+sel;

        var datas = queryBySQL(sql);

        if(datas != null && datas.size() > 0){
            var docProcess = getDocumentProcess();
            var formProcess = getFormProcess();
            var subForm = formProcess.doViewByFormName("子表表单名", getApplication());

            for(var it = datas.iterator(); it.hasNext(); ){
                var data = it.next();
                var dataId = data.getId();

                var isExistSql = "select domainid ";
                isExistSql += "from tlk_子表表单 ";
                isExistSql += "where parent = '"+relateId+"' ";
                isExistSql += "and item_关联字段 = '"+dataId+"'";

                if(countBySQL(isExistSql) <= 0){
                    var newDoc = docProcess.doNew(subForm, getWebUser(), createParamsTable());
                    newDoc.setParent(relateId);
                    newDoc.setAuthor(getWebUser().getId());
                    newDoc.setIstmp(false);
                    newDoc.setApplicationid(getApplication());
                    newDoc.setDomainid(getWebUser().getDomainid());

                    // 设置多个字段
                    newDoc.addStringItem("字段1", data.getItemValueAsString("字段1"));
                    newDoc.addStringItem("字段2", data.getItemValueAsString("字段2"));
                    newDoc.addDoubleItem("字段3", data.getItemValueAsDouble("字段3"));
                    newDoc.addStringItem("关联字段", dataId);
                    newDoc.addStringItem("创建时间", format(new Date(), "yyyy-MM-dd HH:mm:ss"));

                    docProcess.doCreate(newDoc);
                }
            }
        }
    }
})();

示例2:根据条件生成子表

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId != null && selectId.trim().length > 0){
        var relateId = relate.getId();
        var sel = selectId.replace(";","','");
        sel = "('"+sel+"')";

        var sql = "select domainid,id,item_字段1,item_状态 ";
        sql += "from tlk_源表单 ";
        sql += "where id in "+sel;

        var datas = queryBySQL(sql);

        if(datas != null && datas.size() > 0){
            var docProcess = getDocumentProcess();
            var formProcess = getFormProcess();
            var subForm = formProcess.doViewByFormName("子表表单名", getApplication());

            for(var it = datas.iterator(); it.hasNext(); ){
                var data = it.next();
                var status = data.getItemValueAsString("状态");

                // 根据条件判断是否生成
                if(status != null && status === "已审核"){
                    var dataId = data.getId();
                    var isExistSql = "select domainid ";
                    isExistSql += "from tlk_子表表单 ";
                    isExistSql += "where parent = '"+relateId+"' ";
                    isExistSql += "and item_关联字段 = '"+dataId+"'";

                    if(countBySQL(isExistSql) <= 0){
                        var newDoc = docProcess.doNew(subForm, getWebUser(), createParamsTable());
                        newDoc.setParent(relateId);
                        newDoc.setAuthor(getWebUser().getId());
                        newDoc.setIstmp(false);
                        newDoc.setApplicationid(getApplication());
                        newDoc.setDomainid(getWebUser().getDomainid());
                        newDoc.addStringItem("字段1", data.getItemValueAsString("字段1"));
                        newDoc.addStringItem("关联字段", dataId);
                        docProcess.doCreate(newDoc);
                    }
                }
            }
        }
    }
})();

示例3:生成子表并启动流程

(function(){
    var relate = getRelateDocument();
    var selectId = getParameter("_selects");

    if(selectId != null && selectId.trim().length > 0){
        var relateId = relate.getId();
        var sel = selectId.replace(";","','");
        sel = "('"+sel+"')";

        var sql = "select domainid,id,item_字段1 ";
        sql += "from tlk_源表单 ";
        sql += "where id in "+sel;

        var datas = queryBySQL(sql);

        if(datas != null && datas.size() > 0){
            var docProcess = getDocumentProcess();
            var formProcess = getFormProcess();
            var subForm = formProcess.doViewByFormName("子表表单名", getApplication());

            for(var it = datas.iterator(); it.hasNext(); ){
                var data = it.next();
                var dataId = data.getId();

                var isExistSql = "select domainid ";
                isExistSql += "from tlk_子表表单 ";
                isExistSql += "where parent = '"+relateId+"' ";
                isExistSql += "and item_关联字段 = '"+dataId+"'";

                if(countBySQL(isExistSql) <= 0){
                    var newDoc = docProcess.doNew(subForm, getWebUser(), createParamsTable());
                    newDoc.setParent(relateId);
                    newDoc.setAuthor(getWebUser().getId());
                    newDoc.setIstmp(false);
                    newDoc.setApplicationid(getApplication());
                    newDoc.setDomainid(getWebUser().getDomainid());
                    newDoc.addStringItem("字段1", data.getItemValueAsString("字段1"));
                    newDoc.addStringItem("关联字段", dataId);
                    docProcess.doCreate(newDoc);

                    // 启动流程
                    var params = createParamsTable();
                    params.setParameter("_flowid", "流程ID");
                    docProcess.doStartFlowOrUpdate(newDoc, params, getWebUser());
                }
            }
        }
    }
})();

关键函数说明

  • getRelateDocument(): 获取关联文档(主表文档)
  • getParameter("_selects"): 获取视图中选中的记录ID
  • queryBySQL(sql): 执行SQL查询
  • countBySQL(sql): 统计查询结果数量
  • getDocumentProcess(): 获取文档处理对象
  • getFormProcess(): 获取表单处理对象
  • formProcess.doViewByFormName(): 根据表单名称获取表单对象
  • docProcess.doNew(): 创建新文档
  • doc.setParent(parentId): 设置父文档ID
  • docProcess.doCreate(doc): 创建并保存文档
  • DOC.buileDocument(): 构建文档对象
  • DOC.createOrUpdate(doc): 创建或更新文档

视图跳转说明

  • 视图跳转: 从视图选择数据后跳转到表单
  • 选中数据: 通过 getParameter("_selects") 获取选中的记录ID
  • 关联文档: 通过 getRelateDocument() 获取主表文档
  • 子表生成: 根据选中的数据在主表下生成子表记录

数据格式处理

选中ID格式

  • 格式: "id1;id2;id3"(多个ID用分号分隔)
  • 处理: selectId.replace(";","','") 转换为SQL IN条件格式
  • SQL格式: "('id1','id2','id3')"

注意事项

  • ⚠️ 选中数据: 需要判断 _selects 参数是否存在
  • ⚠️ 重复检查: 建议检查子表是否已存在,避免重复生成
  • ⚠️ 父文档设置: 必须使用 setParent() 设置父文档ID
  • ⚠️ 字段映射: 确保源表单字段和子表字段正确映射
  • ⚠️ ID格式: 选中ID格式处理需要注意,末尾不能有空字符
  • 视图选择框选的值不能在末尾有空字符,否则选不上
  • 网格视图必须是设计模式转换为SQL模式
  • 建议在生成前先检查数据是否存在

使用场景

  • 视图选择数据生成子表
  • 批量生成子表数据
  • 数据关联创建
  • 主子表数据同步

如需查看完整脚本代码,请访问源文档链接。