#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;
}
}
}
}