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

Cobol Discussion :

Paramètres variables en Cobol


Sujet :

Cobol

  1. #1
    Membre averti
    Femme Profil pro
    Architecte technique
    Inscrit en
    Janvier 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 179
    Points : 350
    Points
    350
    Par défaut Paramètres variables en Cobol
    Bonjour à tous,

    une question récurente sur mon site dont je n'ai pas réussi à trouver d'autre solution que de passer par un programme "Stub" assembleur.

    connaitriez vous un moyen dans un programme cobol de connaitre le nombre réél de parametres qu'il reçoit?
    je m'explique :

    ProgA Call PROGB Using Parm1 Parm2
    mais
    ProgC Call PROGB Using parm1

    le but est dans PROGB de savoir s'il reçoit 1 ou 2 adresses de parametres valides.
    La seule solution que j'ai trouvé est de faire :

    ProgA Call ProgD using ProgB Parm1 Parm2
    ProgC Call ProgD Using ProgB parm1

    ou ProgD est un assembleur qui test le Bit de fin de liste des parametres du R1 et appel ProgB en lui passant le nombre réel de parametres en 1er argument..

    Il est possible de connaitre le nombre et la longueur des arguments passé à un Cobol depuis les PARM jcl via les routines LE, mais pas pour les sous programmes à ma connaissance..

  2. #2
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Il faudrait essayer tous les cas d'appel, mais à mon avis il suffit de coder un PROCEDURE DIVISION USING de tous les paramètres possibles puis de tester si l'adresse de la donnée de niveau 01 en Linkage est initialisée ou non. On dispose du mot NULL pour ça avec Enterprise COBOL. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Linkage Section.                               
     01  LS-PARM1                  Pic X(100).      
     01  LS-PARM2                  Pic X(100).      
     Procedure Division Using LS-PARM1 LS-PARM2.    
    *------------------------------------------     
         .........                                  
         if  address of LS-PARM2 = NULL              
             Display 'Pas de seconde adresse recue' 
             .......
    En tous cas pour le peu que j'ai essayé comme ça je n'ai pas eu de surprise.
    En fait COBOL II IBM adresse la PARM-LIST reçue (modalité de communication standard, telle qu'utilisée en programmation assembleur) dans la TGT. Si on demande à récupérer trop d'adresses via le USING, on aurra simplement des mots d'adressage 'Base Locators for Linkage' en TGT qui sont non remplis ou invalides ce qui correspond typiquement au cas d'emploi de NULL ou NULLS pour tester avant de risquer un S0C4 en tentant de travailler avec ces BLL.
    Variante : SET address ot LS-PARMN to PTR (défini en usage Pointer) puis comparaison PTR avec NULL.

    Dernier point, la longueur de la zone communiquée. Pourquoi ne pas faire en Batch comme pour CICS et demander que l'appelant passe systématiquement l'info. C'est plus confortable surtout dans des hypothèses de maintenance future exemple : CALL 'MYCOB' USING WS-WORK BY CONTENT LENGTH OF WS-WORK.

  3. #3
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Il y avait une boulette dans le post précédent. Je l'avais corrigé mais il y a eu une régression.
    Variante : SET PTR to address ot LS-PARMn (on charge une adresse)

    Maintenant pour info xfanx, puisque tu utilises l'assembleur, tu peux aussi travailler directement avec la TGT pour vérifier les BLF chargées. Enterprise COBOL l'adresse par le registre 9. Par ailleurs le Registre 13, plus stable, pointe toujours sur une DSA. Une liste de compilation de ton programme te donneras le détail du contenu TGT et DSA. En clair un ASM de qques instructions pour rendre à un COBOL le contenu des registres 9 et 13 te permet de faire ensuite ce que tu veux dans le COBOL, par exemple vérifier quel progamme L.E. l'a appelé et comment.
    Un ASM réentrant comme ça par exemple (pas de savearea, on le touche qu'au reg. 15 pour que L.E. n'y voit que du feu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MYTGT    CSECT
    MYTGT    AMODE ANY
    MYTGT    RMODE ANY
             LTR   1,1
             BZR   14
             L     15,0(,1)
             ST    9,0(,15)
             ST    13,4(,15)
             BR   14
             END

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

Discussions similaires

  1. Requête avec paramètres variables
    Par dahu17 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/05/2007, 11h38
  2. Réponses: 11
    Dernier message: 30/03/2006, 16h39
  3. ouverture popup avec un paramètre => variable php
    Par gmonta31 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/03/2006, 09h59
  4. Réponses: 4
    Dernier message: 09/02/2006, 17h22
  5. Réponses: 5
    Dernier message: 09/02/2005, 19h50

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