在销售订单屏幕金融设置选项卡,我需要使法案-联系电子邮件领域需要。无论是否检查“覆盖联系人”,都需要使用电子邮件字段。
通常,只需设置PXDefault("", PersistingCheck = PXPersistingCheck.NullOrBlank)
就可以生成所需的字段。但是,只有在选中“覆盖联系人”时,此操作才有效。
如果联系人没有被覆盖,那么电子邮件字段就会被禁用,并且它忽略了持久化检查而不需要电子邮件字段。
如何才能要求电子邮件字段,即使账单联系人未被覆盖?
这是我现在的密码。同样,如果该联系人被重写,但当该联系人未被覆盖时没有任何效果,则此操作仍然有效。
public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry.CarrierRates, SOOrderEntry>
{
// Make Financial Settings Email required
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault("", PersistingCheck = PXPersistingCheck.NullOrBlank)]
public void SOBillingContact_Email_CacheAttached(PXCache sender) { }
}
另一种方法
我还尝试使用事件处理程序来引发异常。这种方法也是行不通的。
public virtual void SOBillingContact_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e)
{
SOBillingContact contact = (SOBillingContact)e.Row;
if (contact != null)
{
if (String.IsNullOrEmpty(contact.Email))
{
cache.RaiseExceptionHandling<SOBillingContact.email>(e.Row, ((SOBillingContact)e.Row).Email,
new PXSetPropertyException("Email is required", PXErrorLevel.Error));
}
}
}
此代码正在运行,但异常似乎会被抑制,并且永远不会显示。
发布于 2021-10-28 12:26:35
我找到了一个解决办法:
首先,我使用Automation在屏幕上创建了所需的SOBillingContact.Email
字段
但是,正如在最初的问题中所解释的,只有当账单联系人被覆盖时,这才是有效的。
为了在未覆盖计费联系人(即覆盖contact = False)时获得所需字段,我为SOOrder_RowPersisting添加了一个事件处理程序。在事件处理程序中,我将抛出一行持久化异常,并在记帐联系人电子邮件字段中引发异常处理。
抛出行持久化异常会阻止保存记录(这正是我想要的),并显示一个错误,但它也保留缓存中的更改,以便用户能够更正错误并再次保存,而不会丢失更改。引发字段异常会将异常附加到字段本身,这样用户就可以清楚地知道他们需要修复什么。如果只是引发字段异常而不引发行持久化异常,则后续事件会抑制该异常,而不会显示该异常。
public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
{
protected virtual void SOOrder_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
SOOrder order = (SOOrder)e.Row;
if (order == null) { return; }
if (e.Operation == PXDBOperation.Insert || e.Operation == PXDBOperation.Update)
{
SOBillingContact billingContact = PXSelect<SOBillingContact,
Where<SOBillingContact.contactID, Equal<Required<SOOrder.billContactID>>>>.Select(Base, order.BillContactID);
PXCache billingContactCache = this.Base.Caches[typeof(SOBillingContact)];
if (billingContact.Email == null || billingContact.Email == "")
{
billingContactCache.RaiseExceptionHandling<SOBillingContact.email>(billingContact, billingContactCache.GetValueExt<SOBillingContact.email>(billingContact),
new PXSetPropertyException("Financial Email is required", PXErrorLevel.RowError));
throw new PXRowPersistingException(typeof(SOBillingContact.email).Name, null, "Financial email is required");
}
}
}
}
发布于 2021-10-26 12:31:31
你试过PXUIRequiredAttribute了吗?它允许您有条件地确定何时需要字段。否则,移除PersistingCheck或向PXUIField属性添加Required = true。
PXUIRequiredAttribute的例子:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault]
[PXUIRequired(typeof(Where<Current<SOBillingContact.overrideContact>, Equal<True>>))]
public void SOBillingContact_Email_CacheAttached(PXCache sender) { }
在您的应用程序中没有经过测试,但这遵循了我在代码中使用的格式。
此外,如果需要,请记住打开字段以启用条目,这样就不会导致验证以防止保存用户无法正确保存的记录。通过自动化步骤或UI工作流,或者在RowSelected事件中,都可能需要“解锁字段”。
https://stackoverflow.com/questions/69727960
复制