IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AS/400 Discussion :

Appel d'un *PGM RPGLE depuis un *PGM COBOL - Longueur paramètre


Sujet :

AS/400

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut Appel d'un *PGM RPGLE depuis un *PGM COBOL - Longueur paramètre
    Bonjour.
    Je souhaite créer un *PGM en RPGLE qui peut être appelé par plusieurs *PGM écrits en COBOL, dont je ne maîtrise pas les sources (donc pas les compilations).
    Le programme RPGLE reçoit un paramètre en caractères.
    Dans les *PGM COBOL, les appels à ce programme transmettent un paramètre en caractère dont la longueur n'est pas toujours la même (parfois, c'est 1000 caractères, parfois 20 000, parfois 100 000).
    Et le COBOL est plus strict que le RPG : si je déclare dans le RPG un paramètre reçu de 100 000 caractères, le programme COBOL qui l'appelle avec un paramètre de 5 000 va planter...

    J'ai essayé pas mal de trucs, mais je sèche un peu pour faire un programme RPGLE qui puisse être appelé par des COBOL qui lui transmettent le même paramètre, mais déclarés avec des longueurs différentes.

    Quelqu'un a déjà résolu ce problème ?

    Merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    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 : 691
    Points : 996
    Points
    996
    Par défaut
    Bonjour,

    Et si tu définissais simplement ton champ en Varchar ?

  3. #3
    Membre averti
    Homme Profil pro
    Analyste-Programmeur IBM i, IBM Cognos TM1
    Inscrit en
    Août 2002
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur IBM i, IBM Cognos TM1
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2002
    Messages : 234
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    tu peux essayer dans ton programme :
    D monprog Pi
    D 10000A varying const options(*varsize)

    Larry57

  4. #4
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Dans le RPG appelé, j'ai fait cette déclaration de procédure/interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dcl-proc main;
    dcl-pi main extpgm;
       pPARM1 int(10) const;
       pPARM2Len int(10) const;
       pPARM2 char(150000) options(*varsize);
    end-pi;
    Le problème est sur la longueur du 3ème paramètre (pPARM2) : dans le COBOL appelant, il est déclaré en 100 000, et dans le RPG, en 150 000.
    Le problème n'est pas sur la longueur en elle-même (l'appel fonctionne), mais sur la récupération de la variable retour dans l'appelant. Elle semble déborder sur d'autres variables (probablement une déclaration en structure, mais je n'en sais rien), et c'est le programme appelant qui plante.
    La solution avec du VARCHAR ne fonctionne pas, car les appelants ne transmettent pas du varchar, donc ne sont pas capables de le récupérer. Du coup, ils prennent les 4 premier bits pour de la donnée, ce qui est faux (vu que c'est la longueur des données).
    J'ai essayé de jouer avoir les pointeurs de variable pour faire chevaucher des variables locales et le paramètre), mais je n'arrive pas à un résultat correct.
    J'ai aussi essayé de remplacer le paramètre par un pointeur, mais je n'arrive pas à indiquer que c'est une chaine en retour (options(*string) ne marche que pour du pointeur entrant)

  5. #5
    Membre averti
    Homme Profil pro
    Analyste-Programmeur IBM i, IBM Cognos TM1
    Inscrit en
    Août 2002
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur IBM i, IBM Cognos TM1
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2002
    Messages : 234
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    Ce que je ferait, c'est que je remplacerait le paramètre dans ce cas précis par une table dans Qtemp dont je récupèrerai le contenu dans le programme Cobol à partir du moment où je ne retourne que 2 paramètres par exemple.
    Je ne vois pas vraiment de solution simple en ce qui concerne le passage de paramètres.
    Tu peux aussi poster ton pb sur le forum Volubis, il y a un "champion" qui pourra te répondre.

    Larry57

  6. #6
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    L'idée, c'est de ne pas avoir à recompiler la kyrielle de programmes applicatifs COBOL qui appellent ce nouveau programme remplaçant.
    Je vais le faire sur le forum Volubis, tu as raison.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    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 : 691
    Points : 996
    Points
    996
    Par défaut
    Après relecture de tes paramètres je comprends mieux.
    Çà fonctionne comme une API, et donc tu as le paramètre n° 2 qui te transmet la taille du paramètre 3. Ce n'est pas du varchar.

    Je te propose donc de suivre le raisonnement suivant.
    Définir un champ varchar suffisamment grand pour tenir tous les paramètres possibles en tant que variable de travail.
    Remplit cette variable avec un substring du paramètre 3 d'une longueur paramètre 2.
    Effacer le paramètre 3 pour éviter les caractères au delà de cette longueur.
    Faire ton traitement en utilisant ta variable varchar.
    Placer ta variable varchar dans ton paramètre 3 avant de quitter le programme.

  8. #8
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    En réalité, le problème n'est pas réellement dans ce programme, mais dans ceux qui l'appellent, des COBOL que je ne peux pas recompiler.
    Ils font des appels à un programme en C que je veux remplacer par du RPG, et ils récupèrent un paramètre dont la longueur est variable.
    Mais le COBOL semble avoir un problème (ou le codage du COBOL qui a été fait a un problème) : si le COBOL déclare une variable plus courte que celle déclarée dans le prototype du RPG (ex. : 5 000 dans le COBOL et 100 000 dans le RPG), au retour de l'appel, les variables qui "suivent" celle qui m'intéresse sont initialisées à nul (x'00'). Et du coup, plus rien ne marche dans les COBOL.
    Pour que la solution du varchar fonctionne, il faudrait modifier et recompiler les COBOL en fonction, et c'est justement ce que je veux éviter de faire.

    Pour info, j'ai fait un programme en C pour gérer cette "variabilité" de longueur. C'est chaud (je n'ai jamais fait de C de ma vie), mais ça a marché.

    Merci pour vos réponses.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    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 : 691
    Points : 996
    Points
    996
    Par défaut
    Ok, je comprends enfin le comment du pourquoi, mais dans ce cas tu dois pouvoir t'en sortir en RPGLE en déclarant un pointeur avec les mots-clés value options(*string) à la place de ton paramètre 3

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appelle d'un pgm SCL dans un pgm SAS
    Par alexd dans le forum SAS AF et formulaires
    Réponses: 3
    Dernier message: 08/08/2008, 11h51
  2. Réponses: 1
    Dernier message: 09/04/2008, 16h48
  3. Appel d'un script PHP depuis PERL
    Par tazmann dans le forum Web
    Réponses: 7
    Dernier message: 09/11/2007, 02h12
  4. Réponses: 1
    Dernier message: 24/04/2006, 18h03
  5. Réponses: 14
    Dernier message: 15/12/2005, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo