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

JCL - SORT Discussion :

jcl : comparaison de deux fichiers


Sujet :

JCL - SORT

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut jcl : comparaison de deux fichiers
    Bonjour,

    Je souhaite, en jcl, comparer deux fichiers, sur les 5ères positions, et mettre les données non communes, dans un troisième fichier :

    exemple de jcl :

    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
    //SUP    EXEC  PGM=IDCAMS                           
    //SYSPRINT DD  SYSOUT=*                               
    //SYSIN    DD *                                       
        DELETE   nomfic.nodup                    
    /*                                                    
    //STEPDUP EXEC PGM=ICETOOL                            
    //SYSOUT   DD SYSOUT=*                                
    //SYSPRINT DD SYSOUT=*                                
    //TOOLMSG  DD SYSOUT=*                                
    //DFSMSG  DD SYSOUT=*                                 
    //FIC1    DD DSN=nomfic1,DISP=SHR 
    //FIC2   DD DSN=nomfic2,DISP=SHR 
    //FIC3   DD DSN=nomfic.nodup,              
    //         DISP=(,CATLG,DELETE),                      
    //         LIKE=nomfic1           
    //DDIMP0   DD SYSOUT=O,RECFM=F,LRECL=80             
    //TOOLIN DD *                                         
      SELECT FROM(FIC1) TO(FIC2) ON(1,5,CH) NODUPS DISCARD(FIC3)
    /*

    Le problème est que le système copie écrase les données de nomfic2, en les remplaçant par celles de nomfic1, et fic3 est vide.

    Que faut-il mettre comme instruction, dans TOOLIN, pour avoir le résultat attendu ?

    Merci d'avance.

    Twisty.

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Une proposition ... à adapter ...

    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
    //SORT EXEC PGM=SORT
    //* JOIN
    //SYSOUT DD SYSOUT=*
    //SYSIN DD *
     JOINKEYS FILES=F1,FIELDS=(1,5,A)
     JOINKEYS FILES=F2,FIELDS=(1,5,A)
     JOIN UNPAIRED,ONLY
     SORT FIELDS=COPY
    //SORTJNF1 DD *
    AAAAA
    BBBBB
    //SORTJNF2 DD *
    AAAAA
    CCCCC
    //SORTOUT DD SYSOUT=*
    Contenu du SORTOUT :


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut sort avec des fichiers existants
    Bonjour,

    Merci pour cette réponse, mais j'ai un code ABENDED S000 U0005, avec des fichiers existants (F1=> nomfic1, disp=shr, F2=>nomfic2,disp=shr).

    En fait, le système ne reconnait pas les instructions JOINKEYS. Serait-ce un problème de version d'OS ou de jcl ?

    Twisty.

  4. #4
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Bonjour

    C'est un problème de version de logiciel de tri.

    JOINKEY date de Novembre 2009 pour DFSORT. SYNCSORT a suivi de peu.
    ==> votre logiciel de tri n'a pas été maj depuis plus d'un an.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut équivalent de joinkeys avant novembre 2009
    Dans ce cas ,avant novembre 2009, qu'elle est l'instruction qui existait avant JOINKEYS ?

    Sinon, la mise à jour du logiciel de tri ne se fera pas (économie oblige en temps de crise).

    Twisty

  6. #6
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Avec ICETOOL, tu peux essayer ceci:
    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
    //STEPDUP EXEC PGM=ICETOOL                            
    //SYSOUT   DD SYSOUT=*                                
    //SYSPRINT DD SYSOUT=*                                
    //TOOLMSG  DD SYSOUT=*                                
    //DFSMSG   DD SYSOUT=*                                 
    //FIC1     DD DSN=nomfic1,DISP=SHR 
    //         DD DSN=nomfic2,DISP=SHR 
    //FIC2   DD Dummy
    //FIC3   DD DSN=nomfic.nodup,              
    //         DISP=(,CATLG,DELETE),                      
    //         LIKE=nomfic1           
    //TOOLIN DD *                                         
      SELECT FROM(FIC1) TO(FIC2) ON(1,5,CH) NODUPS DISCARD(FIC3)
    /*
    Mais attention, ca ne détecte les doublons que sur l'ensemble des 2 fichiers

  7. #7
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    SPLICE implémenté avant JOINKEYS devrait fonctionner, dans ton cas il faudrait faire quelque chose qui ressemble à ça :

    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
    //STEPDUP EXEC PGM=ICETOOL                            
    //SYSOUT   DD SYSOUT=*                                
    //SYSPRINT DD SYSOUT=*                                
    //TOOLMSG  DD SYSOUT=*                                
    //DFSMSG   DD SYSOUT=*                                 
    //FIC1     DD DSN=nomfic1,DISP=SHR 
    //FIC2     DD DSN=nomfic2,DISP=SHR
    //TMP      DD DSN=nomfic.nodup,              
    //            DISP=(MOD,PASS),                      
    //            LIKE=nomfic1
    //OUT      DD DSN=nomfic.OUT,              
    //            DISP=(,CATLG,CATLG),                    
    //            LIKE=nomfic1           
    //TOOLIN DD *
    * ajout ID 'AA' fichier 1 en position 80
      COPY FROM(FIC1) TO(TMP) USING(WRK1)                                         
    * ajout ID 'BB' fichier 2 en position 80
      COPY FROM(FIC2) TO(TMP) USING(WRK2)   
    * Splice fic1 fic2 sur clé 5 première pos + écrasement 1/2 ID
      SPLICE FROM(TMP) TO(OUT) ON(1,5,CH) WITH(80,1) KEEPNODUPS - 
                USING(WRK3)
    /*
    //WRK1CNTL DD *
      INREC OVERLAY=(80:C'AA')
    /*
    //WRK2CNTL DD *
      INREC OVERLAY=(80:C'BB')
    /*
    //WRK3CNTL DD *
      OUTFIL FNAMES=OUT,
          OMIT=(80,2,CH,EQ,C'BA'),
          BUILD=(1,80)
    /*
    //
    Désolé s'il y a qq erreurs, ce n'est pas testé (je suis en déplacement) et c'est saisie depuis mon smartphone.

    .

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut réponse de bernard59139
    En fait, la solution de bernard59139 donne les enregistrements, en commun, et les écrit deux fois, dans le fichier de sortie. Or, je cherche à avoir les enregistrements, qui ne sont justement pas en commun, dans les deux fichiers.

    Pouvez-vous m'aider ?

    Merci d'avance.

  9. #9
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    Le SPLICE que j'ai indiqué devrait répondre à ton besoin.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut réponse pour "peutêtreuneréponse"
    Peux-tu expliquer ce que tu fais, dans cette instruction ?

    SPLICE FROM(TMP) TO(OUT) ON(1,5,CH) WITH(80,1) KEEPNODUPS -
    USING(WRK3)

    Et, qu'elles sont les longueurs des deux fichiers ?

    De plus, je ne comprends pas comment arrive-ton à des enregistrements, avec, en 80, "BA" ?

    Ce que je comprends, c'est que tu tri les deux fichiers avec (1,5,CH) et (80,1), en enlevant les doubles. Mais, si la longueur des fichiers est 80, peut-on écrire, dans le fichier, après 80 ?

    En fait, peux-tu renter dans les détails, car je suis vraiment perdu, dans ce jcl?

    Merci d'avance.

  11. #11
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    Réponse détaillée ce soir.

  12. #12
    Membre émérite Avatar de Peut-êtreUneRéponse
    Homme Profil pro
    IT Specialist - IBM Z
    Inscrit en
    Décembre 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : IT Specialist - IBM Z
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 548
    Par défaut
    Explications :

    Je suis parti du principe que tes fichiers sont avec un LRECL < 80.

    Dans l'ordre ci-après,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //TOOLIN DD *
      COPY FROM(FIC1) TO(TMP) USING(WRK1)
    on copie le fichier FIC1 en TMP en utilisant la sysin WRK1CNTL dont le but est de rajouter en position 80 un indicateur 'AA' qui nous seras utile par la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //WRK1CNTL DD *
      INREC OVERLAY=(80:C'AA')
    Même chose avec le fichier FIC2 que l'on rajoute à la suite dans TMP (disposition MOD) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      COPY FROM(FIC2) TO(TMP) USING(WRK2)
    Cette fois on ajoute 'BB' en poition 80 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //WRK2CNTL DD *
      INREC OVERLAY=(80:C'BB')
    Les étapes précédentes on permis de créer le fichier TMP contenant FIC1 avec un flag 'AA' suivi de FIC2 avec un flag 'BB'.

    Passons au SPLICE, il permet de fusionner tous les enregistrements du fichier TMP de clé identique déclarée par ON et de conserver les champs déclarés en WIDTH des enregs trouvés après le premier doublon. KEEPNODUPS conserve les enregistrements non fusionnés (= sans tuple).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      SPLICE FROM(TMP) TO(OUT) ON(1,5,CH) WITH(80,1) KEEPNODUPS - 
                USING(WRK3)
    Pour que ce soit plus clair voici un exemple (en bleu, le ON; en rouge, le WIDTH) on a le fichier TMP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ZBAA09DDVVHYUJKI523658IUUU 01234567DD89JUIKN      AA     <- pas doublon
    ZBXF01TYHGUJKINBVC1258LKJUIOGFD69555555DEFRG      AA     <- doublon 1
    ZBXF01MMMMMMMMMMMMMMMMPOIUYTRFDEZSGHJJJJ5698      BB     <- doublon 2
    ZBYC02HHHHHHHHHHHHHHHHHHHHHHHHHHDHHHHHHHHHHH      BB     <- pas doublon
    Le résultat OUT avant le USING(WRK3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ZBAA09DDVVHYUJKI523658IUUU 01234567DD89JUIKN      AA     <- pas doublon
    ZBXF01TYHGUJKINBVC1258LKJUIOGFD69555555DEFRG      BA     <- splice
    ZBYC02HHHHHHHHHHHHHHHHHHHHHHHHHHDHHHHHHHHHHH      BB     <- pas doublon
    A cette étape, les enregs flagués 'AA' correspondent aux enregistrements du fichier FIC1 sans doublon dans FIC2, les enregs flagués 'BB' correspondent à ceux du fichier FIC2 sans doublon dans FIC1 et les enregs fkagués 'BA' correspondant aux enregistrement communs à FIC1 et FIC2.

    Ce sont ces derniers que l'on supprime (OMIT) en utilisant la sysin WRK3CNTL et en veillant à reconstruire le fichier (BUILD) avec uniquement les 80 premiers caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //WRK3CNTL DD *
      OUTFIL FNAMES=OUT,
          OMIT=(80,2,CH,EQ,C'BA'),
          BUILD=(1,80)
    En ce qui concerne tes questions :

    Et, qu'elles sont les longueurs des deux fichiers ?
    Je suis parti du postulat que tes fichiers étaient au maximum de 80. A toi d'adapter à ton besoin. Ce qu'il faut c'est que FIC1 et FIC2 aient leur clé ON à la même position et qu'ils soient de même longueur, tu peux y arriver à l'aide des sysins WRK1CNTL et WRK2CNTL.

    Mais, si la longueur des fichiers est 80, peut-on écrire, dans le fichier, après 80 ?
    Oui car tu écrits dans un autre fichier TMP. Tu ne te préoccupes de rien si tu es sous SMS, sinon tu indiques le LRECL qui va bien pour TMP.

    .

  13. #13
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Bonjour

    Toutes les manipulations possibles avec le tri sont disponibles dans la doc.
    Avec toutes les explications.
    Beaucoup de doc mainframe

    A+

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Par défaut recherche de complément de réponse
    Merci pour ce détail, mais je suis obligé d'augmenter la taille du fichier temporaire, car j'ai des données, jusqu'en colonne 80. Et, dans ce cas, l'overlay du premier fichier temporaire (wrk1cntl) ne se fait pas ou est écrasé par le deuxième fichier temporaire (wrk2cntl). Donc, je n'obtiens pas le résultat souhaité.

    Pourriez-vous me communiquer les instructions à ajouter, en cas d'augmentation de la longueur du fichier temporaire ?

    Merci d'avance,

    Twisty

Discussions similaires

  1. Comparaison de deux fichiers Excel
    Par Fab_lux dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2007, 22h41
  2. comparaison de deux fichiers
    Par john123 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/03/2007, 17h38
  3. Comparaison de deux fichiers EXCEL
    Par meufeu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/10/2006, 23h56
  4. comparaison de deux fichiers textes
    Par chmaichel dans le forum Delphi
    Réponses: 1
    Dernier message: 28/07/2006, 12h35
  5. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 17h05

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