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
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') /*
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') /*
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) /*
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'*') /*
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,... /*
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) /*
J'utilise, selon les cas, SORT et/ou ICETOOL.
//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 /*
//COUNT EXEC PGM=ICETOOL //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //SYSOUT DD SYSOUT=* //IN2 DD DSN=.... //TOOLIN DD * COUNT FROM(IN2) /*
//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)
//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') /*
//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) /*
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 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 ')
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 ')
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.