Skip to content

Latest commit

 

History

History
115 lines (85 loc) · 4.42 KB

File metadata and controls

115 lines (85 loc) · 4.42 KB

PX1115

This document describes the PX1115 diagnostic.

Summary

Code Short Description Type Code Fix
PX1115 Only a terminal graph extension and a non-abstract DAC extension can be used as a base extension. Error Unavailable

Diagnostic Description

The PX1115 diagnostic reports graph extensions with non-terminal base graph extensions and DAC extensions non-abstract base DAC extensions. Using non-terminal graph extensions and non-abstract DAC extensions as base extensions can lead to runtime issues and unexpected behavior in the Acumatica Framework.

What is a Terminal Extension?

A terminal graph extension is a graph extension that will be instantiated by Acumatica Framework at runtime during the initialization of the corresponding graph.

Currently, there are two types of terminal graph extensions:

  1. Non-abstract and non-generic graph extension: A concrete graph extension without generic type parameters.
  2. Abstract graph extension with PXProtectedAccess attribute: An abstract graph extension decorated with the [PXProtectedAccess] attribute.

For DAC extensions, only non-abstract (concrete) DAC extensions are considered terminal and can be used as base extensions.

Example of Incorrect Code

Graph Extensions - Non-Terminal Base Graph Extensions

// Abstract graph extension without [PXProtectedAccess] - non-terminal
public abstract class BaseGraphExtension : PXGraphExtension<SalesOrderEntry>
{
	// Some shared logic
}

public sealed class SecondLevelGraphExtension : PXGraphExtension<BaseGraphExtension, SalesOrderEntry>  // This triggers PX1115
{
	// Additional logic
}

DAC Extensions - Non-Abstract Base DAC Extensions Required

// Abstract DAC extension
public abstract class BaseCustomerExtension : PXCacheExtension<Customer>
{
	public abstract class usrCustomField : BqlString.Field<usrCustomField> { }
	
	[PXDBString(50)]
	public virtual string? UsrCustomField { get; set; }
}

public sealed class CustomerExtensionLevel2 : PXCacheExtension<BaseCustomerExtension, Customer>  // This triggers PX1115
{
	public abstract class usrAnotherField : BqlString.Field<usrAnotherField> { }
	
	[PXDBString(100)]
	public virtual string? UsrAnotherField { get; set; }
}

Example of Correct Code

Graph Extensions - Using Terminal Base Graph Extensions

// Non-abstract graph extension - terminal
public sealed class ConcreteGraphExtension : PXGraphExtension<SalesOrderEntry>
{
	// Extension logic
}

// Abstract graph extension with [PXProtectedAccess] - terminal
[PXProtectedAccess]
public abstract class ProtectedAccessGraphExtension : PXGraphExtension<SalesOrderEntry>
{
	// Extension logic with calls to protected methods of the base graph
}

public sealed class CombinedGraphExtension : PXGraphExtension<ConcreteGraphExtension, ProtectedAccessGraphExtension, SalesOrderEntry>  // No PX1115 errors
{
	// Extension logic
}

DAC Extensions - Using Non-Abstract Base DAC Extensions

// Non-abstract DAC extension
public sealed class BaseCustomerExtension : PXCacheExtension<Customer>
{
	public abstract class usrCustomField : BqlString.Field<usrCustomField> { }
	
	[PXDBString(50)]
	public virtual string UsrCustomField { get; set; }
}

public sealed class CustomerExtensionLevel2 : PXCacheExtension<BaseCustomerExtension, Customer>  // No PX1115 errors
{
	public abstract class usrAnotherField : BqlString.Field<usrAnotherField> { }
	
	[PXDBString(100)]
	public virtual string? UsrAnotherField { get; set; }
}

Related Articles