SORT page


Prenez ces exemples pour ce qu'ils sont : des exemples. Ils ne servent pas à remplacer la documentation de base.
Le site les trucs par IBM, en anglais, propose de nombreux exemples.


Avec IBM, quant on parle de tri, deux programmes sont souvent appelés : SORT et ICETOOL.
SORT est le programme de base pour trier des fichiers. ICETOOL est un programme plus complexe se basant sur SORT pour réaliser des opérations plus complexes (compter des records, imprimer des états, etc... ). Mais dans les faits, le distingue n'est pas aisé à faire. C'est avec de la pratique que l'on peut s'y retrouver


Pour sélectionner des records

Sélection des records avec "12345" en position 1.

//COP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=..
//SORTOUT DD DSN=..,DISP=..,etc
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(1,5,CH,EQ,C'12345')
/*

Pour sélectionner des records(bis)

Un truc, pas très connu, pour sélectionner une chaîne de caractères à n'importe quelle position dans une portion de record. Voyez le paramètre SS (SubString).

//COP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=..
//SORTOUT DD DSN=..,DISP=..,etc
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(1,70,SS,EQ,C'userid')
/*

Pour copier un fichier de VB en FB

C'est une des méthodes possible. Attention dans cet exemple, on prend la partie utile d'un fichier défini en VB, LRECL=80 (soit 71 caractères utiles).

//COP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=..FIC.VB
//FB1 DD DSN=..FIC.FB,..
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FNAMES=FB1,CONVERT,OUTREC=(5,76,80:X)
/*

Pour reformater les records

Ici, chaque record en sortie aura un lrecl=13 avec la structure:

Attention, OUTREC est un paramètre du SORT très complet. De nombreux paramètres sont disponibles, il est important de consulter la documentation.

//COP EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=..
//SORTOUT DD DSN=..,DISP=..,etc
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL OUTREC=(C'123',50,10,7C'*')
/*

Pour copier un fichier dans plusieurs

En ne lisant qu'une fois le fichier SORTIN, création de plusieurs fichiers en sortie, ici 2.

//COPY EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=..,DISP=SHR
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FILES=1,INCLUDE=(1,5,CH,EQ,C'13135')
OUTFIL FILES=2,STARTREC=2,STOPAFT=50
//SORTOF1 DD DSN=...,DISP=(NEW,...
//SORTOF2 DD DSN=...,DISP=(NEW,...
/*

Pour copier un fichier dans plusieurs(bis)

On commence à utiliser ICETOOL. C'est beaucoup plus pratique, surtout que les exemples se compliquent.
Dans cet exemple, le 1er rec est écrit dans le 1er fichier, le 2ème dans le 2ème, le 3ème rec dans le 1ème fichier, le 4ème dans le 2ème fic, et ainsi de suite.

//S2 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//IN DD DSN=..
//SO01 DD SYSOUT=*
//SO02 DD SYSOUT=*
//CPY1CNTL DD *
OUTFIL FNAMES=(SO01,SO02),SPLIT
//TOOLIN DD *
COPY FROM(IN) USING(CPY1)
/*

Pour compter les records d'un fichier, des exemples

J'utilise, selon les cas, SORT et/ou ICETOOL.

Avec PGM=SORT

//SORT01 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTOUT DD SYSOUT=*
//SORTIN DD DSN=..
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL TRAILER1=(5:'NBRE RECORDS:',COUNT),NODETAIL
/*

Avec ICETOOL

//COUNT EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//IN2 DD DSN=....
//TOOLIN DD *
COUNT FROM(IN2)
/*

Compter le nombre de valeurs différentes

//COUNT EXEC PGM=ICETOOL
//DFSMSG DD SYSOUT=*
//TOOLMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//IN99 DD DSN=....
//TOOLIN DD *
UNIQUE FROM(IN99) ON(1,5,CH)

On sélectionne et on compte

//COUNT EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//IN2 DD DSN=....
//TOOLIN DD *
COUNT FROM(IN2) USING(CP2)
/*
//CP2CNTL DD *
INCLUDE COND=(1,5,CH,EQ,C'12345')
/*

On compte le nombres d'occurrences

//COUNT EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//LIST99 DD SYSOUT=*
//IN99 DD DSN=....
//TOOLIN DD *
OCCUR FROM(IN99) LIST(LIST99) TITLE('Liste de contrôle') -
ON(1,5,CH) ON(VALCNT)
/*

Utilisation de noms symboliques

De base, la description des zones traitées par DFSORT et/ou ICETOOL est assez rébarbative. L'utilisation de noms symboliques permet de concentrer en en seul point la description des fichiers. IBM propose sur son site la description de tous les records de fichiers issus d'un DCOLLECT.
Attention, pour ce que j'en sais, cette facilité ne marche qu'avec DFSORT(IBM).

Sans noms symboliques

Sans commentaires, c'est du classique.

//SANS EXEC PGM=SORT
//SORTIN DD DISP=SHR,DSN=.......
//SORTOUT DD DISP=...,DSN=.......,SPACE=....
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(1,6,CH,EQ,C'A ')

Avec des noms symboliques

Ici, ajout des ddnames SYMNAME et SYMNOUT. Cet exemple fait exactement la même chose que le précédent. Comme cela, il n'y a pas beaucoup d'intérêt. Mais imaginez que vous deviez utiliser plusieurs dizaines de fois le même fichier!

//AVEC EXEC PGM=SORT
//SYMNAMES DD *
VVVVVV,1,6,CH
//SORTIN DD DISP=SHR,DSN=.......
//SORTOUT DD DISP=...,DSN=.......,SPACE=....
//SYMNOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(VVVVVV,EQ,C'A ')

En conclusion

ICETOOL permet de nombreuses opérations de comptage et/ou de report. Je n'ai fait qu'effleurer les possibilités. Sur le site d'IBM, de nombreux exemples à télécharger sont fournis. Mais la base de connaissance reste la documentation fournisseur. Si vous avez BOOKMGR, rechercher un des mots clefs (par ex: "OCCUR") et ..... TESTEZ.
Dans ma page dcolsort des exemples assez intéressants sont proposés.