MainframeSupports
tip uge 50/2010:

Ind imellem er der medlemmer af MainframeSupport tip brugergruppen, der beder om hjælp til noget, der ikke lige er et tip om i forvejen. For nylig blev der efterlyst en metode til at indsætte en ekstra linie i en masse members under bestemte forudsætninger. Der kom heldigvis en masse gode forslag, men nemt er det ikke.

Jeg tænkte, at en kombination af nogen af de tip, jeg har skrevet måske kunne bruges, så her er mit løsningsforslag. Tippet kan kun anvendes, hvis det member dataset, der skal rettes members i, er FB 80. Der skal også være en direkte kobling mellem de linier, der skal rettes eller indsættes, og de betingelser, der afgør at en linie skal rettes eller indsættes. Med andre ord kan tippet ikke tilføje for eksempel en linie sidst i hvert member, der indeholder ordet JULETID et eller andet sted i memberet, mens det godt kan bruges til at rette JULETID til GOD JUL eller tilføje en linie med en julehilsen efter hver linie, der indeholder JULETID:

//UNLOAD   EXEC PGM=IEBPTPCH
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DISP=SHR,DSN=MY.SOURCE.PDS
//SYSUT2   DD DISP=(NEW,CATLG),SPACE=(TRK,(99,99),RLSE),
//         LRECL=81,DSN=MY.FLAT.FILE81
//SYSIN    DD *
 PUNCH TYPORG=PO
/*
//TRNSFORM EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DISP=SHR,DSN=MY.FLAT.FILE81
//SORTOUT  DD DISP=(NEW,CATLG),SPACE=(TRK,(99,99),RLSE),
//         RECFM=FB,LRECL=80,DSN=MY.FLAT.FILE
//SYSIN    DD *
 SORT FIELDS=COPY
 OUTFIL IFTHEN=(WHEN=(2,13,CH,EQ,C'MEMBER NAME  '),
                BUILD=(C'./ ADD  NAME=',15,67)),
        IFTHEN=(WHEN=(2,8,CH,EQ,C'//SYSIN ',AND,12,30,SS,EQ,C' * '),
                BUILD=(2,80,/,80X)),
        IFTHEN=(WHEN=NONE,
                BUILD=(2,80))
/*
//RELOAD   EXEC PGM=IEBUPDTE,PARM=NEW
//SYSPRINT DD SYSOUT=*
//SYSUT2   DD DISP=(NEW,CATLG),SPACE=(TRK,(99,99,99)),
//         RECFM=FB,LRECL=80,DSN=MY.TARGET.PDS
//SYSIN    DD DISP=SHR,DSN=MY.FLAT.FILE

Det første step er omtalt i uge 49/2005, mens det sidste step er beskrevet i uge 4/2006. Det midterste step udnytter ideer beskrevet i uge 13/2008. Kort sagt, så unloader det første step et member dataset til en flad fil. Det næste step omformer den flade fil fra første step til en flad fil, der kan behandles af det sidste step, og derudover foretager det selve den ønskede editering. Det sidste step foretager en reload af den editerede flade fil tilbage til et member dataset. Desværre kan det ikke være det samme dataset som det originale. Du kan eventuelt selv tilføje et step, der sletter det originale member dataset, så reload sker til det dataset, du startede med at unloade. Hvis det originale member dataset er allokeret, så kan du i stedet kopiere fra MY.TARGET.PDS til MY.SOURCE.PDS med en IEBCOPY. Vær dog opmærksom på, at enhver af ovenstående metoder til at få de ændrede data tilbage i original datasettet ødelægger eventuelle ISPF statistik data (hvem har rettet hvornår med videre) for alle kopierede members.

Selve editeringen foretages med DFSORT. Læg mærke til at kolonne 1 omhyggeligt undgås, da den indeholder et kontroltegn, mens de rigtige data står i kolonne 2-81. Den første IFTHEN omformer member navnene dannet af IEBPTPCH til det format, som IEBUPDTE forstår. Den anden IFTHEN foretager selve editeringen, som består i at indsætte en blank linie efter alle //SYSIN DD * statements. Jeg tester dog ikke for om der står DD, men regner med, at hvis der står en * omgivet af en blank på hver side i de angivne kolonner, så står der med stor sandsynlighed også DD i mellem //SYSIN og *. Den sidste IFTHEN sørger for at overføre alle andre linier uændret til output.

Til sidst skal jeg gøre opmærksom på, at ovenstående måske kan klares med IEBUPDTE alene, men problemet er, at manualen er helt vildt svær at gennemskue. Hvis du ved, hvordan ovenstående kan løses med IEBUPDTE, så er du meget velkommen til at skrive til mig eller give dit besyv med i brugergruppen.

Forrige danske tip        Last tip in english        Tip oversigten