【问题标题】:I need to conditionally set a field to be required我需要有条件地设置一个必填字段
【发布时间】:2019-05-07 00:51:40
【问题描述】:

我正在按如下方式自定义销售订单屏幕:

  • 我在订单类型屏幕中添加了一个自定义布尔字段,名为“需要客户订单号”。
  • 我已将代码添加到销售订单屏幕的 BLC 中,我希望根据是否选中“需要客户订单号”字段,有条件地将 CustomerOrderNumber 字段设为必填。

我正在使用 SOOrder_RowSelected 事件,如下所示:

    protected virtual void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        var soorder = (SOOrder)e.Row;
        if (soorder == null) return;

        string ordtype = soorder.OrderType;
        var soot = (SOOrderType)PXSelect<SOOrderType,
                                Where<SOOrderType.orderType, Equal<Required<SOOrderType.orderType>>>>.Select(Base, ordtype);

        if (soot != null)
        {
            var sootext = PXCache<SOOrderType>.GetExtension<SOOrderTypeExt>(soot);

            if (sootext != null)
            {
                PXUIFieldAttribute.SetRequired<SOOrder.customerOrderNbr>(sender, sootext.UsrRequireCustOrdNbr == null ? false : (bool)sootext.UsrRequireCustOrdNbr);
            }
        }
    }

这确实在 CustomerOrderNumber 字段上添加了一个星号 - 但如果该字段为空,它不会在保存时产生错误。

另一个问题是我的 PXSelect 从 SOOrderType 中获取记录 总是为复选框用户字段返回 null,即使它在数据库中具有“True”值(这就是我将三元运算符放在调用中的原因)。即使我在 PXUIFieldAttribute.SetRequired 调用中硬编码一个“真”值,它仍然不会产生错误以防止保存。星号在那里,但它不起作用。

如果我使用 Cache_Attached 事件添加 [PXDefault],它可以完美运行 - 但这对我没有帮助 - 我需要有条件地设置它。

有什么想法吗?

【问题讨论】:

  • > 另一个问题是我的 PXSelect 从 SOOrderType 中获取记录总是为复选框用户字段返回 null。 - 仔细检查 DAC 类型,确保它们与 DB 匹配并且它不是未绑定的字段。

标签: acumatica


【解决方案1】:

Required 仅用于显示星号。 PXDefault 属性是根据 PersistingCheck 属性值使字段成为必填项的属性。

问题是像 PersistingCheck 这样的 PXUIFieldAttributes 只能在创建图形时设置一次。您可以在构造函数/Initialize 方法中动态设置它,但如果在此之后更改属性,则它没有效果。

当我需要根据动态条件强制某个字段时,我会删除 PXDefault 属性并在 RowPersisting 等事件处理程序中手动验证该字段:

public void PMTimeActivity_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
    PMTimeActivity timeActivity = e.Row as PMTimeActivity;

    if (timeActivity != null && PMTimeActivity.timeSpent == null)
    {
        PXUIFieldAttribute.SetError<PMTimeActivity.timeSpent>(sender, timeActivity, "'Time Spent' cannot be empty."));
    }
}

【讨论】:

  • 谢谢你 - 但现在我有一个不同的问题。无论我为我的 RowSelected 逻辑做什么,我都无法在该字段上显示星号。唯一的方法是如果我将 PXUIFieldAttribute.SetRequired 调用作为事件中唯一的代码行。如果它被隐藏在任何“如果”语句下,就好像它被忽略了。我在调用 SetRequired 的代码中放置了一个断点,它会命中它 - 但是当屏幕最终呈现时,星号不存在。我无法理解。
  • 首先,为了保持一致,我建议您在每个回调上设置值,无论是真还是假,null 还是非 null 等等...不需要 if 语句。必需属性可能是那些只能设置一次的属性之一。要测试您可以在方法“public override void Initialize()”中调用 PXUIFieldAttribute.SetEnabled,并使用 PXTrace.WriteInformation 在跟踪中记录您设置的值(真/假)。它要么在屏幕上与轨迹同步变化,要么停留在分配的第一个值上。
  • 如果它停留在分配的第一个值上,您无法动态设置该属性,您必须在始终显示星号和始终隐藏它之间做出选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2019-09-30
  • 2012-08-07
  • 1970-01-01
  • 2020-08-22
  • 2012-06-13
相关资源
最近更新 更多