MainframeSupports
tip uge 27/2001:

Jeg har tit og ofte ønsket mig en måde at kunne sætte trace på mine kaldte programmer uden at de kaldende programmer skulle belemres med ekstra parametre, som så skulle føres gennem en masse kald inden mit modul blev kaldt. Og så slog det mig en dag, at det måtte kunne styres ved hjælp af tilstedeværelsen af et DD-kort. Det har jeg benyttet i REXX, så det måtte vel også kunne lade sig gøre i COBOL.

I Environment Division definerede jeg en fil med SELECT OPTIONAL MYTRACE ASSIGN TO MYTRACE FILE STATUS IS MYTRACE-STATUS. I File Section definerede jeg en FD MYTRACE RECORDING MODE F sammen med en 01 MYTRACE-FILLER PIC X(80). I Working Storage Section skulle jeg lige huske at definere 01 MYTRACE-STATUS PIC X(2) og som en ekstra finte lavede jeg en 01 MYTRACE-EXT PIC X(2) EXTERNAL. External variable i COBOL overlever fra kald til kald i hvert fald i batch.

Nu var definitionerne klar. Følgende stump kode lod jeg blive eksekveret som det allerførste i mit underprogram:

IF MYTRACE-EXT NOT = '00' AND MYTRACE-EXT NOT = '05'
  OPEN INPUT MYTRACE
  MOVE MYTRACE-STATUS TO MYTRACE-EXT
END-IF

Jeg satser nu på, at External variablen MYTRACE-EXT ikke indeholder hverken '00' eller '05' fra starten, ellers virker mit tip ikke. FILE STATUS for en korrekt udført OPEN er '00' og en, hvor DD-kortet mangler giver '05' i hvert fald, når SELECT OPTIONAL anvendes. Resultatet af min OPEN gemmer jeg nu i min external variabel. Så jeg slipper for at lave en OPEN hver gang mit modul bliver kaldt. For hvert sted i mit program, hvor jeg ønsker at foretage noget særligt, når DD-kortet er til stede, eksempelvis udskrive noget på SYSOUT, så gør jeg følgende:

IF MYTRACE-EXT = '00'
  DISPLAY 'KILROY WAS HERE'
END-IF

Her kan du efter behov selv indsætte noget mere fornuftigt end ovenstående. Når DD-kortet MYTRACE ikke er til stede i mit JCL, så sker der kun det, der normalt skal ske, men hvis jeg tilføjer et //MYTRACE DD DUMMY, så får jeg udført min ekstra kode. Simpelt, enkelt og ligetil. Og så virker det også i produktion, hvor man oftest ikke har adgang til diverse TRACE-værktøjer.

Jeg har faktisk ikke undersøgt, hvad der sker med en External variabel med en VALUE på, men mon ikke COBOL sørger for, at den kun bliver initialiseret med den angivne VALUE en eneste gang og ikke ved hvert kald. Det kan du jo selv undersøge. Jeg vil gerne høre om resultatet. Og jeg vil også gerne vide om det gør nogen forskel at anvende SELECT uden OPTIONAL.

Forrige danske tip        Last tip in english        Tip oversigten