MainframeSupports
tip uge 29/2000:

Det er sjældent, at jeg opdaterer mine tip efter, at jeg har udgivet dem. Hvis jeg var politiker, ville jeg gøre det hele tiden, uden at fortælle dig det. Denne gang føler jeg dog, at jeg har en rigtig god grund til at gøre det, da Johnny Mossin, en af mine trofaste læsere og en god ven, gjorde mig opmærksom på, at IDCAMS rent faktisk godt kan slette flere members i samme dataset uden at allokere og de-allokere for hvert member. Her er et eksempel på, hvordan det kan gøres:

//DELMEM   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//ONEALLOC DD DISP=SHR,DSN=MY.MEMBER.DATASET
//SYSIN    DD *
 DELETE MY.MEMBER.DATASET(MYMEMBER) FILE(ONEALLOC)
/*

Du kan gentage linien i SYSIN lige så mange gange, du har lyst til med forskellige membernavne og alligevel vil IDCAMS kun lave een allokering af datasettet, præcis som IEHPROGM gør. Resten af tippet er, som det oprindeligt så ud.

Nu er vi efterhånden kommet et godt stykke ind i år 2000 og har konstateret, at det store arbejde med at undgå år 2000 fejl har båret frugt. Mange benyttede lejligheden til at få ryddet op i deres systemer. Det giver mig godt nok lidt forsinket anledning til at skrive lidt om sletning af members.

Når man skal slette et enkelt member eller en 5-10 stykker volder det ingen problemer at benytte faciliteterne i ISPF. Men hvad nu, når man skal rydde flere hundrede eller måske flere tusind members af vejen. Lad os kigge på et par slettemetoder:

//SLETMEM  EXEC PGM=IEHPROGM
//SYSPRINT DD SYSOUT=*
//VOLUME   DD UNIT=SYSDA,VOL=SER=MYVOL1,DISP=OLD
//SYSIN    DD *
 SCRATCH DSNAME=MY.MEMBER.DATASET,VOL=SYSDA=MYVOL1,MEMBER=MYMEMBER
/*

Ovenstående step sletter member MYMEMBER i dataset MY.MEMBER.DATASET under forudsætning af, at memberet faktisk findes og især under forudsætning af, at MY.MEMBER.DATASET findes på volume MYVOL1. Den sidste forudsætning er ret irriterende, da det kræver, at man forud for eksekvering af jobbet skal finde den volume som det dataset, man ønsker at slette members i, findes på. Det er ret latterligt i betragtning af, at man stort set aldrig skal tænke på den slags, men det skal man, hvis man vil benytte det eneste IBM utility program, der kan slette members. Selve sysin-linien kan repeates så mange gange, man har members, der skal slettes og så skal man bare rette member-navnet til. En simpel sag, hvis man har en liste over de members, man skal slette, i et andet dataset eller member.

Man kan selvfølgelig også anvende IDCAMS delete-kommandoen:

//SLETMEM  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 DELETE MY.MEMBER.DATASET(MYMEMBER)
/*

Let og elegant, ikke noget med volumes. Problemet er bare, at hvis nu der skal slettes mange members i det samme dataset, så vil IDCAMS lave en allokering og en de-allokering af hele datasettet for hvert eneste member. Og det kan faktisk koste rigtig meget tid. Det problem undgår man med IEHPROGM.

Man kan selvfølgelig også lave en REXX. Og så kan man passende benytte ISPF-services til at slette med. Det ser således ud:

/* REXX */
ADDRESS ISPEXEC
"LMINIT DATAID(MYDATAID) DATASET('MY.MEMBER.DATASET') ENQ(SHRW)"
"LMOPEN DATAID("MYDATAID") OPTION(OUTPUT)"
"LMMDEL DATAID("MYDATAID") MEMBER(MYMEMBER)"
"LMCLOSE DATAID("MYDATAID")"
"LMFREE DATAID("MYDATAID")"

Denne REXX vil gøre nøjagtig det samme som de to andre eksempler. REXX'en kan så udvides på utallige snedige måder, for eksempel med datasetnavn som input og måske også navnet på et dataset, der indeholder listen over members, der skal slettes. Hvis man skal slette flere members i samme dataset, så skal man kun gentage LMMDEL servicen for hvert member, mens de øvrige services kun skal udføres een gang for hvert dataset.

Held og lykke med oprydningen, hvis den da ikke allerede er gennemført.

Sidste uges tip        Tip oversigten