Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Discussion: Procédure sur As400

  1. #1
    Invité régulier
    Inscrit en
    octobre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 18
    Points : 5
    Points
    5

    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:

    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 ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    octobre 2006
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : octobre 2006
    Messages : 320
    Points : 395
    Points
    395

    Par défaut

    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);

  3. #3
    Membre confirmé
    Homme Profil pro Stéphane
    Analyste-Programmeur as/400, Java et Windev
    Inscrit en
    août 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : août 2002
    Messages : 191
    Points : 264
    Points
    264

    Par défaut

    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

  4. #4
    Membre confirmé
    Homme Profil pro Stéphane
    Analyste-Programmeur as/400, Java et Windev
    Inscrit en
    août 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Nom : Homme Stéphane
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : août 2002
    Messages : 191
    Points : 264
    Points
    264

    Par défaut

    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

  5. #5
    Invité régulier
    Inscrit en
    octobre 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 18
    Points : 5
    Points
    5

    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 ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    octobre 2006
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : octobre 2006
    Messages : 320
    Points : 395
    Points
    395

    Par défaut

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •