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 :

Gestion type de fichier particulier / routine Assembleur


Sujet :

Cobol

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Gestion type de fichier particulier / routine Assembleur
    Bonjour,

    Nous avons actuellement des programmes COBOL qui gèrent différents type de fichiers grâce à une routine PL/1 à laquelle nous fournissons le DDNAME, l'action à faire sur le fichier (ouverture, lecture, ecriture, fermeture ..), sa taille (...). La routine PL/1 permet donc de gérer ces fichiers.
    Il nous a été demandé de remplacer ces routines PL/1 par des routines Assembleur.
    Problème : Je ne connais pas du tout l'assembleur.
    D'où ma question : Cette gestion est-elle possible via des routines Assembleur ? si oui, auriez vous des exemples ?

    Merci par avance.

  2. #2
    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
    hum.. si tu ne connais pas l'assembleur ça risque d'être un peu compliqué à coder quand même

    pour répondre à ta question, oui bien sur que ce genre de chose est faisable en assembleur, oriente tes recherches dans les documentations IBM assembleur autour du SVC 99.

    personnellement sur notre site, nous avions aussi ce type de module, justement écrit en assembleur, mais pour des raisons de maintenance et de connaissance du langage, nous l'avons plutôt réécrit en C.

    bon courage

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par colchicine
    La routine PL/1 permet donc de gérer ces fichiers.
    Pourquoi une routine pour gérer les open/close et les read/write des fichiers ? Cobol ne suffit-il pas à lui tout seul ?


    Citation Envoyé par colchicine
    Problème : Je ne connais pas du tout l'assembleur.
    Tu parles de l'assembleur 360/370 ?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    A ta question :
    Citation Envoyé par Mercure Voir le message
    Pourquoi une routine pour gérer les open/close et les read/write des fichiers ? Cobol ne suffit-il pas à lui tout seul ?
    Il s'agit de fichier dont on ne connait pas les caractéristiques lors du lancement du programme COBOL, les informations sur le DDNAME et LRECL sont récupérés ce qui permet l'ouverture et la gestion du fichier via la routine PL/1

    Citation Envoyé par Mercure Voir le message
    Tu parles de l'assembleur 360/370 ?
    ==> Je ne sais même pas te répondre à cette question ... d'où mon floux total

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai trouvé une routine Assembler me permettant d'ouvrir / lire / écrire / fermer un fichier en l'appelant depuis un programme COBOL. Pour cela, on transmet à cette routine l'action à faire, et son ddname.
    Cela marche parfaitement quand j'ai un seul fichier.

    Mon soucis maintenanant est que si je veux ouvrir deux fichiers - la routine se mélange les pinceaux , et ne garde en mémoire que les paramètres du premier fichier (malgré le fait que je transmette bien le ddname du 2eme fichier).

    Auriez-vous une idée du comment je pourrais faire un sorte que cette routine marche avec plusieurs fichiers ?

    Voici le code de cette routine :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
             PRINT GEN                                                      
    GOSVB    START 0                                                        
    GOSVB    AMODE 31                                                       
    GOSVB    RMODE 24                                                       
             BAKR  14,0                                                     
             USING GOSVB,R12                                                
             LR    R12,R15                                                  
             LR    R10,R1                FOR ADDRESSING PARAMETERS          
             LA    R5,DCBFILE                                               
             USING IHADCB,R5                                                
             L     R2,4(,R10)            GET DDNAME                         
             MVC   DCBDDNAM,0(R2)        STORE DDNAME IN DCBFILE            
             L     R2,16(,R10)           GET RETURN CODE                    
             XC    0(4,R2),0(R2)         CLEAR RETURN CODE                  
             L     R2,0(,R10)            GET CODTRA                         
             CLC   0(8,R2),=CL8'OPENGET ' CODTRA = OPENGET ?                
             BE    OPENGET               YES GO OPEN FOR OPEN INPUT FILE    
             CLC   0(8,R2),=CL8'OPENPUT ' CODTRA = OPENPUT ?                
             BE    OPENPUT               YES GO OPEN FOR OPEN OUTPUT FILE   
             CLC   0(8,R2),=CL8'GET     ' CODTRA = GET  ?                   
             BE    GETFILE               YES GO READ FILE                   
             CLC   0(8,R2),=CL8'PUT     ' CODTRA = PUT ?                    
             BE    PUTFILE               YES GO WRITE RECORD                
             CLC   0(8,R2),=CL8'CLOSE   ' CODTRA = PUT ?                    
             BE    CLSFILE               YES GO WRITE RECORD                
             L     R2,16(,R10)           GET RETURN CODE                    
             LA    R3,200                INVALID CODTRA                     
             ST    R3,0(R2)              RETURN CODE = 200                  
    RETURN   EQU   *                                                        
             SR    R15,R15                                                  
             PR                          BYE BYE                            
    OPENGET  EQU   *                                                        
             WTO   'ICI SVA01'                                              
             L     R2,4(,R10)            GET DDNAME                         
             MVC   DCBDDNAM,0(R2)        STORE DDNAME IN DCBFILE            
             OPEN  (DCBFILE,(INPUT))                                        
             B     CHECKOPN                                            
    CHECKOPN EQU   *                                                   
             WTO   'ICI SVA02'                                         
             TM    DCBFILE+48,X'10'      OPEN OK ?                     
             BO    OPENOK                YES CONTINUE                  
             L     R2,16(,R10)           GET RETURN CODE               
             LA    R3,110                ERROR DURING OPEN FILE        
             ST    R3,0(R2)              RETURN CODE = 110             
             B     RETURN                                              
    OPENOK   EQU   *                                                   
             WTO   'ICI SVA03'                                         
             RDJFCB DCBFILE             RETRIEVE LRECL                 
             LTR   R15,R15                                             
             BZ    GETLRECL                                            
             L     R2,16(,R10)           GET RETURN CODE               
             ST    R15,0(R2)             RETURN CODE = R15             
             B     RETURN                                              
    GETLRECL EQU   *                                                   
             WTO   'ICI SVA04'                                         
             LA    R6,JFCBAREA                                         
             USING JFCB,R6                                             
             L     R2,12(,R10)           GET LGTAREA                   
             XC    0(4,R2),0(R2)         CLEAR LGTAREA                 
             XR    R4,R4                 CLEAR R4                      
             LH    R4,JFCLRECL           GET LRECL                     
             TM    JFCBTSDM,JFCSDS       SYSIN FILE ?                  
             BO    GETRECFM                                            
             TM    JFCDSRG1,JFCORGPS     CHECK FOR PS FILE             
             BO    GETRECFM              OK CONTINUE                   
             TM    JFCDSRG1,JFCORGPO     CHECK FOR PO FILE             
             BNO   FILEINVA NO,INVALID ORGANISATION                    
             CLI   JFCBELNM,X'40'        YES,MEMBER NAME PRESENT ?     
             BNZ   GETRECFM              YES CONTINUE                  
    FILEINVA EQU   *                                                   
             WTO   'ICI SVA05'                                         
             L     R2,16(,R10)           GET RETURN CODE               
             LA    R3,120                NOT PS FILE                 
             ST    R3,0(R2)              RETURN CODE = 120           
             B     RETURN                                            
    GETRECFM EQU   *                                                 
             WTO   'ICI SVA06'                                       
             TM    JFCRECFM,JFCFIX       RECFM = F ?                 
             BO    RECFMF                YES CONTINUE                
             TM    JFCRECFM,JFCVAR       RECFM = V ?                 
             BO    RECFMV                YES CONTINUE                
             L     R2,16(,R10)           GET RETURN CODE             
             LA    R3,130                INVALID RECFM               
             ST    R3,0(R2)              RETURN CODE = 130           
             B     RETURN                                            
    RECFMF   EQU   *                                                 
             WTO   'ICI SVA07'                                       
             MVI   RECFM,C'F'            STORE RECFM                 
    SAVLRECL EQU   *                                                 
             WTO   'ICI SVA08'                                       
             ST    R4,LRECL                                          
             ST    R4,0(R2)              STORE LRECL INTO LGTAREA    
             B     RETURN                                            
    RECFMV   EQU   *                                                 
             WTO   'ICI SVA09'                                       
             MVI   RECFM,C'V'            STORE RECFM                 
             SH    R4,=H'4'                                          
             B     SAVLRECL                                          
    OPENPUT  EQU   *                                                 
             WTO   'ICI SVA10'                                       
             L     R2,4(,R10)            GET DDNAME                  
             MVC   DCBDDNAM,0(R2)        STORE DDNAME IN DCBFILE     
             OPEN  (DCBFILE,(OUTPUT))                                
             B     CHECKOPN                                          
    GETFILE  EQU   *                                                 
             WTO   'ICI SVA11'                                       
             GET   DCBFILE,IOAREA                                    
             LA    R8,IOAREA                                         
             XR    R7,R7                                                 
             LH    R7,DCBLRECL           GET LENGTH OF RECORD.           
             CLI   RECFM,C'F'            RECFM = F ?                     
             BE    TRSFREC               YES GO TO MOVE                  
             SH    R7,=H'4'              SUBTRACT 4 FROM LENGTH          
             LA    R8,4(R8)              JUMP THE RDW                    
    TRSFREC  EQU   *                                                     
             WTO   'ICI SVA12'                                           
             L     R2,12(,R10)           GET LGTAREA                     
             ST    R7,0(R2)              STORE LGT OF RECORD INTO LGTAREA
             L     R6,8(,R10)            GET ZONEIO                      
             LR    R9,R7                 GET LENGTH OF RECORD            
             MVCL  R6,R8                 MOVE IOAREA TO ZONEIO           
             B     RETURN                                                
    PUTFILE  EQU   *                                                     
             WTO   'ICI SVA13'                                           
             L     R6,8(,R10)            GET ZONEIO                      
             LA    R8,IOAREA             GET ZONE OUTPUT                 
             L     R2,12(,R10)           GET LGTAREA                     
             CLI   RECFM,C'V'            IF RECFM = F THAN               
             BE    GETLGT                WE MOVE WITH THE SAVED LRECL    
             MVC   0(4,R2),LRECL                                         
    GETLGT   EQU   *                                                     
             WTO   'ICI SVA14'                                           
             L     R7,0(,R2)             GET LENGTH OF RECORD TO WRITE   
             C     R7,LRECL              LENGTH > MAX LRECL              
             BNH   ADAPTLGT              NO CONTINUE                     
             L     R2,16(,R10)           GET RETURN CODE                 
             LA    R3,140                INVALID LENGTH                  
             ST    R3,0(R2)              RETURN CODE = 140               
             B     RETURN                                                
    ADAPTLGT EQU   *                                                     
             WTO   'ICI SVA15'                                           
             CLI   RECFM,C'F'                                            
             BE    PUTREC                                                
             AH    R7,=H'4'             INCREASE LENGTH FOR RDW          
             STH   R7,IOAREA            CREATE RDW                          
             XC    IOAREA+2(2),IOAREA+2 CLEAR NEXT 2 BYTES                  
             LA    R8,4(R8)             JUMP RDW                            
    PUTREC   EQU   *                                                        
             WTO   'ICI SVA16'                                              
             LR    R9,R7                 GET LENGTH OF RECORD               
             MVCL  R8,R6                 MOVE ZONEIO TO IOAREA              
             PUT   DCBFILE,IOAREA                                           
             B     RETURN                                                   
    CLSFILE  EQU   *                                                        
             WTO   'ICI SVA17'                                              
             CLOSE DCBFILE                                                  
             B     RETURN                                                   
    EOFILE   EQU   *                                                        
             WTO   'ICI SVA18'                                              
             L     R2,16(,R10)           GET RETURN CODE                    
             WTO   'CODE RETOUR :         ',ROUTCDE=11                      
             LA    R3,100                END OF FILE                        
             ST    R3,0(R2)              RETURN CODE = 100                  
             B     RETURN                                                   
    LST      DS    0F                                                       
             DC    X'87'                                                    
             DC    AL3(JFCBAREA)                                            
    JFCBAREA DS    0F                                                       
             DS    CL176                                                    
    RECFM    DS    CL1                                                      
    LRECL    DS    1F                                                       
             LTORG                                                          
    DCBFILE  DCB   DSORG=PS,MACRF=(GM,PM),                                 *
                   DDNAME=SYSUT1,DCBE=DCBEFILE,EXLST=LST                    
    DCBEFILE DCBE  EODAD=EOFILE,RMODE31=BUFF                                
    IOAREA   DS    CL32768                                                  
             DCBD  DSORG=PS                                                 
    JFCB     DSECT                                                          
             IEFJFCBN LIST=YES                                              
    *                  
    R0       EQU   0   
    R1       EQU   1   
    R2       EQU   2   
    R3       EQU   3   
    R4       EQU   4   
    R5       EQU   5   
    R6       EQU   6   
    R7       EQU   7   
    R8       EQU   8   
    R9       EQU   9   
    R10      EQU   10  
    R11      EQU   11  
    R12      EQU   12  
    R13      EQU   13  
    R14      EQU   14  
    R15      EQU   15  
             END
    Merci par avance pour votre aide.

  6. #6
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour.

    Mes souvenirs sont très lointains, essaie de faire un CANCEL dans le programme Cobol de ton s/programme Assembleur juste avant de le rappeler pour le sortir de la pile d'appel et réinitialiser son état.

    Je ne suis pas sûr de cette piste mais elle est à creuser.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Je pense a une solution.

    Dans la zone de lien entre le PGM et le sous pro, tu ajoute des données parametres que tu valorises en sorties du sous programme, et tu les re-injecte a l'entree du sous programme

    Tu ne t'en serviras pas pour l'open, mais pour les autres actions, tu pourras.

    dis moi ce que tu en penses.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    J'ai essayé d'ajouter le "cancel' dans mon programme cobol, mais cela engendre un Abend lors du deuxième appel à la routine (à la lecture du 1er fichier) :
    The load request for module GOSVB was unsuccessful.
    Mais c'est effectivement une piste, à voir si une commande existe pour initialiser la routine à chaque appel.

  9. #9
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Donne nous le bout du code Cobol où tu fais les appels et les cancel de ton s/programme. Assure toi que le 2è appel passe bien les paramètres.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    @ minosubb
    [QUOTE=minosubb;5927551]Je pense a une solution.
    Dans la zone de lien entre le PGM et le sous pro, tu ajoute des données parametres que tu valorises en sorties du sous programme, et tu les re-injecte a l'entree du sous programme
    QUOTE]

    Je récupère déjà l'élément qu'il me manque (à savoir la taille du fichier), cependant, j'ai beau transmettre le DDNAME, l'action + la taille du fichier voilà ce qu'il se passe :
    1 - Appel ouverture fichier 1 ==> OK
    2 - Appel ouverture fichier 2 ==> OK (enfin, pas d'erreur visible)
    3 - Appelle lecture fichier 2 ==> Cela me ramène la ligne présente dans le fichier 1 !


    @Hédhili Jaïdane :
    Après recompilation de ma routine + mon programme, je n'ai plus le même soucis, je tombe maintenant en Abend 4087 - J'essaie de voir de quoi il peut s'agir (en tout cas, dans ma routine je vois que cela plante au moment où il lit le fichier)

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Petite précision :

    En poussant un peu mes tests, je me rends compte que si j'appelle ma routine de la façon suivante :
    ouverture / lecture / fermeture du fichier 1
    ouverture / lecture / fermeture du fichier 2
    cela fonctionne.

    Elle plante à partir du moment où l'on veut gérer les deux fichiers en même temps, le problème c'est que c'est ce que je cherche à faire puisqu'il faut que je fasse une synchro entre mes deux fichiers

  12. #12
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Je n'ai plus de souvenirs de l'assembleur. A la limite, et c'est la solution la plus idiote, fais toi une 2è subroutine pour le 2è fichier si tu ne trouves pas de solution autrement.

Discussions similaires

  1. Réponses: 14
    Dernier message: 13/03/2006, 18h49
  2. ouvrir un type de fichier particulier...
    Par jojoboloss dans le forum Access
    Réponses: 4
    Dernier message: 08/02/2006, 15h52
  3. [Delphi] Type de fichier DBISAM
    Par Henkyl dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/04/2004, 17h14
  4. Réponses: 10
    Dernier message: 18/11/2003, 18h01
  5. Bloquer le téléchargement de certains types de fichiers
    Par Nikos dans le forum Développement
    Réponses: 4
    Dernier message: 23/12/2002, 20h54

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