Introduction
Le but est de comprendre les différences et particularités des procédures de type public par rapport aux procédures de type privé.
Procédures internes, rappel
Il est possible de créer des procédures internes à un programme interactif, batch ou serveur Adélia.
Pour cela il faut aller dans l’arborescence du programme au moyen du menu contextuel sur la racine « PGM » et choisir l’option Créer, puis l’option Procédure.
Un bloc PROC est alors créé dans l’arborescence ainsi que dans le source L4G.
Il convient de renommer ce bloc au moyen du menu contextuel sur le bloc PROC, par l’option Renommer, afin de lui donner un nom en adéquation avec sa fonction. Par exemple : CALCUL_TVA, CALCUL_TTC.
Si une procédure contient des paramètres, ceux-ci doivent être déclarés en variables locales dans la procédure.
L'appel de la procédure s'effectue depuis l'un des blocs traitement du programme au moyen de l'instruction TRAITER_PROC suivie des éventuels paramètres attendus par la procédure.
TRAITER_PROC CALCUL_TVA WMONT_HT WMONT_TTC
Une procédure de même nom doit exister dans l'arborescence
[DECLARATION] /* déclaration des variables paramètre de la procédure NUM_E(13,2) PMONT_HT NUM_E(13,2) PMONT_TTC /* déclaration des paramètres gérés en entrée/sortie par la procédure PARAM PMONT_HT PMONT_TTC [Traitement] /* traitement de calcul du montant TTC à partir du HT et du taux TVA PMONT_TTC = PMONT_HT * 1,186
Définir le type de la procédure : Client, Serveur ou Commun
Par défaut une procédure est de type Client. Mais si celle-ci contient des traitements serveur, et si la totalité de ses traitements peut s’exécuter en serveur, il conviendra de modifier le type pour le définir en type Serveur.
Particulièrement lorsque la procédure est appelée dans une boucle de traitements serveurs. Par exemple une boucle de lecture d’un curseur.
Pour cela, dans l’arborescence choisir l’option Définir le type du menu contextuel sur la procédure, puis l’option Serveur, et ensuite sélectionner le serveur logique requis.
Si les traitements de la procédure ne font aucun accès base de données et peuvent s’exécuter soit en client soit en serveur selon les besoins du traitement principal, la procédure peut être définie de type Commun. Ainsi, le module de traitement de la procédure sera généré en client dans le répertoire des objets clients, et en serveur sur le serveur d’application métier. Et elle pourra ainsi être appelée soit dans une partie client soit dans une partie serveur du programme principal.
Procédure de type client Privé
Dans un programme Visual Adélia batch ou Serveur Adélia, il est possible de créer des procédures de type client Public ou Privé. Une procédure de type Privé est une procédure interne au programme où elle est créée, et elle ne peut être appelée que par celui-ci par l’instruction TRAITER_PROC, comme dans l’exemple précédent.
Une procédure client Privé peut être appelée par une procédure client Public dans un programme de service comme nous le verrons ci-dessous.
Procédure de type client Public
Il est possible de créer des procédures de type client Public dans un programme Visual Adélia batch ou Serveur Adélia. Ceci afin de créer des programmes dits de services regroupant un ensemble de procédures pouvant être appelées par différents programmes Visual Adelia et, dans le cas d’un programme serveur Adelia de services, par différents programmes Web Adélia.
Pour cela, après avoir créé et renommé la procédure, dans l’arborescence, choisir l’option Définir le type du menu contextuel sur la procédure, puis l’option Client et ensuite sélectionner l’option Public.
Les paramètres gérés par une procédure Public doivent bien évidemment être déclarés en variables locales dans la procédure.
Exemple :
[DECLARATION] * Variables paramètre de la procédure CALC_MENSUEL du programme batch VA_PERSO_PROC. NUM_E(13,2) ww_total_mensuel NUM_E(13,2) ww_moy_salaire NUM_E(13,2) ww_max_salaire NUM_E(13,2) ww_min_salaire ALPHA(1) ww_code_sexe * déclaration des paramètres gérés en entrée/sortie par la procédure PARAM ww_code_sexe ww_total_mensuel ww_moy_salaire ww_max_salaire ww_min_salaire [(Traitement) * Récupération de la masse salariale du personnel, du salaire moyen, du salaire maximum et du * salaire minimum pour tous les employés ou, soit uniquement pour les hommes, soit uniquement * pour les femmes. Le traitement se fait sur le serveur logique CENTRAL. DEBUT_SRV CENTRAL Si ww_code_sexe = 'T' lire_sql personnel *col(somme(PE_MTT_SALAIRE) :ww_total_mensuel, - moyenne(PE_MTT_SALAIRE) :ww_moy_salaire, max(PE_MTT_SALAIRE) :ww_max_salaire, - min(PE_MTT_SALAIRE) :ww_min_salaire) sinon lire_sql personnel *col(somme(PE_MTT_SALAIRE) :ww_total_mensuel, - moyenne(PE_MTT_SALAIRE) :ww_moy_salaire, max(PE_MTT_SALAIRE) :ww_max_salaire, - min(PE_MTT_SALAIRE) :ww_min_salaire) *cond(Pe_COD_SEXE_PER = :ww_code_sexe) Fin FIN_SRV ]
Appel d’une procédure de type client Public depuis un programme :
L’appel d’une procédure de type client « Public » depuis un programme appelant se fait directement par l’instruction APPELER.
Syntaxe type :
APPELER NomProgramme.NomProcédure Suite de Paramètres attendus par la procédure.
* Depuis un programme interactif d’affichage de données statistiques sur la table du personnel, * récupération de la masse salariale mensuelle, des salaires moyen, maximum et minimum par appel * de la procédure CALC_MENSUEL du programme Visual Adélia batch VA_PERSO_PROC. APPELER VA_PERSO_PROC.CALC_MENSUEL lbr_sexe:valeur cho_masse_salariale_mensuelle:valeur -cho_moy_salariale:valeur cho_max_salaire:valeur cho_min_salaire:valeur
Il est déconseillé de créer des procédures de type client « Public » de service dans un programme batch ou serveur Adélia n’étant pas un programme de services mais un programme de gestion classique. Il est préférable de regrouper toutes les procédures susceptibles d’être exécutées par plusieurs programmes au sein d’un même programme de services.
Si les traitements d’une procédure de type client « Public » font des accès base de données, et si l’intégralité de ceux-ci peut s’exécuter en serveur, il convient de créer cette procédure dans un programme « Serveur » Adélia. En effet, un programme Visual Adélia Client/Serveur est composé d’une DLL « cliente » et d’un à plusieurs modules serveurs. Son appel se fait donc par l’instruction APPELER sans affectation de serveur logique.
Appel d’une procédure de type client Privé depuis une procédure de type client Public :
[DECLARATION] * Variables paramètre de la procédure NB_EMPLOYE_SOCIETE de type client « Public » ALPHA(300) wrequete ALPHA (30) wnom_societe NUM_BIN_4 wnb_employe ALPHA(1) ww_code_sexe LISTE lsm_nb_empl_societe wnom_societe wnb_employe CURSEUR cur_nb_emp_societe :wrequete * déclaration des paramètres gérés en entrée/sortie par la procédure PARAM ww_code_sexe lsm_nb_empl_societe [(Traitement) * appel de la procédure REQUETE de type client « Privé » TRAITER_PROC REQUETE wrequete ww_code_sexe DEBUT_SRV CENTRAL ouvrir_sql_c cur_nb_emp_societe lire_av_sql_c cur_nb_emp_societe :wnom_societe, :wnb_employe tant_que *sqlcode = *normal inserer_elt lsm_nb_empl_societe lire_av_sql_c cur_nb_emp_societe :wnom_societe, :wnb_employe refaire fermer_sql_c cur_nb_emp_societe FIN_SRV ]
[DECLARATION] * Variables paramètre de la procédure REQUETE de type client « Privé » ALPHA(300) pwrequete ALPHA(1) pww_code_sexe * déclaration des paramètres gérés en entrée/sortie par la procédure PARAM pwrequete pww_code_sexe [(Traitement) Pwrequete = *blank si pww_code_sexe = 'T' pwrequete = 'select SOLSOC, count(PEPMAT) from exiws.personp, exiws.societe where PECSTE=SOCSTE group by SOLSOC' sinon pwrequete = 'select SOLSOC, count(PEPMAT) from exiws.personp, exiws.societe where PECSTE=SOCSTE and' /// - ' PEPSEX = ''' /// pww_code_sexe /// '''' /// ' group by SOLSOC' fin ]