Article tagué DFSORT

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).