视图跳转生成子表数据¶
本文档内容来源于 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"): 获取视图中选中的记录IDqueryBySQL(sql): 执行SQL查询countBySQL(sql): 统计查询结果数量getDocumentProcess(): 获取文档处理对象getFormProcess(): 获取表单处理对象formProcess.doViewByFormName(): 根据表单名称获取表单对象docProcess.doNew(): 创建新文档doc.setParent(parentId): 设置父文档IDdocProcess.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模式
- 建议在生成前先检查数据是否存在
使用场景¶
- 视图选择数据生成子表
- 批量生成子表数据
- 数据关联创建
- 主子表数据同步
如需查看完整脚本代码,请访问源文档链接。