This document describes the PX1115 diagnostic.
| 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 |
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.
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:
- Non-abstract and non-generic graph extension: A concrete graph extension without generic type parameters.
- 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.
// 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
}// 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; }
}// 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
}// 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; }
}