跳转至

视图跳转按钮复制数据

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

脚本说明

该脚本用于在视图跳转按钮中复制数据。当从视图跳转到表单时,可以将视图选中记录的数据复制到目标表单中。

常见实现方式

方式1:基本复制数据

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制字段值
        currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));
        currentDoc.findItem("字段2").setValue(sourceDoc.getItemValueAsString("字段2"));
        currentDoc.findItem("字段3").setValue(sourceDoc.getItemValueAsDouble("字段3"));

        return "数据复制成功";
    }

    return "数据复制失败";
})();

方式2:复制多个字段

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 定义要复制的字段列表
        var fields = ["字段1", "字段2", "字段3", "字段4", "字段5"];

        for(var i = 0; i < fields.length; i++){
            var fieldName = fields[i];
            var fieldValue = sourceDoc.getItemValueAsString(fieldName);
            if(fieldValue != null && fieldValue.trim().length > 0){
                currentDoc.findItem(fieldName).setValue(fieldValue);
            }
        }

        return "数据复制成功";
    }

    return "数据复制失败";
})();

方式3:复制并转换数据

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制并转换数据
        var sourceValue1 = sourceDoc.getItemValueAsString("源字段1");
        currentDoc.findItem("目标字段1").setValue(sourceValue1);

        var sourceValue2 = sourceDoc.getItemValueAsDouble("源字段2");
        currentDoc.findItem("目标字段2").setValue(sourceValue2 * 1.1);  // 转换计算

        var sourceDate = sourceDoc.getItemValueAsDate("源日期");
        currentDoc.findItem("目标日期").setValue(format(sourceDate, "yyyy-MM-dd"));

        return "数据复制成功";
    }

    return "数据复制失败";
})();

方式4:复制子表数据

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制主表字段
        currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));

        // 复制子表数据
        var sourceSubTable = sourceDoc.getSubTable("源子表名");
        if(sourceSubTable != null && sourceSubTable.size() > 0){
            var targetSubTable = currentDoc.getSubTable("目标子表名");

            for(var i = 0; i < sourceSubTable.size(); i++){
                var sourceRow = sourceSubTable.get(i);
                var targetRow = targetSubTable.addRow();

                targetRow.findItem("字段1").setValue(sourceRow.getItemValueAsString("字段1"));
                targetRow.findItem("字段2").setValue(sourceRow.getItemValueAsString("字段2"));
            }
        }

        return "数据复制成功";
    }

    return "数据复制失败";
})();

扩展示例

示例1:复制数据并设置默认值

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制数据
        currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));
        currentDoc.findItem("字段2").setValue(sourceDoc.getItemValueAsString("字段2"));

        // 设置默认值
        currentDoc.findItem("状态").setValue("新建");
        currentDoc.findItem("创建时间").setValue(format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        currentDoc.findItem("创建人").setValue(getWebUser().getName());

        return "数据复制成功";
    }

    return "数据复制失败";
})();

示例2:批量复制多条数据

(function(){
    var selectIds = getParameter("_selects");
    if(selectIds == null || selectIds.trim().length == 0){
        return "请选择数据";
    }

    var ids = selectIds.split(";");
    var successCount = 0;
    var failCount = 0;

    for(var i = 0; i < ids.length; i++){
        var sourceDocId = ids[i];
        if(sourceDocId == null || sourceDocId.trim().length == 0){
            continue;
        }

        try{
            var docProcess = getDocumentProcess();
            var sourceDoc = docProcess.doView(sourceDocId);

            if(sourceDoc != null){
                // 创建新文档
                var formProcess = getFormProcess();
                var form = formProcess.doViewByFormName("目标表单名", getApplication());
                var newDoc = docProcess.doNew(form, getWebUser(), createParamsTable());

                // 复制数据
                newDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));
                newDoc.findItem("字段2").setValue(sourceDoc.getItemValueAsString("字段2"));

                // 保存文档
                docProcess.doCreate(newDoc);
                successCount++;
            }else{
                failCount++;
            }
        }catch(e){
            failCount++;
        }
    }

    return "成功:" + successCount + ",失败:" + failCount;
})();

