我有一个关于INReceiptEntry的扩展图。我为自定义 DAC 设置了一个视图,我希望为其生成一个缓存,以便将对象插入其中。在生成要插入到缓存中的对象之一后,我使用 ViewName.Insert(Object(;(也使用了具有相同结果的 ViewName.Cache.Insert(Object((在图形扩展的 RowPersisting 处理程序中。这通常会将数据项存储在与 DAC 关联的相应数据库数据表中,但不会在数据库中存储任何内容。而不是 If 语句触发,我得到一个弹出窗口,说明未插入对象。这是我的代码:
public class INReceiptEntry_Extension : PXGraphExtension<INReceiptEntry>
{
public PXSelect<EMPWorkOrderINRegister> WorkOrderINRegisters;
#region Event Handlers
protected void INRegister_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
{
var row = (INRegister)e.Row;
var rowExt = PXCache<INRegister>.GetExtension<INRegisterExt>(row);
//Get Target Objects
foreach (INTranSplit split in PXSelect<INTranSplit, Where<INTranSplit.refNbr,
Equal<Required<INRegister.refNbr>>, And<INTranSplit.tranType, Equal<TranType>>>>
.Select(Base, Base.CurrentDocument.Current.RefNbr))
{
EMPWorkOrderINRegister WOINR = new EMPWorkOrderINRegister();
WOINR.Woid = rowExt.Usrwoid;
WOINR.RefNbr = split.RefNbr;
WOINR.SplitLineNbr = split.SplitLineNbr;
if (WorkOrderINRegisters.Insert(WOINR) == null)
{
Base.CurrentDocument.Ask("Did not insert WOINR:" + WOINR.RefNbr.ToString() + ", " + WOINR.SplitLineNbr.ToString(), MessageButtons.OK);
return;
}
}
}
#endregion
}
这没有插入到自定义缓存中的任何原因?使用图形扩展或在持久函数中执行此缓存插入与失败的原因有什么关系吗?
根据请求,DAC:
using System;
using PX.Data;
using PX.Objects.IN;
namespace Manufacturing
{
[Serializable]
public class EMPWorkOrderINRegister : IBqlTable
{
#region Id
[PXDBIdentity()]
[PXUIField(DisplayName = "Id")]
public int? Id { get; set; }
public class id : IBqlField { }
#endregion
#region Woid
[PXDBInt()]
[PXUIField(DisplayName = "Woid")]
public int? Woid { get; set; }
public class woid : IBqlField { }
#endregion
#region RefNbr
[PXDBString(15, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Receipt Number")]
public string RefNbr { get; set; }
public class refNbr : IBqlField { }
#endregion
#region SplitLineNbr
[PXDBInt()]
[PXUIField(DisplayName = "Split Line Nbr")]
public int? SplitLineNbr { get; set; }
public class splitLineNbr : IBqlField { }
#endregion
#region AvailableSNs
[PXString()]
[PXUIField(DisplayName = "Available SNs")]
public string AvailableSNs { get; set; }
public class availableSNs : IBqlField { }
#endregion
[PXString()]
[PXDBScalar(typeof(Search<INTranSplit.lotSerialNbr, Where<INTranSplit.refNbr, Equal<EMPWorkOrderINRegister.refNbr>,
And<INTranSplit.splitLineNbr, Equal<EMPWorkOrderINRegister.splitLineNbr>>>>))]
public string SelectedSN { get; set; }
public class selectedSN : IBqlField { }
}
}
您的DAC存在一个主要问题,即缺少关键字段。
INRegister_RowPersisting处理程序的其他改进领域。RowPersisting 处理程序旨在在将数据记录提交到数据库之前对其进行验证,或者取消特定数据记录的提交操作。有关更多详细信息,请参阅 Acumatica 框架 API 参考
适用于您的方案的更好方法是重写 Persist 方法,并在执行基本 Persist 方法之前插入缺少的 EMPWorkOrderINRegister 记录。如果基本持久方法失败,则使用 try-catch 语句并删除状态为"已插入"状态的 EMPWorkOrderINRegister 记录也是一个好主意。