Précédent   Forum du club des développeurs et IT Pro > Systèmes > Autres systèmes > AS/400
AS/400 Le Forum d'entraide sur IBM AS/400 - iSeries. RPG.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/09/2012, 10h40   #1
totofff77
Invité de passage
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
Par défaut Procédure sur As400

Bonjour,

J'aborde l'appel de procédure, et comme ma boite ne fait aucune formation , j'ai qq soucis pour mettre en oeuvre. Pour mon exemple, j'ai fais une procédure qui me calcule la transformation d'une date (cf,le code dessou) de 'yy/mm/dd' en 'mm/dd/ccyy' :


H NOMAIN
D Proc001 pr
D 8A
D 10A
*
*
P PROC001 B
D PROC001 Pi
D var1 8A
D var2 10A
/free
// 'yy/mm/dd' TO 'mm/dd/ccyy'
var2 = %char(%date(var1:*ymd/):*usa/);
RETURN ;
/end-free

J'ai fais 15 pour en faire un module .
Maintenant avec l'option 27 (crtsrvpgm) pour en faire un pgm de service ça coince, voila la log:

Citation:
Message . . . . : RICAWRK/QRPGLESRC.PGB ligne 1 : ***ERREUR Syntaxe
incorrecte.
Cause . . . . . : Une erreur de syntaxe a été détectée dans le fichier
source en langage de liage. Cette erreur s'est produite lors de la
compilation de la ligne 1 du membre source en langage de liage PGB, dans l
fichier QRPGLESRC de la bibliothèque RICAWRK, durant une tentative de
création du programme de service PGB dans la bibliothèque RICAWRK.
Que faire . . . : Corrigez l'erreur de syntaxe et relancez les commandes
CRTSRVPGM (Créer un programme de service) ou UPDSRVPGM (Mettre à jour un
programme de service).
Technical description . . . . . . . . : The service program is not created
Autre question il faut créer je crois un BNDDIR auquel j'ajoute mon pgm de service. Et ensuite mettre en carte h mon bnddir et appeler la procédure par un CALLP nomprocédure(:parm :parm). Est ce exact ?
totofff77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 09h59   #2
m4k-Hurrican
Membre confirmé
 
Inscription : octobre 2006
Messages : 224
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 224
Points : 222
Points : 222
Bonjour,

Alors plusieurs choses :
  • Un programme de service est sensé (mais ce n'est pas obligatoire hein...) regrouper plusieurs fonctions. Mets y donc toutes tes fonctions de traitement de dates, chaines et nombres par exemple
  • Pour qu'une procédure puisse être utilisée ailleurs que dans le programme où elle se situe, il te manque le mot clé EXPORT sur la ligne P PROC001 B ...
  • Pour qu'il puisse être créé le programme de service nécessite un source de liage (généralement dans le fichier QSRVSRC). Tu y mettras la liste des procédures à exporter :
    Code :
    1
    2
    3
                STRPGMEXP  LVLCHK(*NO)                              
                EXPORT     SYMBOL(PROC001)                            
                ENDPGMEXP
    Attention, le nom de la procédure doit être ici en majuscules, et tu ne dois jamais changé l'ordre des procédures. Ajoute les à la liste.
    Donne le même nom que le nom de ton programme de service à ce membre source, ou indique l'autre nom au paramètre EXPORT (et paramètre SRCFILE pour le nom du fichier et bibliothèque si tu n'utilise pas les fichiers par défaut).
  • Enfin, oui tu dois créer un répertoire de liage dans lequel tu ajouteras ton programme de service, et que tu ajouteras dans tes cartes H avec la syntaxe BndDir(NomduRepertoireDeLiage)

Maintenant je ne saurais trop te conseiller de chercher un peu sur le net, tu trouveras des tas d'exemples et de conseils.

Edit :
Un CallP ce n'est intéressant que si ta procédure ne retourne pas de valeur.
Ici, je n'aurais pas fais comme çà, mais transmis un seul paramètre, avec une valeur en retour. Comme çà :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
P Cvt_DatIsoAToUsaA...                                              
P                 B                   Export                        
D Cvt_DatIsoAToUsaA...                                              
D                 PI            10a                                 
D  P_DatIsoA                     8a   Const                         
                                                                    
