【问题标题】:Why newly created extension field value (created in Contacts screen) not defaulting correctly from (Customer location screen to Contacts screen)?为什么新创建的扩展字段值(在联系人屏幕中创建)不能正确地从(客户位置屏幕到联系人屏幕)默认?
【发布时间】:2020-09-26 06:52:33
【问题描述】:

我在联系人屏幕(位置 ID --- int)和客户位置屏幕中创建了一个新的扩展字段,当我单击“+”按钮时,它应该重定向到联系人屏幕和标题会话“客户和位置 ID”应该默认,但位置 ID 不是默认的。

以下是 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:

功能正在“机会”屏幕中运行

“联系人屏幕”逻辑中的错误在哪里 以及如何克服这个问题?

我是这个 acumatica 的新手。

【问题讨论】:

    标签: acumatica acumatica-kb


    【解决方案1】:

    类似于What is the proper way to update values of DAC's retrieved via PXResultset?

    一般来说,您实际上并没有更新缓存(与数据库同步的底层数据对象)。从信息层的角度思考:

    • 数据库是存储数据的实际存储库
    • 缓存是内存中数据库数据的工作副本。这就是我们使用的,最常见的是“视图”(public PXSelect MyView;),通常定义在图表的顶部。
    • 内存中的工作对象是我们计算所需值的地方。

    Acumatica 自然地通过 PXGraph 将数据库中的数据检索到缓存对象中,以进行标准 CRUD 操作。您将数据 (MyView.Insert(myData);) 添加到缓存并更新缓存中的数据 (MyView.Update(myData);),但在您保存 (Persist) 之前它不会推送到数据库。当您检索扩展(在 DAC 扩展中定义的数据库表的额外字段)时,您的内存中只有一个对象(ContactExt contactExt = contact.GetExtenstion();)这与使用 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();
    }
    

    【讨论】:

      【解决方案2】:

      小修改(调用扩展字段)帮助我在联系人屏幕上默认值。

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

      Working after modify the code

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 2021-10-11
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        相关资源
        最近更新 更多