DFSORT

DFSORT : Appareillage simple avec JOINKEYS

Depuis un mois je bouffe des analyses dans tous les sens pour comparer des données applicatives qui sont en déphasage avec celles transmises par des référentiels du SI. Pour appareiller 2 fichiers, un programme cobol c’est très bien, mais quand la réponse est attendue 2 heures auparavant, et bien c’est pas gagné avec les changements de copybook, recompilation, gestion de versions…

DFSORT permet, depuis les PTFs UK51706 et UK51707 de novembre 2009, de faire des appareillages simples très efficaces, facilement maintenables et très performants. Je trouve que c’est une solution idéale pour créer de petites moulinettes de derrière les fagots, qui en 2 temps 3 mouvements vous rendront beau et désirable par n’importe quelle Maîtrise d’ouvrage soucieuse d’avoir son analyse dans l’heure!

Une petite explication avec exemple vous fera le plus grand bien :

Soit le fichier F1 provenant du SI avec un identifiant garantie sur 22 positions débutant en colonne 15 et F2 le déchargement d’une table applicative avec l’identifiant garantie sur 22 positions débutant en colonne 2. La clé d’appareillage est l’identifiant garantie. On veut enrichir le fichier F1 avec une donnée du fichier F2 qui se trouve en colonne 35 sur 2 positions (l’état de la garantie par exemple).

//STEPJOIN EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//F1       DD DSN=MON.FICHIER.UNLOAD,DISP=SHR
//F2       DD DSN=MON.FICHIER.SI,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSIN    DD *
  JOINKEYS FILE=F1,FIELDS=(15,22,A),SORTED
  JOINKEYS FILE=F2,FIELDS=(2,22,A),SORTED
  REFORMAT FIELDS=(F1:1,70,F2:35,2)
