未覆盖联系人时需要 SOContact 字段
Requiring an SOContact field when contact is not being overridden
在“销售订单”屏幕的“财务设置”选项卡上,我需要将“收单方联系人电子邮件”字段设为必填。无论是否选中“覆盖联系人”,都需要填写电子邮件字段。
通常,您只需设置 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));
}
}
}
此代码是 运行,但异常似乎已被抑制并且从未显示。
你试过 PXUIRequiredAttribute 了吗?它允许您有条件地确定何时需要该字段。否则,删除 PersistingCheck 或将 Required = true 添加到 PXUIField 属性。
PX 示例UI必需属性:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault]
[PXUIRequired(typeof(Where<Current<SOBillingContact.overrideContact>, Equal<True>>))]
public void SOBillingContact_Email_CacheAttached(PXCache sender) { }
未经您的应用程序测试,但这遵循我在代码中使用的格式。
此外,如果您将其设为必需,请记住打开该字段以启用输入,这样您就不会导致验证阻止保存用户无法正确输入的记录。可能需要通过自动化步骤或 UI 工作流程或可能在 RowSelected 事件中“解锁字段”。
我找到了解决方案:
首先,我确实使用自动化步骤
在屏幕上制作了必填字段SOBillingContact.Email
但正如原问题中所解释的,这仅在账单联系人被覆盖时才有效。
为了在账单联系人未被覆盖(即 Override 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");
}
}
}
}
在“销售订单”屏幕的“财务设置”选项卡上,我需要将“收单方联系人电子邮件”字段设为必填。无论是否选中“覆盖联系人”,都需要填写电子邮件字段。
通常,您只需设置 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));
}
}
}
此代码是 运行,但异常似乎已被抑制并且从未显示。
你试过 PXUIRequiredAttribute 了吗?它允许您有条件地确定何时需要该字段。否则,删除 PersistingCheck 或将 Required = true 添加到 PXUIField 属性。
PX 示例UI必需属性:
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXDefault]
[PXUIRequired(typeof(Where<Current<SOBillingContact.overrideContact>, Equal<True>>))]
public void SOBillingContact_Email_CacheAttached(PXCache sender) { }
未经您的应用程序测试,但这遵循我在代码中使用的格式。
此外,如果您将其设为必需,请记住打开该字段以启用输入,这样您就不会导致验证阻止保存用户无法正确输入的记录。可能需要通过自动化步骤或 UI 工作流程或可能在 RowSelected 事件中“解锁字段”。
我找到了解决方案:
首先,我确实使用自动化步骤
在屏幕上制作了必填字段SOBillingContact.Email
但正如原问题中所解释的,这仅在账单联系人被覆盖时才有效。
为了在账单联系人未被覆盖(即 Override 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");
}
}
}
}