You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:46:21