MainframeSupports
tip uge 09/2004:

Nu kan du med fuld ret hævde, at det er ret overflødigt at lave sit eget program til at lave CHANGE med. Dels kan ISPF editoren gøre dette, og hvis det ikke er godt nok, så kan FILEAID/Batch eller DFSORT også hjælpe. Faktisk findes der er rigtigt gammelt program kaldet Q2SCAN, der også kan lave CHANGE af data. Alle disse værktøjer er rigtig udmærkede, men jeg havnede for et stykke tid siden i den situation, at datasettet var for stort til at kunne læses ind i ISPF editoren, de data, jeg skulle lave CHANGE af stod ikke i nogen bestemt position, hvilket straks udelukker DFSORT, FILEAID/Batch fandtes ikke på installation, og Q2SCAN kunne heller ikke løse opgaven, da det ikke var alle forekomsterne af tegnstrengen, der skulle laves CHANGE af. Ja, hvad gør man så?

Jeg faldt over et eksempel i en PL/1 manual, der viser, hvordan man laver update i et sekventielt dataset (læs CHANGE). Når først man kan det, ja så kan man jo kode lige præcis den CHANGE, man nu har brug for, og det gjorde jeg så. Før jeg viser et lille eksempel vil jeg gøre opmærksom på, at der er tale om en "update in place". Hvis programmet fejler under eksekveringen, ja så er datasettet spoleret/ødelagt. Til gengæld kan programmet lave CHANGE i stort set alle typer dataset. Og nu til eksemplet:

pl1chg: PROC OPTIONS(MAIN REENTRANT);

DCL source FILE RECORD SEQUENTIAL;
DCL source_eof CHAR(1);
DCL source_data CHAR(32767) VAR;
DCL source_pos FIXED BIN(15);
DCL target FILE RECORD SEQUENTIAL;

ON ENDFILE(source) source_eof = 'Y';

source_eof = 'N';
OPEN FILE(source) INPUT;
OPEN FILE(target) OUTPUT TITLE('SOURCE');
READ FILE(source) INTO(source_data);
DO WHILE(source_eof = 'N');
  source_pos = index(source_data, 'DSN=OLDPRE.');
  IF source_pos > 0
  THEN
    substr(source_data, source_pos, 11) = 'DSN=NEWPRE.';
  WRITE FILE(target) FROM(source_data);
  READ FILE(source) INTO(source_data);
END;
CLOSE FILE(source);
CLOSE FILE(target);

END pl1chg;

Dette eksempel laver det, der i ISPF editoren svarer til en C DSN=OLDPRE. DSN=NEWPRE. ALL. Data indlæses fra DD-navn SOURCE og finten er, at data også skrives på DD-navn SOURCE. Det sørger OPEN FILE(target) OUTPUT TITLE('SOURCE') for. Faktisk har man samme dataset åbent to gange samtidigt i programmet.

Hvis du har brug for, at den tegnstreng, du ændrer til, har en anden længde end den, du ændrer fra, så må du selv definere, hvad der skal ske med eventuelt overskydende tegn eller med tegn, der ikke længere er plads til. Jeg har ikke haft brug for forskellig længde på source-strengen i forhold til target-strengen, så jeg har ingen erfaring for, hvad der er bedst at gøre. Det afhænger sikkert af situationen.

Forrige danske tip        Last tip in english        Tip oversigten