Acumatica 在取消保留标头时,如何验证未保存的网格记录?

Acumatica 在取消保留标头时,如何验证未保存的网格记录?,acumatica,Acumatica,我在屏幕上有一个页眉/行结构,在输入数据时需要有很大的灵活性,但在所有行项目都有库存id之前,不允许暂停记录。在创建记录时,库存id可能不存在,因此我无法在初始输入时设置库存id字段 我预计PXSelect将从数据库中提取任何新记录,但保留条目中当前缓存的数据。相反,我发现在保存记录之前,新行项目的条目似乎不会通过PXSelect访问。这意味着取消选中Hold将忽略我在屏幕上看到的库存ID,下面的代码将生成NoInventoryID的异常 #region MyHdr_Hold_FieldVeri

我在屏幕上有一个页眉/行结构,在输入数据时需要有很大的灵活性,但在所有行项目都有库存id之前,不允许暂停记录。在创建记录时,库存id可能不存在,因此我无法在初始输入时设置库存id字段

我预计PXSelect将从数据库中提取任何新记录,但保留条目中当前缓存的数据。相反,我发现在保存记录之前,新行项目的条目似乎不会通过PXSelect访问。这意味着取消选中Hold将忽略我在屏幕上看到的库存ID,下面的代码将生成NoInventoryID的异常

#region MyHdr_Hold_FieldVerifying
protected virtual void _(Events.FieldVerifying<MyHdr.hold> e)
{
    if ((bool?)e.NewValue == true) return;

    MyHdr row = (MyHdr)e.Row;

    MyLine line =
    PXSelect<MyLine, Where<MyLine.hdrID, Equal<Current<MyHdr.hdrID>>>>
        .SelectSingleBound(this, new object[] { e.Row });
    if (line == null)
        throw new PXSetPropertyException(Messages.NoLines, PXErrorLevel.Warning);

    line =
    PXSelect<MyLine, Where<MyLine.hdrID, Equal<Current<MyHdr.hdrID>>, And<MyLine.inventoryID, NotEqual<Null>>>>
        .SelectSingleBound(this, new object[] { e.Row });
    if (line != null)
        throw new PXSetPropertyException(Messages.NoInventoryID, PXErrorLevel.Warning);
}
#endregion
我在Inventory ID字段中有CommitChanges=True,因此在验证header hold字段时,似乎需要一种特殊的技术来验证网格线


如何查找标题网格子行上未保存的数据以进行验证,而不首先让用户保留记录?

查找数据视图的名称:

然后调用数据视图的Select方法来获取记录

对于从PXGraph继承的新图形:

foreach (SOLine line in Transactions.Select())
{
}
对于从PXGrapherExtension继承的图形扩展,需要添加基本前缀:

foreach (SOLine line in Base.Transactions.Select())
{
}
对于包含多个DAC的数据视图,可以使用PXResult访问它们

> PXSelect<DAC1, InnerJoin<DAC2>, LeftJoin<DAC3>>

foreach (PXResult<DAC1, DAC2, DAC3> results in DataView.Select())
{
    DAC1 dac1 = (DAC1)results;
    DAC2 dac2 = (DAC2)results;
    DAC3 dac3 = (DAC3)results;
}

您可以执行dataview。选择或签入插入/更新的缓存集合[typeofDAC].Inserted。在我们注意到有办法打破它之前,这项工作非常有效。我们正在验证将收割台从保持状态中取出的时间。当输入要验证的行值,然后用户离开该字段时,取消保持将正确验证。当它被输入,然后下一个物理操作是直接点击保持复选框时,它不会检测到行中的值被更新。似乎唯一可能的解决办法是将提交更改放在所有要验证的字段上,但我不确定这是否可行。这是Acumatica bug还是我正在做的事情?要在图形中执行任何代码都需要回调。要获取回调,需要提交更改。听起来这是唯一的办法。否则,您可以让用户在FieldUpdate事件处理程序中执行保持操作并取消它。我在field Verification事件中执行此操作,但看不到输入的值。您是说该字段将提交,我可以在保留字段上更新了提交更改的字段中检查是否提交?我认为这是一个我仍在为事件如何发生以及它们对其他观点有何影响而苦苦挣扎的细节。HB,我遗漏了一些东西,不知道该问什么。。。如果我在细节级别网格行中设置了“数量”字段,并在标题中立即取消选中“保留”,则提交更改对我无效。如果我更改为Events.FieldUpdated,那么我可以抛出异常,但是MyDAC.hold在我保存记录之前不会刷新,因为hold复选框在内存中被选中,而不是在屏幕上。我在19.110.0013上,这感觉像是一个Acumatica bug,但我不能发誓。JavaScript事件不是很可靠,如果你聚焦控件X并单击操作按钮,我看到事件没有触发。目前没有办法解决这个问题,如果你在点击“保持”复选框之前“制表符”失去控制,我怀疑这是可行的。
foreach (SOLine line in Caches[typeof(SOLine)].Inserted)
{
}

foreach (SOLine line in Caches[typeof(SOLine)].Updated)
{
}