Acumatica:触发器在另一个自定义按钮上保存验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acumatica:触发器在另一个自定义按钮上保存验证相关的知识,希望对你有一定的参考价值。

美好的一天!

单击自定义按钮时如何触发视图的验证?例如,我在DAC中有一个必需的Amount字段,它有PXDefault属性,如果我保存了记录而没有填满它,它自然会触发“错误:'Amount'不能为空”错误。现在,从这里开始,我想在触发SAVE按钮之外的另一个按钮时复制此行为。

你如何触发验证?我已经尝试在字段本身上添加PXUIVerify属性,但它已在页面加载期间触发,我尝试通过添加属性属性CheckOnRowSelected = false来禁用它,但无效,它仍然会触发验证。

任何建议和答案表示赞赏。非常感谢。

附加问题:

验证表格的正确方法是什么?

答案

在PXDefaultAttribute中的RowPersisting事件中验证字段是否为空。验证屏幕上是否有任何错误发生在PXUIFieldAttribute中的CommandPreparing事件中。

由于您实际上并未进行保存,因此复制验证会更容易,而不是尝试“触发”它。以下代码段尝试通过验证图中每个视图的缓存中的每条记录来复制验证。

public static void Validate(PXGraph graph)
{
    for (int k = 0; k < graph.Views.Caches.Count; ++k)
    {
        PXCache cache = graph.Caches[graph.Views.Caches[k]];
        PXEntryStatus status;

        foreach (object rec in cache.Cached)
        {
            status = cache.GetStatus(rec);

            if (cache.GetStatus(rec) == PXEntryStatus.Updated || cache.GetStatus(rec) == PXEntryStatus.Inserted)
            {
                cache.Current = rec;

                foreach (PXDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDefaultAttribute>())
                {
                    CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
                }

                foreach (PXDBDefaultAttribute attribute in cache.GetAttributesReadonly(rec, null).OfType<PXDBDefaultAttribute>())
                {
                    CheckDefaultAttribute(attribute.PersistingCheck, attribute.FieldName, rec, cache);
                }

                // Verifies that there are no errors on the page.
                foreach (IPXInterfaceField field in cache.GetAttributesReadonly(rec, null).OfType<IPXInterfaceField>())
                {
                    if (!string.IsNullOrEmpty(field.ErrorText) && (field.ErrorLevel == PXErrorLevel.Error || field.ErrorLevel == PXErrorLevel.RowError))
                    {
                        throw new PXException(field.ErrorText);
                    }
                }
            }
        }
    }
}

// Verifies that the field has a value if the PersistingCheck is not PXPersistingCheck.Nothing
protected static void CheckDefaultAttribute(PXPersistingCheck persistingCheck, string fieldName, object row, PXCache cache)
{
    if (persistingCheck != PXPersistingCheck.Nothing)
    {
        object value = cache.GetValue(row, fieldName);

        if (value == null || (persistingCheck == PXPersistingCheck.NullOrBlank && value is string && ((string)value).Trim() == string.Empty))
        {
            throw new PXException(ErrorMessages.FieldIsEmpty, PXUIFieldAttribute.GetDisplayName(cache, fieldName));
        }
    }
}

作为免责声明,此方法将错过自定义RowPersisting事件中可能发生的任何验证。

另一答案

您可以调用RaiseFieldVerifying事件。检查ARDocumentEnq图,CreateInvoice(输入新发票)按钮调用FieldVerifying和FieldUpdated事件,触发这些事件。您可以捕获异常,例如INTransferEntry图:

protected virtual void INRegister_TransferType_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
    INRegister row = (INRegister)e.Row;
    {
        object toSiteID = row.ToSiteID;
        try
        {
            sender.RaiseFieldVerifying<INRegister.toSiteID>(row, ref toSiteID);
            sender.RaiseExceptionHandling<INRegister.toSiteID>(row, toSiteID, null);
        }
        catch (PXSetPropertyException ex)
        {
            sender.RaiseExceptionHandling<INRegister.toSiteID>(row, toSiteID, new PXSetPropertyException(ex, PXErrorLevel.Error, Messages.WarehouseNotAllowed, Messages.OneStep));
        }
    }
}

以上是关于Acumatica:触发器在另一个自定义按钮上保存验证的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Acumatica 业务逻辑中的表的扩展

为Acumatica创建自定义用户控件

Acumatica 自定义所有者选择器

Acumatica 邮政编码验证和匹配

如何在自定义元素或按钮小部件上触发事件?

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview