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

Keith Richardson, le 30 novembre 2022
Shutterstock_1740319322-échelle-min

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é.

  1. La première méthode consiste à créer une extension abstraite du graphe d'accès protégé et à 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 pourriez étirer ce graphique et utiliser la propriété. Comme vous pouvez le constater, nous étendons à la fois le graphique principal et l'extension. Base1 appellerait l'extension, dont le setter IsCopyOrder est défini comme public. Cela nous permettrait d'exécuter notre fonction personnalisée de gestion de l'ordre de copie sans avoir à appeler l'action qui définit cette propriété à partir du graphique SOOrderEntry.
  2. Une autre solution serait d'utiliser une seule classe. Tout le code serait alors exécuté dans une seule classe abstraite . Les deux méthodes sont compatibles avec la version actuelle d'Acumatica.

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 une substitution, deux fonctions sont nécessaires. La première extension contient le code PXOverride qui sera appelé. Si vous vous arrêtez là, vous obtiendrez des erreurs 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 contenant votre substitution.

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

Catégories