【问题标题】:How to insert and add custom rows in customization?如何在自定义中插入和添加自定义行?
【发布时间】:2017-01-03 22:35:15
【问题描述】:

我正在尝试使用操作按钮 AddFollowUp to Leads 编写一些自定义代码。我想:

  1. 更新名为UsrNextFollwup 的自定义字段 -> 如何访问对象中的自定义字段?
  2. 我可以使用 PXSelect 更新我找到的对象,但是如何插入新对象?例如,如果我创建联系人myContact=new Contact(); //设置属性等 -> 我如何插入它?
  3. 如何找到当前用户的 ID?我可以从 Contact curLead=Base.LeadCurrent.SelectSingle() 获得当前潜在客户,但我也想要 @me 函数之类的东西。

我的代码:

public class LeadMaint_Extension:PXGraphExtension<LeadMaint>
{
 public PXAction<PX.Objects.CR.Contact> AddFollowUp;
 public PXSelect<CRActivity> Task;

 [PXButton(CommitChanges = true)]
 [PXUIField(DisplayName = "Add FollowUp")]
 public void addFollowUp()
 {        
    Contact curLead=Base.LeadCurrent.SelectSingle();
    DateTime dueDate = DateTime.Now;
    curLead.CreatedDateTime = dueDate.AddDays(14); //works great
    curLead.UsrNextFollwup = dueDate.AddDays(14); //doesn't work
 }
 }

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    在 Acumatica 中,自定义字段是通过 DAC 扩展声明的。要访问 DAC 扩展对象,可以使用以下方法:

    1. 可用于每个 DAC 实例的 GetExtension() 泛型方法:

      ContactExt contactExt = curLead.GetExtension<ContactExt>();
      
    2. 在非泛型 PXCache 类中声明的 GetExtension(object) 泛型方法

      ContactExt contactExt = Base.LeadCurrent.Cache.GetExtension<ContactExt>(curLead);
      

      ContactExt contactExt = Base.Caches[typeof(Contact)].GetExtension<ContactExt>(curLead);
      
    3. PXCache泛型类的GetExtension(object)静态泛型方法

      ContactExt contactExt = PXCache<Contact>.GetExtension<ContactExt>(curLead);
      

    要插入、更新或删除 DAC 记录,应在适当的 PXCache 实例(或数据视图,它只是将调用重定向到 PXCache -> ShipmentLines.Insert(line) 等效于 @987654326 @ 陈述)。例如,要在代码中将数据记录插入到缓存中,您可以调用数据视图的 Insert() 方法,如下所示:

    ShipmentLine line = new ShipmentLine();
    line.ProductID = card.ProductID;
    ...
    ShipmentLines.Insert(line);
    

    通过 PXGraph 类的Accessinfo 属性可以访问一些应用程序设置,例如 BranchID、UserID 和 UserName。 Accessinfo 属性返回 AccessInfo DAC 的实例 - AccessInfo.UserID 将返回当前用户的 ID。要从 BLC 扩展访问 Accessinfo 属性,请使用 Base.Accessinfo 语句

    起始版本。 5 Acumatica 引入了运行时编译,当任何当前应用的自定义项目中没有包含 dll 时,它允许在不强制重启 IIS 应用程序池的情况下发布自定义。在发布运行时编译之前,定制管理器在网站的 App_Code\Caches 文件夹中创建了所有代码文件。 Asp.Net 运行时会处理在 App_Code\Caches 文件夹中创建的任何代码文件,立即编译它们并重新启动 IIS 应用程序池以立即将所有更改带到您的 Acumatica 网站上。这种方法的美妙之处在于,在 App_Code\Caches 文件夹下的任何文件中声明的所有类都可用于 VS IntelliSense,并且永远不会用红色下划线突出显示为潜在问题。唯一的缺点 - 每次您在 App_Code\Caches 文件夹中进行任何更改时,IIS 应用程序池都会重新启动(就像您重新编译位于 Bin 文件夹中的 dll 一样)并且您的网站需要一些时间才能重新启动,以便您可以测试您的更改。

    在运行时编译到位后,Acumatica 在网站的 App_RuntimeCode 文件夹中创建了所有代码文件。现在,Acumatica 负责将 App_RuntimeCode 文件夹中的所有代码文件编译成程序集并在运行时加载它,而无需重新启动 IIS 应用程序池。使用这种方法,您无需在每次对自定义进行一些更改时都等待您的网站重新启动。另一方面,有时运行时复杂性并不总是正确清除您以前的代码文件中所做的事情,有时可能需要手动回收应用程序池或在您的开发人员机器上重新启动 IIS 以确保 Acumatica 仅加载App_RuntimeCode 文件夹中的实际代码。另一个缺点是 VS IntelliSense 缺乏支持:IntelliSense 从不建议在 App_RuntimeCode 文件夹下的任何文件中声明的所有类,并且总是用红色下划线突出显示为潜在问题,尽管您自己和 Acumatica 都确信一切都很好,所有文件将与 mo 问题一起编译。

    要在 App_Code\Caches 文件夹中自动创建所有自定义文件,只需通过在 web.config 文件中的 appSettings 中添加以下键来禁用开发网站上的运行时编译: &lt;add key="UseRuntimeCompilation" value="false" /&gt;

    【讨论】:

    • 感谢您的信息。我似乎遇到的问题与将扩展名放在 App_RuntimeCode 目录中似乎忽略了智能感知有关。例如:联系 curLead = Base.LeadCurrent.SelectSingle(); var ext = curLead.GetExtension();但 不存在,除非我将 PX_Objects_Cr_Contact_extensions.cs 从 App_RuntimeCode 移动到 App_Data。有没有更好的方法来做到这一点?
    • @AcumaticaGuy,请查看上面的更新答案
    猜你喜欢
    • 2017-09-03
    • 2019-03-09
    • 2012-02-11
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2013-01-31
    相关资源
    最近更新 更多