当再次出现相同的值组合时,我需要在SO屏幕上进行客户订单Nbr和外部Nbr验证。为了执行此验证,我们使用了默认Acumatica的PXCheckUnique属性,如下所示
[PXCheckUnique(Where = typeof(Where2<Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>,
And<SOOrder.customerOrderNbr, Equal<Current<SOOrder.customerOrderNbr>>,
And<SOOrder.customerRefNbr, Equal<Current<SOOrder.customerRefNbr>>>>>,
And<SOOrder.status, NotEqual<SOOrderStatus.cancelled>>>),
ErrorMessage = "Order already exists with this Customer Order Nbr and External Ref.Nbr combination ")]
根据需要触发验证。我们需要的支持是在错误消息中显示现有的Order Nbr。如果有人可以帮助我,那将非常好。
在此先感谢:)
答案 0 :(得分:0)
我认为最好的方法是创建自己的PXCheckUnique
版本,并添加错误消息报告功能。最简单的方法是覆盖PrepareMessage并返回所需的消息。
我确认可以使用以下方法。我重用了PXRestrictorAttribute
中的一些逻辑,因为它所做的事情与您想要做的事情类似(在错误消息中包括当前值)。
public class PXCheckUniqueCustomError : PXCheckUnique
{
protected System.Type[] _MsgParams;
public PXCheckUniqueCustomError(string message, params System.Type[] pars)
{
ErrorMessage = message;
if (pars.Any(par => !typeof(IBqlField).IsAssignableFrom(par)))
{
throw new PXArgumentException(nameof(pars), ErrorMessages.ArgumentException);
}
_MsgParams = pars;
}
protected override string PrepareMessage(PXCache cache, object currentRow, object duplicateRow)
{
// Can swap if needing the current row or duplicate row found
return string.Format(ErrorMessage, _MsgParams
.Select(param =>
cache.Graph.Caches[BqlCommand.GetItemType(param)]
.GetStateExt(PXResult.Unwrap(currentRow, BqlCommand.GetItemType(param)), param.Name))
.ToArray());
}
}
然后您可以使用这样的属性...
[PXCheckUniqueCustomError("Order already exists with Customer Order Nbr {0} and External Ref.Nbr {1}", typeof(SOOrder.customerOrderNbr), typeof(SOOrder.customerRefNbr),
Where = typeof(Where2<Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>,
And<SOOrder.customerOrderNbr, Equal<Current<SOOrder.customerOrderNbr>>,
And<SOOrder.customerRefNbr, Equal<Current<SOOrder.customerRefNbr>>>>>,
And<SOOrder.status, NotEqual<SOOrderStatus.cancelled>>>))]
结果将是这样的消息...