You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个DAC的数据完整复制到另一个DAC?代码报错求助

问题分析与修复方案

让我一步步拆解你两段代码里的问题,再给出能正常工作的实现方式:

第一段代码无效果的原因

  1. 错误获取源数据:你在RowPersisting事件里用this.RoutingDetails.Select(),这个方法只会返回数据视图里的第一条记录,而不是所有需要复制的行。而且RowPersisting是针对单条正在持久化的RoutingOperation行触发的事件,应该处理当前的e.Row,而不是去查询整个视图。
  2. 跨DAC复制方式错误:CreateCopy方法只能复制同类型DAC的对象,你直接把RoutingOperation实例复制后插入RoutingDetailRevs,因为类型不匹配,这个操作根本不会生效。

第二段代码报错的原因

PXCache<T>.CreateCopy不是静态方法,你不能直接通过类名调用,必须使用具体的缓存实例(比如this.RoutingDetailRevs.Cache)来调用这个方法。而且同样存在跨DAC直接复制的问题——不同DAC类型的对象无法通过CreateCopy直接转换。


正确的实现思路

要把RoutingOperation的数据复制到RoutingOperationRev,核心是:针对每一条源DAC记录,创建目标DAC的新实例,手动(或用工具)映射对应字段,再插入到目标数据视图中。

方案1:单条行复制(针对RowPersisting事件)

如果只需要在每条RoutingOperation持久化时,复制当前行到目标DAC,用这段代码:

protected void RoutingOperation_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
{
    var sourceRow = (RoutingOperation)e.Row;
    if (sourceRow == null) return;

    // 创建目标DAC的新实例
    var targetRow = new RoutingOperationRev();

    // 手动映射字段(请根据实际字段名调整)
    targetRow.OperationID = sourceRow.OperationID;
    targetRow.Description = sourceRow.Description;
    targetRow.WorkCenterID = sourceRow.WorkCenterID;
    // 继续添加其他需要复制的字段...

    // 将目标行插入到对应数据视图
    this.RoutingDetailRevs.Insert(targetRow);
}

方案2:批量复制所有行

如果需要一次性复制所有RoutingOperation行到目标DAC(比如在保存单据时),可以在主DAC的Persisting事件中处理:

protected void Routing_Persisting(PXCache cache, PXPersistingEventArgs e)
{
    // 只在插入或更新单据时执行复制
    if (e.Operation is PXDBOperation.Insert or PXDBOperation.Update)
    {
        // 可选:先清空已有的目标行,避免重复数据
        foreach (var existingRev in this.RoutingDetailRevs.Select())
        {
            this.RoutingDetailRevs.Delete(existingRev);
        }

        // 遍历所有源行,逐个复制
        foreach (var sourceRow in this.RoutingDetails.Select())
        {
            var targetRow = new RoutingOperationRev();
            
            // 字段映射,这里可以用PXCopyPasteHelper简化(如果字段名/类型匹配)
            PXCopyPasteHelper.Copy(cache, sourceRow, this.RoutingDetailRevs.Cache, targetRow);
            
            // 手动补充PXCopyPasteHelper没覆盖的字段(如果有)
            // targetRow.CustomField = sourceRow.CustomField;

            this.RoutingDetailRevs.Insert(targetRow);
        }
    }
}

小技巧:用PXCopyPasteHelper简化字段映射

如果两个DAC的字段名称和数据类型大部分一致,可以用PXCopyPasteHelper.Copy()自动匹配复制,省去手动逐一赋值的麻烦,就像上面方案2里用到的那样。

内容的提问来源于stack exchange,提问作者Helmi Nandani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:10