示例3:复制数据并关联原文档

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制数据
        currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));
        currentDoc.findItem("字段2").setValue(sourceDoc.getItemValueAsString("字段2"));

        // 关联原文档ID
        currentDoc.findItem("源文档ID").setValue(sourceDocId);
        currentDoc.findItem("源文档名称").setValue(sourceDoc.getItemValueAsString("名称"));

        return "数据复制成功";
    }

    return "数据复制失败";
})();

示例4:根据条件选择性复制

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();
        var sourceStatus = sourceDoc.getItemValueAsString("状态");

        // 根据条件决定是否复制
        if(sourceStatus != null && sourceStatus === "已审核"){
            // 复制数据
            currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));
            currentDoc.findItem("字段2").setValue(sourceDoc.getItemValueAsString("字段2"));
            return "数据复制成功";
        }else{
            return "源数据状态不符合要求,无法复制";
        }
    }

    return "数据复制失败";
})();

示例5:复制数据并计算

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

    var sourceDocId = selectId.split(";")[0];
    var docProcess = getDocumentProcess();
    var sourceDoc = docProcess.doView(sourceDocId);

    if(sourceDoc != null){
        var currentDoc = getCurrentDocument();

        // 复制基础数据
        currentDoc.findItem("字段1").setValue(sourceDoc.getItemValueAsString("字段1"));

        // 复制并计算
        var sourceAmount = sourceDoc.getItemValueAsDouble("金额");
        var discount = 0.9;  // 折扣
        currentDoc.findItem("金额").setValue(sourceAmount * discount);

        // 复制日期并计算
        var sourceDate = sourceDoc.getItemValueAsDate("日期");
        var targetDate = new Date(sourceDate.getTime() + 7 * 24 * 60 * 60 * 1000);  // 加7天
        currentDoc.findItem("日期").setValue(format(targetDate, "yyyy-MM-dd"));

        return "数据复制成功";
    }

    return "数据复制失败";
})();

关键函数说明

  • getParameter("_selects"): 获取视图中选中的记录ID
  • getCurrentDocument(): 获取当前文档对象(目标文档)
  • docProcess.doView(docId): 根据文档ID查看文档(源文档)
  • doc.findItem("字段名"): 查找文档中的字段
  • setValue(value): 设置字段值
  • getItemValueAsString("字段名"): 获取字符串类型字段值
  • getItemValueAsDouble("字段名"): 获取数字类型字段值
  • getItemValueAsDate("字段名"): 获取日期类型字段值
  • doc.getSubTable("子表名"): 获取子表对象
  • subTable.addRow(): 添加子表行

数据复制说明

  • 源文档: 从视图选中的文档,通过 doView() 获取
  • 目标文档: 当前打开的文档,通过 getCurrentDocument() 获取
  • 字段映射: 源文档字段和目标文档字段的对应关系
  • 数据类型: 注意字段类型匹配,字符串、数字、日期等

注意事项

  • ⚠️ 选中数据: 需要判断 _selects 参数是否存在
  • ⚠️ 字段名称: 源字段和目标字段名称需要正确匹配
  • ⚠️ 字段类型: 注意字段类型匹配,确保数据类型正确
  • ⚠️ 空值处理: 源字段可能为空,需要判断
  • ⚠️ 子表复制: 复制子表时需要先获取子表对象,然后逐行复制
  • 视图选择框选的值不能在末尾有空字符,否则选不上
  • 建议在复制前先判断源文档是否存在
  • 可以结合条件判断,选择性复制数据

使用场景

  • 视图选择数据复制到表单
  • 数据模板复制
  • 批量数据复制
  • 数据关联复制
  • 数据转换复制

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