pgm de service en SQLRPGLE

20-12-2006 à 23:44:03
Bonjour à tous,

Une modification dans un pgm de service RPG ILE est automatiquement appliquée à la prochaine utilisation du pgm éxécutable.
A ce stade tout va bien, les services sont prévus pour cela.

Mais une modification dans un pgm de service SQLRPGLE nécessite
la recompilation de l'éxécutable appelant ce service.
Ce phénomène est plutôt ennuyeux.
Sachant que la compilation en sql s'effectue en deux temps,
il ya peut être une astuce quelque part.

Si quelqu'un d'entre vous à une bonne idée sur le sujet,

MERCI D'AVANCE.
  • Liens sponsorisés



20-12-2006 à 11:20:22
Quels messages reçois-tu ?

SQL n'a rien à voir là-dedans. Que le programme source soit de type RPGLE ou SQLRPGLE ne change rien à l'affaire.

Est-ce que le programme de service est compilé avec l'option SRCFILE(*LIBL/QSRVSRC) ? Et si oui, comment est gérée la signature sur la commande STRPGMEXP ?

Règles d'or

1/ Ne jamais créer un programme de service sans avoir auparavant mis à jour le membre de QSRVSRC contenant le langage de liage qui s'y rapporte.

2/ Ne jamais employer CRTSRVPGM ... EXPORT(*ALL)

3/ Dans le membre de QSRVSRC:

- sur la commande STRPGMEXP, créer une signature une fois pour toutes et ne plus jamais y toucher. Indiquer par exemple le nom du projet dans cette signature

- ajouter toujours les nouveaux exports (nouvelles procédures) à la fin de la liste, et ceci quel que soit l'ordre dans lequel les procédures se trouvent dans le programme de service. Le mieux est toutefois de respecter l'ordre du programme de service pour faciliter la maintenance.

- ne jamais retirer les anciens exports.

- ne jamais changer l'ordre des exports.

Si vous suivez ces quelques règles, vous n'aurez pas à recompiler les programmes non touchés par vos modifications.

Exemple:


* 1/ Création du module

CRTRPGMOD MODULE(MaBibObj/MonProgramme) +
* SRCFILE(MaBibSrc/MonProgramme)

* 2/ Langage de liage dans le membre de QSRVSRC

/* ================================================== */
/* Nouveaux exports doivent être ajoutés A LA FIN. */
/* Anciens exports ne doivent être JAMAIS retirés de */
/* la liste. */
/* !!!! L'ORDRE NE DOIT JAMAIS CHANGER !!!! */
/* !!! La SIGNATURE ne doit plus jamais changer !!! */
/* ================================================== */
* STRPGMEXP SIGNATURE('Ce que je veux')

* EXPORT SYMBOL(MaProcedure1)
* EXPORT SYMBOL(MaProcedure2)
* EXPORT SYMBOL(MaProcedure3)
* etc...

* ENDPGMEXP

*

* 3/ Création du programme de service

CRTSRVPGM SRVPGM(MaBibObj/MonProgramme) +

* MODULE(*SRVPGM) +

* EXPORT(*SRCFILE) +

* SRCFILE(MaBibSrc/QSRVSRC) +

* SRCMBR(*SRVPGM)
20-12-2006 à 11:57:34
Merci Philippe pour ce rappel,

Pour répondre à ta première question :
Je n'ai aucun message système.

Ensuite je dois te préciser que jusqu'à présent je n'utilise jamais
de langage de liage mais seulement le répertoire de liage.

Et en effet dans CRTSRVPGM j'ai bien EXPORT(*ALL).
C'est tellement plus simple ainsi et tout fonctionne sans soucis
sauf pour mes nouveaux pgm de service.

Mais avec les éléments de ta réponse je vais améliorer mes
procédures de compilation.

Merci.


20-12-2006 à 12:21:39
Quel du répertoire de liage ? Je ne comprens pas.

Il faut faire tout son possible pour utiliser le langage de liage (bind) dans QSRVSRC pour rendre les programmes plus faciles à gérer, plus stables et bien moins gros qu'avec la séduisante et paresseuse option EXPORT(*ALL).

Si tu continues à utiliser EXPORT(*ALL), un jour ou l'autre tu auras des ennuis et/ou des problèmes d'authorisations...
20-12-2006 à 14:11:52
OK Phillipe,

Le répertoire de liage est créé par CRTBNDDIR
et contient par exemple tous les pgm de services d'une application.


Et dans chaque CRTPGM on indique le répertoire de liage à consulter
pour récupérer les noms des pgm de service (liage par référence).

Ainsi chaque sous-procédure est retrouvée.

Pour ajouter un sercice dans le répertoire de liage j'utilise
un petit CLP qui le supprime et l'ajoute au moment du CRTSRVPGM.

Cette façon de faire fonctionne bien mais à besoin d'évoluer.

Merci Philippe pour tes remarques.

20-12-2006 à 15:22:00
Sauf si vous êtes en V5R1 (je crois), mais si votre OS est V5R2+, vous n'avez pas besoin d'indiquer le nom du répertoire de liage sur vos commandes de compilation car c'est le plus sûr moyen de l'oublier. Il vaut beaucoup mieux et de loin l'indiquer une fois pour toutessur vos spécifs H dans vos programmes.
H BNDDIR(REPERT1 : REPERT2 ...) DFTACTGRP( *NO ) ...

20-12-2006 à 18:40:53
Merci Phillipe pour cette dernière méthode, mais comme mes CRTPGM sont aussi lancés (option PDM) par un petit CLP dans lequel j'indique
le ou les répertoires de liage ( et une seule fois) je suis sur que tous les sources trouveront leurs sous-procédures.

--------------------------
  • Liens sponsorisés