Accueil Blog (en) Accès ou remplacement de méthodes protégées dans des extensions graphiques à l’aide de PXProtectedAccess

Accès ou remplacement de méthodes protégées dans des extensions graphiques à l’aide de PXProtectedAccess

Keith Richardson | 30 novembre 2022

Accès ou remplacement de méthodes protégées dans des extensions graphiques à l’aide de PXProtectedAccess

Introduction

Le mot-clé protégé en C# permet d’accéder à ses propriétés et méthodes à partir de la classe et des classes dérivées. Vous devez définir des propriétés publiques pour autoriser l’accès à partir d’autres fonctions. Il s’agit d’une pratique courante pour forcer l’utilisation de fonctions et de propriétés spécifiques qui devraient être utilisées et empêcher les méthodes internes d’être appelées.

En règle générale, dans Acumatica, nous avons des méthodes publiques qui peuvent être appelées à partir d’autres graphiques qui nécessitent l’envoi d’un cache, ou l’envoi d’un objet comme paramètre pour effectuer une ou plusieurs actions. Une méthode protégée typique dans un graphique est quelque chose qui est appelé sur l’objet actuel qui est défini. Par exemple, SOShipmentEntry dispose d’une fonction protégée SyncShipDateWithLinks. Cela passe par l’enregistrement d’expédition actuel dans le cache et met à jour la date d’expédition sur l’enregistrement SOOrderShipment lié. Cette fonction ne doit pas être appelée en dehors du graphique, c’est pourquoi elle est marquée comme protégée.

Extensions de graphique

Lorsque nous effectuons une extension de graphique, nous pouvons avoir besoin d’accéder, ou même de remplacer ces propriétés et méthodes. Ce serait dans le même graphique, donc l’utilisation de ces méthodes protégées utiliserait un sens logique. Le problème est que vous ne pouvez pas y accéder via la base de l’extension, car ils sont protégés. C’est là que PXProtectedAccess entre en jeu.

Le premier exemple serait l’accès à une propriété protégée sur l’écran SOOrderEntry. J’ai un processus qui déclenchera une commande CopyOrder personnalisée. Cette propriété a un obtenir public, mais un ensemble protégé. Le seul endroit où cette propriété est définie se trouve pendant l’action CopyOrder.

Il y a deux façons d’accéder à la propriété.

La première façon serait de créer une extension de graphique d’accès protégé abstrait et de déclarer les propriétés protégées comme abstraites et publiques. Cela remplacerait la portée du graphique initial. À partir de là, vous étendriez ce graphique et pourriez utiliser la propriété.

GIST : https://gist.github.com/kjrichardson/698684c2c1806fdd437abb7dd457627a

Comme vous pouvez le voir, nous étendons à la fois le graphique principal et l’extension. Base1 appellerait l’extension, dont le setter IsCopyOrder est défini sur public. Cela nous permettrait d’exécuter notre fonction d’ordre de copie personnalisée sans avoir à appeler l’action qui définit cette propriété à partir du graphique SOOrderEntry.

L’autre façon d’y parvenir serait avec une classe. Nous exécuterions tout le code dans une seule classe abstraite. Les deux méthodes fonctionnent dans la version actuelle d’Acumatica.

GIST : https://gist.github.com/kjrichardson/04642c509aa3849b1fafeafd8ecaf56f

Remplacement des fonctions protégées

Ensuite, nous examinerons la question de la remplacement d’une fonction protégée. Les gestionnaires d’événements normaux vous permettent de le faire sans avoir à utiliser l’accès protégé, mais parfois vous devrez peut-être remplacer des fonctionnalités supplémentaires qui ne sont pas pilotées par les événements. Une fonction que j’ai dû remplacer était la fonction LinkPOLineToSOLineSplit dans le graphique POCreate. J’avais besoin de lier les informations de la commande client à la ligne de commande fournisseur lorsqu’elle était liée. Les gestionnaires d’événements pour ces champs ou DAC mis à jour n’ont pas été déclenchés, donc remplacer la fonction qui l’a défini était l’étape suivante. Lorsque vous effectuez un remplacement typique, vous obtiendrez les erreurs suivantes :

Pour créer un remplacement, vous devez avoir deux fonctions. L’extension de premier niveau aurait votre code PXOverride qui serait appelé. Si vous vous arrêtiez ici, vous obtiendriez des échecs d’accès. La deuxième étape consisterait à créer une extension ProtectedAccess qui étend à la fois le graphique de base, ainsi que l’extension de graphique qui a votre remplacement.

GIST : https://gist.github.com/kjrichardson/e5e8b7d2656fa66617e0cb301defebe1

Remarque: le délégué et la méthode étiquetés avec PXOverride doivent être définis comme publics. Cela permet à l’extension graphique secondaire d’accéder à la fonction remplacée et la lie à l’accès protégé.

Résumé

Parfois, il ne suffit pas de se connecter à un événement à l’aide d’un événement FieldUpdated, RowUpdated ou un autre événement standard. Parfois, le code est intégré dans des événements protégés. Parfois, cette méthode est bénéfique pour des raisons de performances, car il vous suffit d’intercepter l’événement protégé et de ne pas exécuter de logique chaque fois qu’un autre champ ou une autre ligne est mis à jour. Je suis heureux qu’Acumatica ait ajouté cette fonctionnalité en 2020 R1 et j’ai trouvé de nombreux avantages à l’utiliser et j’espère que vous le ferez aussi!

Bon codage!

Auteur du blog

Architecte de systèmes d’application chez Haun Welding Supply

Recevez des mises à jour de blog dans votre boîte de réception.