Acumatica:如何将现有屏幕(客户合同)复制到新屏幕(供应商合同)

Acumatica: How to duplicate an existing screen (Customer Contracts) to a new screen (Vendor Contracts)

美好的一天,

我是第一次来post这里,还请多多包涵。 :)

我们项目的要求之一是将现有屏幕(客户合同)复制到模仿源屏幕的新屏幕(供应商合同)中。客户不希望我们自定义屏幕,而是复制它。我已经看到一种方法可以复制和重命名 asp 文件,但这仅适用于 ASP 文件:Is it possible to copy existing screens?

  1. 这可能吗?
  2. 如果是这样,是否还有其他需要考虑的事情(图形、现有屏幕的 DAC 也要复制?)
  3. 还有其他方法可以实现吗?

我对 acumatica 还是个新手。 谢谢,注意安全。

您可以从需要复制的屏幕(客户合同)所使用的图表中派生出一个新图表。

那么您应该复制屏幕的 aspx 文件,但将正在使用的图表从旧图表更改为您的图表。在 aspx 文件的副本中查找 px:PXDataSource,并将 TypeName 属性更改为图形的全名(带有命名空间部分)。

适用于基础图的所有业务逻辑,如图事件、图扩展、视图、操作也将适用于派生图。此外,您可以将自己的业务逻辑引入仅适用于它的派生图中。有一些 Acumatica 屏幕使用这种方法(AR301000 和 SO301000)。

请注意,如果您不控制基本图的代码,可能很难编写和支持复杂的东西。派生图也将受到对基本图所做的每项更改的影响。因此一般情况下推荐引入自己的独立图。但是在你需要屏幕逻辑的完整副本的情况下,你可以尝试这种方法,

DAC 不特定于特定图形,它们可以被另一个图形使用。如果您需要更改 DAC 中的现有字段,您可以使用 DAC 扩展来独立于所有图形进行更改。您还可以使用它们向 DAC 添加新字段: https://help-2021r1.acumatica.com/Help?ScreenId=ShowWiki&pageid=114ae5af-8667-4933-b53d-c4c8667c85ac

或者您可以使用图的缓存附加事件来更改特定图的现有 DAC 字段上的属性(例如,通过更改 PXUIFieldAttribute.DisplayName 来更改为该字段显示的标签): https://help-2021r1.acumatica.com/Help?ScreenId=ShowWiki&pageid=80e817bd-e70b-45b9-a9b1-2d2d0e2f8ee2

如果您需要更改 DAC 声明中的很多内容,您可以使用 Acumatica 平台支持的以下技巧。复制 DAC 声明并将命名空间更改为您的自定义命名空间。那么从 C#/Acumatica 框架的角度来看,这将算作一个单独的 class/DAC。但是它仍然会映射到同一个数据库 table。您可以更改 DAC 属性 字段的属性或删除一些您不使用的属性。这不会影响原始 DAC 和使用它的图中的业务逻辑。

更新:

我忘记了一个重要的时刻。感谢@brian-stevens 指出这一点。

如果您需要更改系统中的默认导航以转到您的屏幕而不是现有的屏幕(例如,来自 GI 的导航),那么您将需要做一些额外的工作。 导航是通过 PXPrimaryGraphAttribute 定义的,它在 DAC 上声明如下:

[PXPrimaryGraph(typeof(MyGraph))]
public class MyDac : IBqlTable
{
   ...
}

您需要传递默认要导航到的屏幕所使用的图形类型。 PXPrimaryGraphAttribute 的声明可能包括多种图形类型和条件,以允许根据不同的条件导航到不同的屏幕。例如,您可以根据文档的类型导航到不同的屏幕。您可以查看 PX.Objects.AP.APRegister 作为示例。

但是,PXPrimaryGraphAttribute 不是在 DAC 字段 属性 上声明的,而是在 DAC 本身上声明的。因此,不可能使用用于更改 DAC 属性的方法对其进行自定义。如果您不拥有 DAC 的源代码,则无法更改其 PXPrimaryGraphAttribute 声明。

在这种情况下,我会尝试以下方法。您可以在图形上声明 PXPrimaryGraphAttribute 并将主 DAC 的类型传递给其构造函数。根据文档,这应该覆盖此 DAC 的导航。

[PXPrimaryGraph(typeof(PrimaryDac))]
public class MyCopyOfGraph : BaseGraph
{}

这里是文档和相关 SO 问题的链接:

更新 2

检查代码后,我发现 Acumatica 平台实际上为您提供了通过在 DAC 扩展上声明 PXPrimaryGraphAttribute 属性来覆盖 DAC 的默认导航的能力,如下所示:

[PXPrimaryGraph(typeof(MyCopyOfGraph))]
public class MyDacExtension : PXCacheExtension<MyDac>
{
   ...
}

更新 3 我的同事最近提到的另一个问题是屏幕的工作流程。您将需要覆盖现有的工作流程并定义您自己的工作流程。