/*

Cet appareillage est l’équivalent d’un INNER JOIN en SQL. Si vous souhaitez obtenir l’équivalent d’un LEFT, d’un RIGHT ou d’un FULL OUTER JOIN, il existe une fonction JOIN qui permet de les réaliser :

JOIN UNPAIRED    <---FULL JOIN UNPAIRED,F1 <---LEFT JOIN UNPAIRED,F2 <---RIGHT

Si vos fichiers sont triés selon la clé d’appareillage, SORTED permet d’indiquer à DFSORT ne pas retrier les fichiers (gain de perf) et NOSEQCK l’empêche de vérifier que vous ne mentez pas.

Plus d’info, d’explication, d’exemple et de détail sur la doc officielle IBM : SORTUGPG – User Guide for DFSORT PTFs UK51706 and UK51707 by Frank Yaeger [Attention accès via FTP, un proxy d'entreprise peut interdire l'accès à ce lien].

DFSORT : Meilleures compréhension et maintenabilité grâce aux symboles

Coder un step de tri par DFSORT ou ICETOOL, c’est pas bien compliqué. L’accumulation de plusieurs steps dans différents jobs avec réutilisation du même jeu de donnée partiel ou complet, c’est beaucoup moins rigolo… surtout s’il faut les faire évoluer dans le cadre d’un changement de format de données en entrée.

C’est la qu’interviennent les “symboles” qui nous permettent de coder cette forme classique peu explicite,

SORT FIELDS=(3,3,CH,A,6,32,CH,A)

En quelque chose de plus sexy, compréhensible et de haute maintenabilité :

SORT FIELDS=(CODE,A,LIBELLE,A)

Les symboles CODE et LIBELLE doivent être déclarés dans une carte SYMNAMES (symbols names) de la manière suivante :

//SYMNAMES DD *
  CODE,3,3,CH
  LIBELLE,6,32,CH
/*

La taille limite d’un symbole est de 50 caractères alphanumériques, le tiret (-) et l’underscore (_) sont acceptés. Code_Situation_Juridique est un symbole valide.

Les symboles sont sensibles à la casse, Code_Situation_Juridique est différent de Code_situation_juridique.

Je suis sûr que vous voyez maintenant tout le potentiel de ces symboles et que vous n’hésiterez pas à les utiliser.

Source : IBM Redbooks | Batch modernization on z/OS

DFSORT : Paramètres à l’installation

J’ai eu récemment besoin de savoir si DFSORT était installé avec le paramètre VLSCMP à YES, cela permet dans le cas d’enregistrements variables (VB) d’empêcher DFSORT de planter si le test de comparaison (INCLUDE, OMIT) se trouve plus “loin” que la longueur de l’enregistrement courant.

En effet, dans ce cas précis, VLSCMP indique à DFSORT qu’il doit remplacer temporairement par des zéros binaires (X’00′) les digits manquants.

Bref, pour connaître les paramètres par défaut DFSORT installés sur votre site, il suffit de soumettre le JCL suivant et de visualiser le résultat au niveau de SHOWDEF :

//ICETOOL EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//TOOLIN DD *
    DEFAULTS LIST(SHOWDEF)
//SHOWDEF DD SYSOUT=*

N’oubliez pas la carte JOB.

DFSORT : Distribution d’enregistrements

Vous avez un gros fichier à découper en 3 pour faire un traitement en parallèle des 3 fichiers résultants, mais vous ne connaissez pas la volumétrie du gros fichier pour déterminer le nombre d’enregistrements à mettre dans chacun des 3 fichiers de sortie.

Comment faire ?

DFSORT propose les options SPLIT, SPLITBY et SPLIT1R qui permettent de distribuer les enregistrements comme suit :

  • SPLIT : Le premier enregistrement est écrit dans le premier fichier de sortie, le second enregistrement dans le second fichier de sortie et ainsi de suite jusqu’à ce que tous les fichiers de sortie comportent un enregistrement. Ensuite la distibution recommence au premier fichier de sortie,
  • SPLITBY permet la même chose que SPLIT mais au lieu de distribuer enregistrement par enregistrement, vous pouvez lui indiquer le nombre d’enregistrement qui doivent être distribué à chaque fois,
  • SPLIT1R permet de distribuer un nombre déterminé d’enregistrement dans chaque fichier de sortie et continue à distribuer les enregistrements restants dans le dernier fichier de sortie sans revenir au premier.

Supposons que l’on ait le fichier :

01
02
03
04
05
06
07
08
09
10

Si :

OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLIT

On obtient :
SORTOF01

01
04
07
10

SORTOF02

02
05
08

SORTOF03

03
06
09

Si :

OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLITBY=3

On obtient :
SORTOF01

01
02
03
10

SORTOF02

04
05
06

SORTOF03

07
08
09

Si :

OPTION COPY
OUTFIL FNAMES=(SORTOF01,SORTOF02,SORTOF03),SPLIT1R=2

On obtient :
SORTOF01

01
02

SORTOF02

03
04

SORTOF03

05
06
07
08
09
10

Pratique ?

DFSORT : Remplacement de caractère

L’article précédent m’a inspiré cet article qui est le premier d’une série de billet que j’espère longue, régulière et intéressante de trucs et astuces qui font gagner du temps.

Let’s go…

Comment remplacer dans un fichier tous les low-values par des espaces ?

Il suffit d’utiliser ALTSEQ CODE

Voici un exemple pour changer tous les low-values (X’00′) par des espaces (X’40′) dans un fichier FB avec un LRECL=120.

  ALTSEQ CODE=(0040)
  OUTREC BUILD=(1,120,TRAN=ALTSEQ)

Vous l’aurez compris, si vous souhaitez remplacer tous les $ (X’5B’) par des ; (X’5E’) il faudra coder ainsi :

  ALTSEQ CODE=(5B5E)
  OUTREC BUILD=(1,120,TRAN=ALTSEQ)

Notez qu’avec OUTREC, INREC et OUTFIL il est préconisé d’utiliser BUILD à la place de FIELDS (ce dernier étant réservé à SORT et MERGE).