【问题标题】:How do I validate an unsaved grid record when taking a header off hold?取消保留标题时如何验证未保存的网格记录?
【发布时间】:2019-06-25 15:12:55
【问题描述】:

我在屏幕上有一个标题/行结构,需要在输入数据时提供很大的灵活性,但要防止在所有行项目都有库存 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,因此在验证标题保留字段时似乎需要一种特殊技术来验证网格线。

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

【问题讨论】:

  • 您可以执行 dataview.Select() 或检查缓存的插入/更新集合[typeof(DAC)].Inserted。

标签: acumatica


【解决方案1】:

查找数据视图的名称:

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

对于继承自 PXGraph 的新图:

foreach (SOLine line in Transactions.Select())
{
}

对于从 PXGraphExtension 继承的图形扩展,您需要添加 Base 前缀:

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;
}

最后,屏幕上显示的所有数据都应该在缓存集合之一中。 如果在图形扩展的上下文中使用,这个也需要以 Base 作为前缀:

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

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

【讨论】:

  • 这一直很好,直到我们注意到有办法打破它。我们正在验证何时取消保留标题。当正在验证的行值被键入然后用户离开该字段时,起飞保持正确验证。当它被输入然后下一个物理动作是直接点击保持复选框时,它不会检测到该行中的值已更新。似乎唯一可能的解决方法是将提交更改放在所有要验证的字段上,但我不确定这是否会起作用。这是 Acumatica 错误还是我正在做的事情?
  • 要在图中执行任何代码都需要回调。要获得回调需要 CommitChanges。所以听起来这将是唯一的方法。否则,您可以让用户执行保持操作并在 FieldUpdated 事件处理程序中取消它。
  • 我在现场验证事件中这样做,但看不到输入的值。您是说该字段将在我可以检查的地方提交,是否在已更新的保持字段上进行了提交更改?我认为这是我仍在努力解决的一个更细微的问题,即事件如何触发以及它们对其他观点有什么影响。
  • HB,我遗漏了一些东西,不确定要问什么...如果我在详细级别网格行中设置 Qty 字段并立即取消选中保持,提交更改对我不起作用在标题中。如果我更改为 Events.FieldUpdated 那么我可以抛出一个异常,但 MyDAC.hold 在我保存记录之前不会刷新(这有效,因为在内存中选中了保持复选框,但在屏幕上没有选中。我我在 19.110.0013 上,这感觉就像一个 Acumatica 错误,但我不能发誓。
  • JavaScript 事件不是很可靠,如果您关注控制 X 并单击操作按钮,我已经看到事件不会触发。目前没有办法解决它,如果你在点击保持复选框之前“标签”失控 X,我怀疑它有效。
猜你喜欢
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2012-07-08
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多