Accueil Blog Accéder ou surcharger des méthodes protégées dans des extensions de graphes en utilisant PXProtectedAccess

Accéder à des méthodes protégées ou les remplacer dans des extensions de graphiques à l'aide de PXProtectedAccess

Keith Richardson | 30 novembre 2022

Accéder à des méthodes protégées ou les remplacer dans des extensions de graphiques à l'aide de PXProtectedAccess

Introduction

Le mot-clé protected en C# permet d'accéder à ses propriétés et méthodes à partir de la classe et des classes dérivées. Vous pouvez définir des propriétés publiques pour permettre 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 doivent être utilisées et pour empêcher l'appel de méthodes internes.

Typiquement dans Acumatica, nous avons des méthodes publiques qui peuvent être appelées à partir d'autres graphes qui nécessitent l'envoi d'un cache, ou l'envoi d'un objet en tant que paramètre pour effectuer une ou plusieurs actions. Une méthode protégée typique dans un graphe est quelque chose qui est appelé sur l'objet courant qui est défini. Par exemple, SOShipmentEntry possède une fonction protégée SyncShipDateWithLinks. Cette fonction passe en revue l'enregistrement d'expédition en cours 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 protégée.

Extensions du graphique

Lors de l'extension d'un graphe, nous pourrions avoir besoin d'accéder à ces propriétés et méthodes, voire de les surcharger. Il s'agirait du même graphe, donc l'utilisation de ces méthodes protégées serait logique. Le problème est qu'il n'est pas possible d'y accéder via la base de l'extension, car elles sont protégées. 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éclenche une commande CopyOrder personnalisée. Cette propriété a un get public, mais un set protégé. Le seul endroit où cette propriété est définie est pendant l'action CopyOrder.

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

La première solution consisterait à créer une extension abstraite du graphe d'accès protégé et à déclarer les propriétés protégées comme étant abstraites et publiques. Cela permettrait d'outrepasser la portée du graphe initial. À partir de là, vous pourriez étendre ce graphe et être en mesure d'utiliser la propriété.

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

Comme vous pouvez le voir, nous étendons à la fois le graphe principal et l'extension. Base1 appelle l'extension, dont le setter IsCopyOrder est défini comme public. Cela nous permet d'exécuter notre fonction personnalisée de commande de copie sans avoir à appeler l'action qui définit cette propriété à partir du graphe SOOrderEntry.

L'autre façon d'y parvenir serait d'utiliser une seule 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 allons nous intéresser à la surcharge 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 vous pouvez parfois avoir besoin de remplacer une fonctionnalité supplémentaire qui n'est pas pilotée par les événements. L'une des fonctions que j'ai dû remplacer est la fonction LinkPOLineToSOLineSplit du graphique POCreate. J'avais besoin de lier les informations de la commande client à la ligne de la commande d'achat lorsqu'elle était liée. Les gestionnaires d'événements pour la mise à jour de ces champs ou DACs n'ont pas été déclenchés, c'est pourquoi l'étape suivante consistait à remplacer la fonction qui les avait définis. Lorsque vous effectuez une substitution typique, vous obtenez les erreurs suivantes :

Pour créer une dérogation, vous devez disposer de deux fonctions. L'extension de premier niveau contient le code PXOverride qui est appelé. Si vous vous arrêtez ici, vous obtiendrez des échecs d'accès. La deuxième étape consiste à créer une extension ProtectedAccess qui étend à la fois le graphe de base et l'extension de graphe qui contient votre dérogation.

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

Notez que 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 surchargée et de la relier à l'accès protégé.

Résumé

Parfois, il ne suffit pas de se connecter à un événement à l'aide d'un FieldUpdated, RowUpdated ou d'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 performance, car vous n'avez besoin que de piéger l'événement protégé et non d'exécuter la logique à chaque fois qu'un autre champ ou une autre ligne est mis à jour. Je suis heureux qu'Acumatica ait ajouté cette fonctionnalité dans 2020 R1 et j'ai trouvé de nombreux avantages à l'utiliser, et j'espère que vous en ferez de même !

Bon codage !

Auteur du blog

Architecte des systèmes d'application chez Haun Welding Supply

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