我需要有条件地设置一个必填字段

时间:2019-05-06 16:18:44

标签: acumatica

我正在自定义销售订单屏幕,如下所示:

  • 我已经在“订单类型”屏幕中添加了一个名为“需要客户订单号”的自定义布尔字段。
  • 我已将代码添加到“销售订单”屏幕的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,即使数据库中具有“ True”值,也总是为复选框用户字段返回null(这就是为什么我将三元运算符放在调用中)。即使我在PXUIFieldAttribute.SetRequired调用中硬编码了一个“ true”值,它仍然不会产生错误以防止保存。星号在那里,但不起作用。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

必需仅用于显示星号。 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."));
    }
}