Почему значение недавно созданного поля расширения (созданного на экране «Контакты») некорректно по умолчанию из (экрана «Местоположение клиента» на экран «Контакты»)?

Я создал одно новое поле расширения на экране контактов (идентификатор местоположения --- int) и на экране местоположения клиента, когда я нажимаю кнопку +, он должен перенаправлять на экран контактов, а сеанс заголовка Клиент и идентификатор местоположения должны быть по умолчанию, но идентификатор местоположения не невыполнение обязательств.

Вот пример img:

Идентификатор местоположения не задан по умолчанию

Вот код, который я написал:

    public PXDBAction<Location> addContact;
    [PXUIField(DisplayName = Messages.AddContact)]
    [PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
    public virtual void AddContact()
    {

        var row = Base.Location.Current;
        if (row == null || row.BAccountID == null) return;

        ContactExt extension = PXCache<Contact>.GetExtension<ContactExt>(Base.Contact.Current); //Base.Contact.Current

        ContactMaint graph = PXGraph.CreateInstance<ContactMaint>();
        graph.Clear();

        Location get = Base.Location.Current;
        Contact retbatch = graph.Contact.Insert(new Contact());

        retbatch.BAccountID = get.BAccountID;
        extension.UsrLocationCD = get.LocationID;

        if (!Base.IsContractBasedAPI)
            PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);

        graph.Save.Press();
    }

Логика недавно созданного поля расширения:

public class ContactExt : PXCacheExtension<PX.Objects.CR.Contact> /*, IBqlTable*/
{

    #region UsrLocationCD
    [PXDBInt()]
    [PXUIField(DisplayName = "Location ID")]

    [PXSelector(
      typeof(Search<Location.locationID, Where<Location.bAccountID,
           Equal<Current<Contact.bAccountID>>>>),
        SubstituteKey = typeof(Location.locationCD), ValidateValue = false)]

    public virtual int? UsrLocationCD { get; set; }
    public abstract class usrLocationCD : PX.Data.BQL.BqlInt.Field<usrLocationCD> { }
    #endregion

}

Это точка останова img:

Изображение отладки кода, связанного с контактами

И вот такая же функциональность должна быть на экране "Возможности".

Пример изображения:

Значения по умолчанию на экране

А это похожий код (экран возможностей):

    public PXDBAction<Location> addOpportunity;
    [PXUIField(DisplayName = Messages.AddNewOpportunity)]
    [PXButton(ImageKey = PX.Web.UI.Sprite.Main.AddNew)]
    public virtual void AddOpportunity()
    {
        var row = CurrentBAccount.Current;
        if (row == null || row.BAccountID == null) return;


        OpportunityMaint graph = PXGraph.CreateInstance<OpportunityMaint>();
        graph.Clear();

        Location get = Base.Location.Current;
        CROpportunity retbatch = graph.Opportunity.Insert(new CROpportunity());

        retbatch.BAccountID = get.BAccountID;
        retbatch.LocationID = get.LocationID;

        if (!Base.IsContractBasedAPI)
            PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);

        graph.Save.Press();
    } 

это точка останова img:

Отладка кода, связанного с представлением возможностей

функциональность работает на экране возможностей

В чем ошибка логики экрана контактов и как решить эту проблему?

Я новичок в этой акуматике.


person Ashok    schedule 26.09.2020    source источник


Ответы (2)


Подобно Что является правильным способ обновить значения DAC, полученные через PXResultset?

Вообще говоря, вы фактически не обновляли кеш (базовый объект данных, который синхронизируется с базой данных). Подумайте о слоях информации:

  • База данных - это фактическое хранилище данных магазина.
  • Кэш - это рабочая копия данных базы данных в памяти. Это то, с чем мы работаем, чаще всего как представления (public PXSelect ‹› MyView;), обычно определяемые в верхней части графика.
  • Рабочие объекты в памяти - это то место, где мы определяем, какие значения должны быть.

Acumatica естественным образом извлекает данные из базы данных в объект кэша через PXGraph для стандартных операций CRUD. Вы добавляете данные (MyView.Insert (myData);) в кеш и обновляете данные в кеше (MyView.Update (myData);), но они не помещаются в базу данных, пока вы не сохраните (Persist). Когда вы извлекаете расширение (дополнительные поля таблицы базы данных, которые определены в расширении DAC), у вас просто есть объект в памяти (ContactExt contactExt = contact.GetExtenstion ();) Это та же концепция, что и при использовании Contact contact = Contacts.Current ();

После получения данных из базы данных они оказываются в кеше. Когда вы добавляете данные в базу данных, вы действительно работаете с объектами в памяти (кеше), пока не сохраните эти данные. Когда вы манипулируете данными (extension.UsrLocationCD = get.LocationID;), то обновляется объект в памяти, но не фактический кеш (который будет сохранен в базе данных, когда вы нажмете «Сохранить»).

Чтобы поместить обновленные данные в ваши рабочие объекты (extension.UsrLocationCD = get.LocationID;), вам необходимо поместить их в кеш. Это делается несколькими способами. В этом случае я бы просто использовал Update в представлении.

graph.Contact.Update(extension);

Вы также можете использовать:

graph.Caches[typeof(Contact)].Update(extension); 

В конечном итоге вам необходимо сохранить данные, и это уже делается в нижней части образца кода с помощью graph.Save.Press ();.

Ваш код с обновленным представлением:

public PXDBAction<Location> addContact;
[PXUIField(DisplayName = Messages.AddContact)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
public virtual void AddContact()
{

    var row = Base.Location.Current;
    if (row == null || row.BAccountID == null) return;

    ContactExt extension = PXCache<Contact>.GetExtension<ContactExt>(Base.Contact.Current); //Base.Contact.Current

    ContactMaint graph = PXGraph.CreateInstance<ContactMaint>();
    graph.Clear();

    Location get = Base.Location.Current;
    Contact retbatch = graph.Contact.Insert(new Contact());

    retbatch.BAccountID = get.BAccountID;
    extension.UsrLocationCD = get.LocationID;

    // Update the cache
    graph.Contact.Update(extension);

    if (!Base.IsContractBasedAPI)
        PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);

    graph.Save.Press();
}
person Brian Stevens    schedule 29.09.2020

Небольшая модификация (вызов в поле расширения) помогла мне установить значение по умолчанию на экране контактов.

    public PXDBAction<Location> addContact;
    [PXUIField(DisplayName = Messages.AddContact)]
    [PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
    public virtual void AddContact()
    {
        var row = Base.Location.Current;
        if (row == null || row.BAccountID == null) return;

        ContactMaint graph = PXGraph.CreateInstance<ContactMaint>();
        graph.Clear();

        Location get = Base.Location.Current;
        Contact retbatch = graph.Contact.Insert(new Contact());

// Это то, что я изменил в вызове поля расширения

        ContactExt extension = retbatch.GetExtension<ContactExt>();

        retbatch.BAccountID = get.BAccountID;
        extension.UsrLocationCD = get.LocationID;

// И я обновился до графа Cache

        graph.Contact.Cache.Update(retbatch);

        if (!Base.IsContractBasedAPI)
            PXRedirectHelper.TryRedirect(graph, 
          PXRedirectHelper.WindowMode.NewWindow);
     }

Работа после изменения кода

person Ashok    schedule 29.09.2020