如何从PXSelectorAttribute获取关联的Contact表记录?
解决PXSelector获取关联Contact记录的方法
针对你遇到的问题,有两种实用的解决方式,可直接拿到选中客户对应的Contact记录:
方法一:通过客户ID直接查询Contact表
你的Selector仅用于筛选关联了联系人的客户,选中后存储的是bAccountID,因此可以在字段的FieldUpdated事件中,用这个ID直接查询Contact表:
protected void [你的DAC类名]_UsrCustomerID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = e.Row as [你的DAC类名]; if (row == null || row.UsrCustomerID == null) return; // 查询该客户对应的Contact记录,可按需添加过滤条件(比如取主联系人) Contact contact = PXSelect<Contact, Where<Contact.bAccountID, Equal<Required<Contact.bAccountID>>>> .Select(Base, row.UsrCustomerID); if (contact != null) { // 将Contact字段赋值到当前DAC的对应字段,示例: row.UsrContactID = contact.ContactID; row.UsrContactName = contact.DisplayName; } }
方法二:修改Selector包含Contact字段,直接读取选择结果
如果想直接从Selector的返回结果中获取Contact数据,需要先修改Selector定义,明确包含所需的Contact字段,再通过GetSelectResult方法读取:
第一步:更新Selector属性定义
[PXSelector( typeof(Search2<BAccountR.bAccountID, InnerJoin<Contact, On<BAccountR.bAccountID, Equal<Contact.bAccountID>>>>), // 新增需要的字段:客户编码、名称、联系人ID、联系人名称 typeof(BAccountR.acctCD), typeof(BAccountR.acctName), typeof(Contact.contactID), typeof(Contact.displayName), SubstituteKey = typeof(BAccountR.acctCD), DescriptionField = typeof(BAccountR.acctName))] public virtual int? UsrCustomerID { get; set; }
第二步:在事件中读取关联字段
protected void [你的DAC类名]_UsrCustomerID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { var row = e.Row as [你的DAC类名]; if (row == null) return; var selAttr = cache.GetAttribute<PXSelectorAttribute>(row, nameof(UsrCustomerID)); if (selAttr == null) return; // 获取选择结果数组,顺序与Selector中定义的字段一致 object[] selectResult = selAttr.GetSelectResult(cache, row); if (selectResult == null || selectResult.Length < 4) return; // 从数组中提取Contact字段值 int? contactID = selectResult[3] as int?; string contactName = selectResult[4] as string; // 若需要完整Contact记录,用contactID再次查询即可 if (contactID != null) { Contact contact = PXSelect<Contact, Where<Contact.contactID, Equal<Required<Contact.contactID>>>>.Select(Base, contactID); // 处理Contact数据 } }
补充说明
你之前尝试Projection无效,大概率是因为Projection字段未被Selector正确引用。相比维护Projection,上面两种方法更直接高效,无需额外配置。
内容的提问来源于stack exchange,提问作者MikeNIke
相关产品推荐
相关产品推荐

