图形扩展缓存中的插入记录未保存到数据库
Inserted Records in Cache on Graph Extension Not Saving to Database
我在 INReceiptEntry 上有一个扩展图。我为自定义 DAC 设置了一个视图,我希望为其生成缓存,以便将对象插入其中。在生成要插入缓存的对象之一后,我使用 ViewName.Insert(Object); (也使用 ViewName.Cache.Insert(Object) 得到相同的结果)在图形扩展的 RowPersisting 处理程序中。这通常会将数据项存储在与 DAC 关联的相应数据库数据 table 中,但数据库中不会存储任何内容。而不是 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
}
没有插入自定义缓存的原因是什么?在 Persisting 函数中使用图形扩展或执行此缓存插入与失败的原因有什么关系吗?
根据要求,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 { }
}
}
Eric,你的 DAC 有一个主要问题,就是缺少关键字段。
INRegister_RowPersisting 处理程序的其他改进领域。 RowPersisting 处理程序旨在在数据记录提交到数据库之前验证数据记录或取消特定数据记录的提交操作。详情请参考Acumatica Framework API Reference
对于您的场景,更好的方法是覆盖 Persist 方法并在执行基本 Persist 方法之前插入缺少的 EMPWorkOrderINRegister 记录。如果基本 Persist 方法失败,使用 try-catch 语句并删除状态为 Inserted 的 EMPWorkOrderINRegister 记录也是一个好主意。
我在 INReceiptEntry 上有一个扩展图。我为自定义 DAC 设置了一个视图,我希望为其生成缓存,以便将对象插入其中。在生成要插入缓存的对象之一后,我使用 ViewName.Insert(Object); (也使用 ViewName.Cache.Insert(Object) 得到相同的结果)在图形扩展的 RowPersisting 处理程序中。这通常会将数据项存储在与 DAC 关联的相应数据库数据 table 中,但数据库中不会存储任何内容。而不是 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
}
没有插入自定义缓存的原因是什么?在 Persisting 函数中使用图形扩展或执行此缓存插入与失败的原因有什么关系吗?
根据要求,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 { }
}
}
Eric,你的 DAC 有一个主要问题,就是缺少关键字段。
INRegister_RowPersisting 处理程序的其他改进领域。 RowPersisting 处理程序旨在在数据记录提交到数据库之前验证数据记录或取消特定数据记录的提交操作。详情请参考Acumatica Framework API Reference
对于您的场景,更好的方法是覆盖 Persist 方法并在执行基本 Persist 方法之前插入缺少的 EMPWorkOrderINRegister 记录。如果基本 Persist 方法失败,使用 try-catch 语句并删除状态为 Inserted 的 EMPWorkOrderINRegister 记录也是一个好主意。