Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > z/OS
z/OS Forum d'entraide sur z/OS et MVS (Multiple Virtual Storage), les systèmes d'exploitation des ordinateurs « mainframes » IBM : JCL, Tso, Ispf, Vsam, Racf, SMS, Cics, Ims, OPC, Ca-7, Control-M, Dialog Manager ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2011, 11h11   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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 :
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.
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 17h30   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 096
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 096
Points : 1 704
Points : 1 704
Une proposition ... à adapter ...

Code :
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 :

Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2011, 10h05   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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.
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h27   #4
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 502
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 502
Points : 687
Points : 687
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.
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h49   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 19h06   #6
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 502
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 502
Points : 687
Points : 687
Avec ICETOOL, tu peux essayer ceci:
Code :
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
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 02h13   #7
Membre chevronné
 
Avatar de Peut-êtreUneRéponse
 
Homme Guillaume VENTRE
z/OS Technical Leader
Inscription : décembre 2006
Messages : 514
Détails du profil
Informations personnelles :
Nom : Homme Guillaume VENTRE
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : z/OS Technical Leader
Secteur : High Tech - Éditeur de logiciels

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

Code :
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.

.
__________________
★★ Documentation Mainframe par Guillaume Ventre ★★
Peut-êtreUneRéponse est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/03/2011, 15h23   #8
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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.
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 17h12   #9
Membre chevronné
 
Avatar de Peut-êtreUneRéponse
 
Homme Guillaume VENTRE
z/OS Technical Leader
Inscription : décembre 2006
Messages : 514
Détails du profil
Informations personnelles :
Nom : Homme Guillaume VENTRE
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : z/OS Technical Leader
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2006
Messages : 514
Points : 617
Points : 617
Le SPLICE que j'ai indiqué devrait répondre à ton besoin.
__________________
★★ Documentation Mainframe par Guillaume Ventre ★★
Peut-êtreUneRéponse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 10h55   #10
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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.
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 11h30   #11
Membre chevronné
 
Avatar de Peut-êtreUneRéponse
 
Homme Guillaume VENTRE
z/OS Technical Leader
Inscription : décembre 2006
Messages : 514
Détails du profil
Informations personnelles :
Nom : Homme Guillaume VENTRE
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : z/OS Technical Leader
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2006
Messages : 514
Points : 617
Points : 617
Réponse détaillée ce soir.
__________________
★★ Documentation Mainframe par Guillaume Ventre ★★
Peut-êtreUneRéponse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 00h10   #12
Membre chevronné
 
Avatar de Peut-êtreUneRéponse
 
Homme Guillaume VENTRE
z/OS Technical Leader
Inscription : décembre 2006
Messages : 514
Détails du profil
Informations personnelles :
Nom : Homme Guillaume VENTRE
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : z/OS Technical Leader
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2006
Messages : 514
Points : 617
Points : 617
Explications :

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

Dans l'ordre ci-après,
Code :
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 :
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 :
  COPY FROM(FIC2) TO(TMP) USING(WRK2)
Cette fois on ajoute 'BB' en poition 80 :
Code :
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 :
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 :
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 :
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 :
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 :

Citation:
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.

Citation:
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.

.
__________________
★★ Documentation Mainframe par Guillaume Ventre ★★
Peut-êtreUneRéponse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 05h52   #13
Membre chevronné
 
Avatar de bernard59139
 
Administrateur de base de données
Inscription : octobre 2006
Messages : 502
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : octobre 2006
Messages : 502
Points : 687
Points : 687
Bonjour

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

A+
bernard59139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 10h30   #14
Invité de passage
 
Inscription : janvier 2011
Messages : 44
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 44
Points : 0
Points : 0
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
twisty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h58.


 
 
 
 
Partenaires

Hébergement Web