D  W_DatUsaA      s             10a                                 
                                                                    
 /free                                                              
   // 'yy/mm/dd' TO 'mm/dd/ccyy'                                    
   W_DatUsaA = %char(%date(P_DatIsoA:*ymd/):*usa/);                 
   Return W_DatUsaA ;                                               
 /end-free                                                          
P Cvt_DatIsoAToUsaA...                                              
P                 E
Ensuite dans le programme appelant tu fais un :
Code :
DatUsaA = Cvt_DatIsoAToUsaA(DatIsoA);
m4k-Hurrican est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 10h01   #3
larry57
Membre confirmé
 
Homme
Analyste-Programmeur as/400 et Java
Inscription : août 2002
Messages : 173
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations professionnelles :
Activité : Analyste-Programmeur as/400 et Java
Secteur : Finance

Informations forums :
Inscription : août 2002
Messages : 173
Points : 235
Points : 235
Bonjour,

Il y a des cours gratuits chez IBM :

http://www-304.ibm.com/jct03001c/ser...age&c=a0000656

Le cours sur l'ILE a la référence OE41.

Pour mat part, je fait :
un RPGLE, un BND et un ILESRVPGM.
Tu utilises arcad ?

larry57
larry57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 10h02   #4
larry57
Membre confirmé
 
Homme
Analyste-Programmeur as/400 et Java
Inscription : août 2002
Messages : 173
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations professionnelles :
Activité : Analyste-Programmeur as/400 et Java
Secteur : Finance

Informations forums :
Inscription : août 2002
Messages : 173
Points : 235
Points : 235
Citation:
Envoyé par m4k-Hurrican Voir le message
Maintenant je ne saurais trop te conseiller de chercher un peu sur le net, tu trouveras des tas d'exemples et de conseils.
Si tu as un lien...

Larry57
larry57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2012, 15h49   #5
totofff77
Invité de passage
 
Inscription : octobre 2006
Messages : 18
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 18
Points : 4
Points : 4
Par défaut suite

je retarde un peu mais je vais essayer de suite, merci pour les infos.
Une derniere question de bleu. La différence entre l'appel d'un pgm de service et un appel de pgm externe, quelle est la différence? le fait de pouvoir pgm ds un autre lange et la possibilité de l'appeler dans un rpg ?
totofff77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2012, 21h07   #6
m4k-Hurrican
Membre confirmé
 
Inscription : octobre 2006
Messages : 224
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 224
Points : 222
Points : 222
Attention, un programme de service n'est pas un programme dans le sens habituel. C'est plutôt une bibliothèque de fonctions.
On appelle les procédures qu'il contient, pas le programme lui-même.
L'avantage conséquent d'un programme de service est de regrouper un ensemble de fonctions sans nécessiter la recompilation des programmes utilisant ces fonctions.
Exemple :
J'ai personnellement un programme de service dans lequel j'ai une tonne de fonctions. Du traitement de chaînes de caractères, nombres, dates, à l'affichage d'une fenêtre d'erreur standardisée. Lorsque pour des raisons techniques j'ai eu à modifier la procédure d'affichage d'erreur, j'ai modifié le source, reconstruit le module puis le programme de service, et ... c'est tout. Les dizaines de programmes utilisant cette fonction ont immédiatement bénéficié des améliorations. J'ai rajouté des paramètres optionnels, les programmes existants n'y ont vu que du feu. Seuls ceux en ayant besoin et que j'ai modifié à dessein, ont profité des extensions apportées. (en fait j'ai recréé la commande/fonction MsgBox de VisualBasic en apportant des paramètres petit à petit).
Autre exemple :
Ta procédure de traitement de date va être utilisée dans x programmes. Tu t'aperçois au bout de quelques temps que tu as besoin de rajouter un traitement d'erreur. Tu l'ajoutes à ta procédure, et au lieu de recompiler tous les x programmes liés à la fonction, tu recompiles le module, tu recrées le programme de service et c'est tout. Gain de temps, gain de lisibilité, gain de facilité de maintenance, c'est tout bénef.
m4k-Hurrican est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h02.


 
 
 
 
Partenaires

Hébergement Web