MainframeSupports
tip uge 06/2004:

Hvordan finder du egentlig et dataset på mainframen. Mit gæt er, at du bruger DSLIST i ISPF også kendt som punkt 3.4. Hvis du så har haft brug for at finde datasets fra et program, så har du garanteret kodet en REXX og kaldt de ISPF services, der svarer til DSLIST funktionaliteten. Måske har dit behov bare været, at finde ud af om et dataset fandtes eller ej. I så fald har du sandsynligvis benyttet funktionen SYSDSN. Måske benytter du ind i mellem LISTCAT til noget af ovenstående.

Rent faktisk findes der en service på MVS kaldet CSI for Catalog Service Interface, som kan kaldes fra stort set hvilket som helst programmeringssprog og som kan alt det, jeg lige har nævnt. Igen må jeg tilskrive æren for denne opdagelse til Johnny Mossin. Der er sikkert mange andre end Johnny, der kender CSI, men jeg havde ikke kendt til CSI, hvis jeg ikke havde kendt Johnny. Fordelen ved CSI er, at man undgår ISPF services, og at man kan undgå REXX. Og så er der det ved CSI, at man kan fremtrylle alle de informationer, der står i MVS catalogstrukturen (det er ikke småting) og så kører CSI rasende stærkt.

Desværre er interfacet til CSI lidt kringlet, især hvis man vil hente rigtig mange forskellige informationer om datasets frem. Jeg vil her give to eksempler på kald til CSI, et fra PL/1 og et fra REXX. Begge eksempler gør nøjagtig det samme, nemlig henter oplysning om hvilken volume et dataset ligger på. Det er ret praktisk, hvis man har behov for at bestemme om datasettet er migreret eler ej, da CSI ikke udsteder nogen HSM recall. I PL/1 ser det således ud:

dataset_volume: PROC(dsname) RETURNS(CHAR(6));

DCL dsname CHAR(44) VAR;
DCL iggcsi00 EXT ENTRY OPTIONS(ASM INTER RETCODE);
DCL csi_reason CHAR(4);
DCL 1 csi_input
  , 2 csifiltk CHAR(44)
  , 2 csicatnm CHAR(44)
  , 2 csiresnm CHAR(44)
  , 2 csidtyps CHAR(16)
  , 2 csiopts
  , 3 csicldi CHAR(1)
  , 3 csiresum CHAR(1)
  , 3 csis1cat CHAR(1)
  , 3 csioptns CHAR(1)
  , 2 csinumen FIXED BIN(15)
  , 2 csifldnm CHAR(8)
  ;
DCL 1 csi_output
  , 2 csiusrln FIXED BIN(31)
  , 2 csireqln FIXED BIN(31)
  , 2 csiusdln FIXED BIN(31)
  , 2 csinumfd FIXED BIN(15)
  , 2 csicflg CHAR(1)
  , 2 csictype CHAR(1)
  , 2 csicname CHAR(44)
  , 2 csicretn CHAR(4)
  , 2 csieflg CHAR(1)
  , 2 csietype CHAR(1)
  , 2 csiename CHAR(44)
  , 2 csitotln FIXED BIN(15)
  , 2 csifill CHAR(2)
  , 2 csilenf1 FIXED BIN(15)
  , 2 csivolser CHAR(6)
  , 2 csimore CHAR(1000)
  ;

csi_reason = '';
csi_input = '';
csi_input.csifiltk = dsname;
csi_input.csinumen = 1;
csi_input.csifldnm = 'VOLSER';
csi_output = '';
csi_output.csiusrln = stg(csi_output);

CALL iggcsi00(csi_reason, csi_input, csi_output);
IF pliretv() ^= 0
THEN
  RETURN('CSIerr');
ELSE
  RETURN(csi_output.csivolser);

END dataset_volume;

Og i REXX ser det således ud:

dataset_volume:
ARG dsname

csireas = left(' ', 4)
csiinp = left(dsname, 44)!!left(' ',108)!!d2c(1,2)!!left('VOLSER',8)
csioutp = d2c(1024,4)!!left(' ',1020)

ADDRESS LINKPGM 'IGGCSI00 csireas csiinp csioutp'
IF RC = 0
THEN
  volser = substr(csioutp, 117, 6)
ELSE
  volser = 'CSIerr'
RETURN volser

I PL/1 subrutinen har jeg benyttet de navne, som angives i CSI interfacet. Det har jeg fuldstændigt udeladt i REXX subrutinen, da man jo ikke kan lave strukturer i REXX. Hvis datasetnavnet ikke findes i MVS kataloget, så vil feltet med volume serial være udfyldt med blanke, og hvis det er migreret, så vil det være udfyldt med teksten MIGRAT.

CSI interfacet giver kun returkoder forskelligt fra 0, hvis der er noget helt galt. Output arealet til CSI skal være på mindst 1024 bytes, og længden skal være angivet i de første 4 bytes af output arealet. Hvis du glemmer at sætte plads af i dit program til den længde, du angiver i de første 4 bytes, så risikerer du at lave storage overskrivninger og endda at fremprovokere 0C4 abends. Det samme kan ske, hvis du glemmer at putte en fornuftig værdi i de fire første bytes.

Man kan angive wildcards i input datasetnavnet. Så begynder CSI at returnere alle de datasetnavne med tilhørende oplysninger, som matcher dit wildcard. Alle disse oplysninger returneres af CSI på en bestemt måde, som du selv må læse dig til i Appendix B i manualen Managing Catalogs. I dette appendix står der alt, hvad der er værd at vide om CSI.

Forrige danske tip        Last tip in english        Tip oversigten