您可以先从您需要复制的屏幕使用的图表(客户合同)中创建一个新图表。
然后您应该复制屏幕的 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 框架的角度来看,这将被视为一个单独的类/DAC。但是,它仍将映射到同一个数据库表。您可以更改 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
我的同事最近提到的另一个问题是屏幕的工作流程。您将需要覆盖现有的工作流程并定义自己的工作流程。