Добавление атрибута контакта на экран Бизнес-аккаунта

#acumatica #acumatica-kb

Вопрос:

У клиента есть Атрибут, добавленный к Контакту(CR302000). Теперь они хотели бы видеть этот атрибут в качестве столбца при просмотре контакта на экране «Бизнес-аккаунт(CR303000)» на вкладке «Контакты».

Я создал настройку и добавил атрибут (Region_Attribute) в Бизнес-аккаунте (CR303000)>Вкладка:Текущий счет>>Контакты, выбрав его из «ДОБАВИТЬ ПОЛЕ ДАННЫХ>>>ВСЕ». Я опубликовал настройку, но это поле не отображается на вкладке «Контакты» или в конфигурации столбца. Не могли бы вы, пожалуйста, помочь.

Спасибо.

Ответ №1:

Вы можете создать новое пользовательское поле, написать обработчик FieldSelecting событий, как показано ниже, и добавить его в сетку вместо добавленного вами. Это позволит найти значение атрибута для конкретной записи и отобразить его.

 using PX.CS.Contracts.Interfaces;
using PX.Data.BQL.Fluent;
using PX.Data.BQL;
using PX.Data.EP;
using PX.Data.ReferentialIntegrity.Attributes;
using PX.Data;
using PX.Objects.AP;
using PX.Objects.AR;
using PX.Objects.CR.MassProcess;
using PX.Objects.CR.Workflows;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.EP;
using PX.Objects.GDPR;
using PX.Objects;
using PX.SM;
using PX.TM;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System;

namespace PX.Objects.CR
{
  public class ContactExt : PXCacheExtension<PX.Objects.CR.Contact>
  {
    #region UsrCustomAttributeRegion
    [UsrRegionValue(typeof(PX.Objects.CR.Contact.contactID))]
    public virtual string UsrCustomAttributeRegion { get; set; }
    public abstract class usrCustomAttributeRegion : PX.Data.BQL.BqlString.Field<usrCustomAttributeRegion> { }
    #endregion
  }
      
    [PXString(255,IsUnicode = true)]
    [PXUIField(DisplayName = "Region", Enabled = false)]
    public class UsrRegionValueAttribute : PXAggregateAttribute, IPXFieldSelectingSubscriber
    {
        protected Type ContactIDType;
        public UsrRegionValueAttribute(Type contactID)
        {
            ContactIDType = contactID;
        }

        public void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
        {
            e.ReturnValue = null;
            if (e.Row != null)
            {
                var contactID = (int)sender.GetValue(e.Row, ContactIDType.Name);
                Contact contact = PXSelect<Contact, Where<Contact.contactID, Equal<Required<Contact.contactID>>>>.SelectWindowed(sender.Graph, 0, 1, new object[] { contactID });
                CSAnswers answer = PXSelect<CSAnswers, Where<CSAnswers.attributeID, Equal<Required<CSAnswers.attributeID>>,
                    And<CSAnswers.refNoteID, Equal<Required<CSAnswers.refNoteID>>>>>.SelectWindowed(sender.Graph, 0, 1, new object[] { "REGION",contact.NoteID });
                if(answer!=null)
                    e.ReturnValue = answer.Value;
            }
        }
    }
}