业务账户(CR303000)主联系人邮箱验证实现技术问询
在Acumatica CR303000(业务账户页面)的RowPersisting事件中验证主联系人邮箱
别用你之前尝试的Base.GetExtension<PrimaryContactGraphExt>().PrimaryContactCurrent,这个自定义图扩展可能未正确部署、引用,或者并非全局可用。正确的做法是直接通过业务账户(BAccount)DAC的标准关联字段获取主联系人记录,以下是具体实现步骤:
实现代码
创建BusinessAccountMaint图的扩展类,重写BAccount的RowPersisting事件:
public class BusinessAccountMaintExt : PXGraphExtension<BusinessAccountMaint> { protected virtual void _(Events.RowPersisting<BAccount> e) { if (e.Row == null) return; // 获取业务账户关联的主联系人ID int? primaryContactId = e.Row.PrimaryContactID; if (!primaryContactId.HasValue) { throw new PXException("请先设置业务账户的主联系人"); } // 查询主联系人的完整记录 Contact primaryContact = PXSelect<Contact, Where<Contact.contactID, Equal<Required<Contact.contactID>>>> .Select(Base, primaryContactId); if (primaryContact == null) { throw new PXException("关联的主联系人记录不存在,请检查数据有效性"); } // 验证邮箱是否已填写 if (string.IsNullOrWhiteSpace(primaryContact.Email)) { // 抛出字段级错误,错误提示会关联到主联系人的邮箱字段(若页面有显示) throw new PXSetPropertyException<Contact.email>("主联系人必须填写邮箱地址", PXErrorLevel.Error); } } }
关键说明
- 标准关联查询:通过
BAccount.PrimaryContactID直接关联ContactDAC,这是Acumatica内置的业务关系,无需依赖自定义扩展,稳定性更高。 - 错误类型选择:使用
PXSetPropertyException会将错误定位到Contact.Email字段(如果页面上主联系人面板包含邮箱控件),用户体验更友好;若只需全局提示,可改用PXException。 - 触发时机:
RowPersisting事件会在记录保存到数据库前触发,确保验证逻辑在数据持久化前执行。
内容的提问来源于stack exchange,提问作者Kyle S
相关产品推荐
相关产品推荐

