MainframeSupports
tip uge 22/2008:

En gang imellem havner man i situationer, hvor man tænker ved sig selv: Her findes der vist ingen nem udvej. Og så opdager man alligevel, at der er nogen, der har tænkt over den nemme løsning og implementeret den. Sådan har jeg det med ugens tip. Jeg havde aldrig troet at denne nemme løsning var opfundet, hvis ikke en af mine kolleger havde fundet den.

Vores problemstilling var, at vi havde et COBOL program, som vi normalt eksekverer som hovedprogram, men vi brugte det som underprogram og vi kaldte det mere end een gang. Ved kald nummer to teede det sig pludselig underligt. Efter en del debugging gik det op for os, at problemet skyldtes, at COBOL working-storage overlever fra kald til kald. Den ene løsning på problemet var at erklære alle variable som local-storage i stedet. Men sjovt nok faldt min kollega over CANCEL statement'et, som rent faktisk sætter working-storage tilbage til udseendet før det første kald til programmet angivet i CANCEL. Her er et eksempel på denne effekt. Forestil dig følgende underprogram kaldet mysubpgm, hvor eyecatcher er defineret i working-storage section:

...
if eyecatcher not = 'NICELEGS'
  display 'Where was Kilroy'
  move 'NICELEGS' to eyecatcher
else
  display 'Kilroy was here'
end-if
...

Og dette hovedprogram:

...
call mysubpgm
call mysubpgm
cancel mysubpgm
call mysubpgm
...

Når du eksekverer hovedprogrammet får du følgende output:

...
Where was kilroy
Kilroy was here
Where was kilroy
...

Hvis eyecatcher havde været erklæret i local-storage section, så havde output fra eksekveringen i stedet været tre gange "Where was Kilroy". CANCEL giver dig kontrollen over working-storage i et underprogram fra det kaldende program. Vi løste vores problem med CANCEL, da det ikke krævede ændringer af det eksisterende hovedprogram og faktisk giver en mere fleksibel løsning end at bruge local-storage. CANCEL lukker i øvrigt alle filer, som det cancel'ede program har åbnet bortset fra den indirekte åbning af SYSOUT, som DISPLAY udfører ved første eksekvering.

Der er i øvrigt en masse finurligheder ved brugen af CANCEL, som du kan læse ved at følge linket på det første CANCEL i dette tip. Jeg har ikke dyrket dem allesammen. Der er en pudsig reference til dynamisk kaldte programmer, som får mig til at tro, at CANCEL kun virker for dynamisk kaldte programmer, men jeg har ikke prøvet statisk kaldte programmer, så det vil jeg opfordre dig til at prøve af, hvis du får brug for dette tip.

Forrige danske tip        Last tip in english        Tip oversigten