MainframeSupports
tip uge 39/2005:

For nylig var der en kollega, der spurgte mig, hvordan han på hurtigste måde kunne finde ud af hvor mange records der var i et dataset. Mit første svar var at browse datasettet og udstede en FIND P'=' 1 ALL. Så vil svaret dukke op i højre hjørne af ISPF panelet efter et kortere eller længere stykke tid afhængig af datasettets eller memberets størrelse.

Desværre er denne simple løsning ikke ligefrem den hurtigste, hvis datasettet har en vis størrelse. Derudover har ISPF browse det skidt med VSAM dataset. Så jeg gik i tænkeboks og kom i tanke om, at DFSORT udskriver antallet af records, den læser fra sit input dataset. Til gengæld skal man jo fortælle DFSORT via SYSIN, om man vil sortere eller kopiere, og jeg havde ikke lige lyst til også at skulle bruge SYSIN. De fleste installationer vælger at erstatte den originale IEBGENER med DFSORTs tilsvarende program kaldet ICEGENER, så derfor skruede jeg følgende jobstep sammen:

//RECCOUNT EXEC PGM=ICEGENER
//SYSUT1   DD DISP=SHR,DSN=MY.BIG.DATASET
//SYSUT2   DD DUMMY
//SYSOUT   DD SYSOUT=*

Prøv om du på din installation kan skrive IEBGENER i stedet for ICEGENER og måske skal du også benytte //SYSPRINT i stedet for //SYSOUT. Da steppet ikke skal kopiere noget som helst kan vi jo lige så godt lade SYSUT2 være DUMMY. SYSIN behøver du ikke at angive, da ICEGENER/IEBGENER pr. default kopierer fra SYSUT1 til SYSUT2. På SYSOUT=* udskrives en masse informationer fra DFSORT, hvoraf den interessante står i en af de sidste linier med message-id ICE054I og ser således ud:

ICE054I 0 RECORDS - IN: <antal records>, OUT: <antal records>

hvor <antal records> er erstattet af det faktiske antal records i MY.BIG.DATASET eller hvad dit dataset hedder. Hvis nu MY.BIG.DATASET er et PDS (member dataset), så virker ovenstående step ikke, for du skal angive et member i parentes efter datasetnavnet. Til gengæld kan steppet tælle records i VSAM datasets. Og som det vigtigste: det går rigtig stærkt. Hvis du gerne vil kunne finde antallet af records vha. en kommando, så kan du lave en REXX til formålet, der allokerer de nævnte DD kort og derefter kalder ICEGENER med en ADDRESS TSO "ICEGENER". Til sidst skal du så finde ICE054I i dit output og skrive det ud til brugeren på en for dig hensigtsmæssig måde.

Hvis du er vidende om metoder til at tælle antal records, som er endnu kvikkere end den her beskrevne, hører jeg gerne fra dig. Det må der næsten findes, da ICEGENER bruger overflødig tid på at hælde de læste records i jordspyddet.

Forrige danske tip        Last tip in english        Tip oversigten