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.
 

Exemple
TRAITER_PROC CALCUL_TVA WMONT_HT WMONT_TTC 


Une procédure de même nom doit exister dans l'arborescence
 

procédure CALCUL_TVA
[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 : 

 

Procédure CALC_MENSUEL
[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.

 

Exemple
* 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  :

Procédure NB_EMPLOYE_SOCIETE
[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 
]
Procédure REQUETE
[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
]