XMT_CALL - Les ouvertures

C’est quoi un Xmt_call

Le “Xml_call” est une fonction/procédure diva métier, présente partout dans les couches métier.

Elle permet ce qu’on appelle habituellement une “ouverture”, c’est à dire que le code diva standard “laisse une ouverture” dans du code de surcharge pour venir compléter ou modifier le codage standard.

Ces ouvertures sont placées

  • dans du code de programme principal (xxPP)

  • dans du code de module principal (xxPM)

  • plus rarement dans un traitement (xxTT, xxTE)

Il peut exister plusieurs formes d'écriture, car chaque module implémente une forme de xmt_call. On peut donc trouver

  • a5_xmt_call()

  • g3_xmt_call()

  • (etc…pour tous les modules)

  • xmt_call() mais qui n’est qu’une redéfinition de l’un des précédent

 

Principe d’un Xmt_call

Un Xmt_call a pour but d’appeler une ouverture, le nom de l’ouverture étant indiqué dans le xmt_call. Il va donc faire une recherche :

  • a partir du MZ.MTCLE courant. Cette variable de programmation indique le nom de l’objet compilé dans lequel sera cherché l’ouverture

  • en premier d’une PROCEDURE portant le nom indiqué. Si une procédure existe elle est appelée, et le Xmt_Call retourne 'O' dans tous les cas

  • en second d’une FONCTION portant le nom indiqué. Si une fonction existe elle est appelée, et le Xmt_call retourne la valeur retournée par la fonction

  • s’il n’y a ni l’un ni l’autre, Xmt_Call retourne 'O'

On voit ici ses caractéristiques principales :

  • l’xmt_call a pour vocation d’appeler une ouverture si elle existe

  • son absence n’est en aucun cas un problème, c’est une possibilité offerte

  • l’ouverture doit existe dans le MZ.MTCLE qui est, sauf rares exceptions, le xxTT du programme en cours de traitement

Le code qui fait appelle à un Xmt_call peut l'écrire de plusieurs manières

Code d’appel de l’ouverture

Usage

Remarques

Code d’appel de l’ouverture

Usage

Remarques

Xmt_call (nomDeLOuverture)

Ouverture sans exploitation du résultat

Si l’ouverture a besoin de variables, elles sont forcément publiques

var = Xmt_call (nomDeLOuverture)

Ouverture avec exploitation du résultat

Le retour par défaut est 'O'

On voit ici se caractéristiques secondaires

  • il n’y a pas de passage de variable dans un xmt_call

  • majoritairement ce sont des procédures qui sont appelées pour fournir des ouvertures/point de passage

  • l’ouverture utilisera les variables ou enregistrements publics (vu qu’il n’y a pas de variable transmise)

  • il n’y a jamais de problème à appeler une ouverture, puisque l’appelant en cas d’exploitation du retour considère 'O' comme la valeur normale

  • l’appelant traite ou non la réponse de l’ouverture. Cela dépend de la raison de l’ouverture

  • Il faut considérer que l’ouverture, si elle venait à disparaitre, ne remette pas en cause le fonctionnement normal

La valeur ‘normale’ de retour d’un xmt_call est ‘O' quel que soit son nom. Il faut donc prêter attention au nommage vs le comportement attendu, car si le comportement attendu par défaut est par exemple un blocage, la fonction portera un nom qui fait entendre ceci.

Par exemple une ouverture nommée “AccepterVentilation” a pour comportement par défaut de répondre ‘O' et donc implicitement le comportement attendu est d’accepter une ventilation. Si je supprime l’ouverture “AccepterVentilation”, le xmt_call retournera ‘O' ; la fonction d’ensemble doit continuer à fonctionner, et donc accepter par défaut toutes les ventilations.

A l’inverse une ouverture nommée “RejeterArticleFerme” est volontairement inversée dans son sens, pour indiquer que par défaut le comportement attendu est de rejeter un article fermé. Si je supprime l’ouverture “RejeterArticleFerme”, le xmt_call retournera ‘O' ; la fonction d’ensemble doit continuer à fonctionner, et donc rejeter les articles fermés. L’ouverture permet donc ici de tester des critères qui permettraient d’accepter un article fermé, et donc de retourner 'N' !!

 

Le Xmt_call_sql

Le Xmt_call_sql a été introduit avec l’apparition des RecordSql.

Le fonctionnemen est exactement le même, mais avec le passage obligé en variable du recordSql courant (le recordsql principale concerné par l’ouverture)

 

Exemples

Xmt_call_sql dans le CBN

Exemple pour la lecture des entrées forcées dans le CBN

image-20240216-082340.png

On voit ici 2 ouvertures dans GTPP761:

  • VentilationEF_Selection_Stock_Av

    • placé juste après le placement des conditions WHERE

    • transmet le RecordSql Ventilation_Lire

    • but : permettre dans l’ouverture de compléter les conditions WHERE

    • le clauses where indispensables ne sont pas accessibles en surcharge

  • VentilationEF_Selection_Stock

    • placé dans la boucle de lecture

    • transmet le RecordSql Ventilation_Lire

    • but : ventilation par ventilation, permet de tester des critères qui ne seraient pas possibles en clauses WHERE

 

image-20240216-082556.png

On voit ici les 2 implémentations des ouvertures dans GTTT761 :

  • VentilationEF_Selection_Stock_Av

    • reçoit le RecordSql Ventilation_Lire

    • positionne des conditions complémentaires

    • Procedure : aucun retour

  • VentilationEF_Selection_Stock

    • reçoit le RecordSql Ventilation_Lire

    • permet de tester des données de la ventilation courante

    • Fonction : retour ‘O' par défaut

 

Xmt_call dans un module PM

Exemple d’ouverture générique de haut niveau

On voit ici du code métier appelé pour initialiser ou modifier le titre d’une fenêtre. Ce code intermédiaire est appelé par tous les programme qui ont un visuel écran.

Cette procédure métier de niveau intermédiaire offre une ouverture générique : “Titre_fenetre_av”

Cette ouverture peut exister ou non

  • elle est par exemple présente dans le GGTT100 pour compléter le titre par défaut

  • elle est absente de la majorité des programmes, mais la possibilité est offerte de l’ajouter

Une ouverture placée dans un xxPM ou un xxTM est toujours appelée dans le xxTT ! Ce n’est pas parce l’ouverture est dans un xxPM que l’on fait appel au xxTM