我认为最好的方法是创建您自己的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>>>))]
结果会是这样的消息...