I nogen situationer har jeg behov for at genlæse en fil fra et bestemt punkt. Det er typisk, når sammenhængende data breder sig over flere records. Hidtil har jeg løst udfordringen ved at have en intern buffer, hvor jeg gemte de indlæste records. Hvis jeg så havde brug for data, jeg allerede havde læst, så fik jeg fat i dem ved hjælp af bufferen. Problemet ved denne løsning er, at bufferen typisk har en eller anden øvre grænse for, hvor stor den kan blive. Derudover skal man selv opfinde en eller anden bufferteknik.
En af mine kolleger foreslog mig i stedet at have to filer åbne i programmet mod samme dataset. Så fungerer den ene fil på sædvanlig måde, mens den anden fil fungerer som buffer. Det synes jeg er en rigtig fiks løsning, som jeg viderebringer et eksempel på her. Input til det følgende program er en fil som eksempelvis kan se således ud:
Og her er programmet skrevet i COBOL. Jeg har kun medtaget det mest nødvendige, så du må selv tilføje manglede divisions og sections samt foretage de nødvendige indrykninger, hvis du vil prøve det af. Hvis du hellere vil bruge PL/I, så er tricket at benytte TITLE på OPEN FILE:
Det første, der falder dig i øjnene er nok, at jeg laver assign til to forskellige filer. Det er desværre nødvendigt at have to DD-navne i det tilhørende JCL for at opnå den nødvendige funktionalitet. Bemærk i øvrigt at jeg kun tester på det første tegn i input. Den vigtigste detalje i programmet er, at spole bufferfilen frem til den næste sammenhængende klump af data. Det styrer jeg ved hælp af variable someCount og otherCount. Jeg tror det kan gøres mere elegant, men jeg kunne ikke umiddelbart finde på noget smartere. Der skal sandsynligvis andre tilpasninger til afhængig af den konkrete opgave, du skal løse.
Resultatet af at afvikle programmet er følgende records på SYSOUT:
Det tilhørende jobstep til at afvikle programmet med kan se således ud:
Jeg kunne umiddelbart ikke finde en metode, hvor jeg kunne angive input ved hjælp af en //SOMEFILE DD * og en reference til OTHRFILE. Hvis du ved, hvordan man gør det, vil jeg gerne høre om det. Bemærk i øvrigt referencen til datasetnavnet på SOMEFILE på DD-kortet til OTHRFILE, så slipper du i hvert fald for at skulle huske at rette dataset-navnet to steder.