Как включить поле из связанной сущности в полнотекстовый индекс сущности?

Я добавил Местоположение клиента в полнотекстовый индекс объекта, но не могу понять, как получить адресную строку 1 из местоположения, чтобы он стал частью полнотекстового индекса. и отображаться в результате.


person RuslanDev    schedule 17.02.2018    source источник


Ответы (1)


Чтобы включить поля связанных сущностей (те, которые находятся в взаимно однозначном отношении с сущностью верхнего уровня на экране ввода данных), необходимо указать, какое поле сущности верхнего уровня следует использовать. вместе с атрибутом PXSelectorAttribute для получения связанной сущности. Сразу после поля объекта верхнего уровня, действующего как мост между связанными объектами, вы должны указать поля вторичного объекта, которые должны быть включены в полнотекстовый индекс и / или отображаться в результате. Имейте в виду, что только поля сущностей верхнего уровня, украшенные атрибутами PXSelectorAttribute или PXDimensionSelectorAttribute, могут действовать как мост между связанными сущностями.

Например, чтобы включить поля из Address DAC в полнотекстовый индекс Местоположение клиента, вы должны добавить поле DefAddressID из < strong> Location DAC перед перечислением полей из Address DAC:

public partial class Location : PX.Data.IBqlTable, IPaymentTypeDetailMaster, ILocation
{
    ...
    public abstract class defAddressID : IBqlField { }
    [PXDBInt()]
    [PXDBChildIdentity(typeof(Address.addressID))]
    [PXUIField(DisplayName = "Default Address", Visibility = PXUIVisibility.Invisible)]
    [PXSelector(typeof(Search<Address.addressID>), DirtyRead = true)]
    public virtual int? DefAddressID { get; set; }
    ...
}

DAC CustomerLocation, представленный в следующем фрагменте кода, может служить прекрасным примером настраиваемого DAC, используемого для добавления Местоположение клиента в полнотекстовый индекс сущности:

[Serializable]
[PXCacheName("Customer Location")]
[PXBreakInheritance]
public partial class CustomerLocation : SelectedCustomerLocation
{
    public new abstract class bAccountID : IBqlField { }

    [Customer(typeof(Search<Customer.bAccountID,
        Where<Customer.type, Equal<BAccountType.customerType>,
            Or<Customer.type, Equal<BAccountType.prospectType>,
            Or<Customer.type, Equal<BAccountType.combinedType>>>>>),
        IsKey = true)]
    public override int? BAccountID { get; set; }

    public new abstract class locationCD : IBqlField { }

    public new abstract class descr : IBqlField { }

    public new abstract class defAddressID : IBqlField { }

    public new abstract class locType : IBqlField { }

    public new abstract class noteID : IBqlField { }

    [PXNote()]
    [PXSearchable(SM.SearchCategory.CR, "{1} {2}: {3}",
        new Type[] {
            typeof(CustomerLocation.bAccountID),
            typeof(Customer.acctCD),
            typeof(CustomerLocation.locationCD),
            typeof(CustomerLocation.descr) },
        new Type[] {
            typeof(CustomerLocation.bAccountID),
            typeof(Customer.acctCD),
            typeof(CustomerLocation.locationCD),
            typeof(CustomerLocation.descr),
            typeof(CustomerLocation.defAddressID),
            typeof(Address.addressLine1),
            typeof(Address.addressLine2),
            typeof(Address.city),
            typeof(Address.countryID) },
        Line1Format = "{0} {2}",
        Line1Fields = new Type[] {
            typeof(CustomerLocation.descr),
            typeof(CustomerLocation.defAddressID),
            typeof(Address.addressLine1) },
        Line2Format = "{1}",
        Line2Fields = new Type[] {
            typeof(CustomerLocation.defAddressID),
            typeof(Address.addressLine2) },
        WhereConstraint = 
            typeof(Where<CustomerLocation.locType, Equal<LocTypeList.customerLoc>,
                Or<CustomerLocation.locType, Equal<LocTypeList.combinedLoc>>>),
        MatchWithJoin = typeof(InnerJoin<Customer, 
            On<Customer.bAccountID, Equal<CustomerLocation.bAccountID>>>),
        SelectForFastIndexing = typeof(Select2<CustomerLocation, 
            InnerJoin<Customer, 
                On<CustomerLocation.bAccountID, Equal<Customer.bAccountID>>>>)
    )]
    public override Guid? NoteID { get; set; }
}

Помимо поля DefAddressID, которое используется для включения полей из Address DAC в полнотекстовый индекс объекта, CustomerLocation также использует Атрибут CustomerAttribute, прикрепленный к полю BAccountID, для включения естественных прикладных ключей клиента AcctCD вместо суррогатных ключей BAccountID уровня БД. И последнее, о чем следует упомянуть, - это PXBreakInheritanceAttribute, необходимый для предотвращения инициализации объектов PXCache, соответствующих базовым DAC, когда на экране Перестроить полнотекстовый индекс сущностей система генерирует список используемых сущностей. по полнотекстовому индексу сущностей.

person RuslanDev    schedule 17.02.2018
comment
какова цель PXBreakInheritance? Еще один вопрос, почему вы не используете PXCacheExtension, а используете частичный класс? - person Yuriy Zaletskyy; 25.01.2019