MainframeSupports
tip uge 22/2000:

Man kan meget forskelligt med PL/1. Blandt andet kan man læse alle mulige slags filer med samme generelle teknik. Det kan dog ikke læse de såkaldte VSAM LDS dataset, som DB2 er baseret på. Jeg har ikke prøvet det på VSAM ESDS og heller ikke på VSAM RRDS, men jeg tror det virker for dem. Ellers læser det alt muligt andet. For eksempel klarer det spanned records, som blandt andet SMF benytter sig af.

Programmet ser således ud:

/* PLI - read allmost any dataset */
readany: PROC OPTIONS(MAIN);

DCL sysprint FILE PRINT;
DCL anyfile FILE RECORD SEQUENTIAL;
DCL anyfile_data CHAR(32767) VAR;
DCL anyfile_eof CHAR(1);

ON ENDFILE(anyfile) anyfile_eof = 'Y';
anyfile_eof = 'N';
OPEN FILE(anyfile);
READ FILE(anyfile) INTO(anyfile_data);
DO WHILE(anyfile_eof = 'N');
  PUT SKIP FILE(sysprint) LIST(anyfile_data);
  READ FILE(anyfile) INTO(anyfile_data);
END;
CLOSE FILE(anyfile);

END readany;

Fidusen er dels erklæringen af filen og i høj grad at indlæse data i en CHAR varying. Hvis record-længden er over 32767 vil progammet gå ned, men jeg tror ikke engang spanned records kan være så lange. Indlæsning af LOAD-moduler er absolut intet problem, og hvis man ikke angiver et member-navn ved indlæsning fra et PDS, så vil man i stedet indlæse directory-blokkene.

I eksemplet udskriver programmet de indlæste records på SYSPRINT. Her kan det være svært at skelne de enkelte records fra hinanden lige så snart de er længere end LRECL på SYSPRINT. Her kan programmet forbedres med noget pænt formatteret print evt. i form af et hex-dump. Og så kan man jo behandle de indlæste data, hvis man ellers kender formatet for dem. En anden mulig forbedring er at sætte en grænse på, hvor mange records der skal udskrives eller behandles.

Sidste uges tip        Tip oversigten