MainframeSupports
tip uge 18/2006:

Et af mine allerførste tip omhandlede ISPF værktøjet ISRDDN, som jeg håber er en integreret del af din værktøjskasse i dag. ISRDDN viser som bekendt alle DD-navne med tilhørende dataset allokeringer for din TSO session. Hvor vil det dog være skønt at have et lignende værktøj til rådighed i batch. Det kan faktisk også lade sig gøre bare i ret begrænset omfang. Det er nemlig ganske let at få adgang fra et batch program til alle DD-navnene tilknyttet det step, som eksekverer batch programmet.

Følgende eksempel skrevet i COBOL viser hvordan du får adgang til DD-navnene. De af jer, som hellere vil benytte PL/1, C eller REXX må selv lave den tilsvarende kode. Jeg vil starte med de erklæringer, der skal til i data division:

working storage section.
01 localEoTiot pic s9(9) binary.
01 areaAddress pic s9(9) binary.
01 filler redefines areaAddress.
  02 areaPointer pointer.
01 areaLength pic s9(4) binary.
01 filler redefines areaLength.
  02 areaChar pic x(2).

linkage section.
01 psa.
  02 filler pic x(536).
  02 tcbpointer pointer.
01 tcb.
  02 filler pic x(12).
  02 tiotPointer pointer.
01 tiot.
  02 jobname pic x(8).
01 tioe.
  02 tioelngh pic x(1).
  02 tioestta pic x(1).
  02 filler1 pic x(2).
  02 ddname pic x(8).
  02 jfcbtoken pic x(3).
01 eoTiot pic s9(9) binary.

Alle variablene erklæret i working storage er udelukkende hjælpevariable. De interessante oplysninger findes i linkage. PSA-arealet starter i adresse 0 og indeholder pointere til hvadsomhelst. Den interessante pointer er adressen på TCB arealet. I TCB arealet er der en pointer til TIOT (Task Input Output Table), som indeholder alle DD-navnene for det aktuelt eksekverende step. Arealet TIOE beskriver hvert enkelt DD-navn. Følgende stump kode udskriver samtlige DD-navne i TIOT:

move 0 to areaAddress
set address of psa to areaPointer
set address of tcb to tcbPointer in psa
set address of tiot to tiotPointer
set areaPointer to tiotPointer
add 24 to areaAddress
set address of eoTiot to areaPointer
move eoTiot to localEoTiot
perform until localEoTiot = 0
  set address of tioe to areaPointer
  display ddName in tioe
  move tioelngh to areaChar(2:1)
  add areaLength to areaAddress
  set address of eoTiot to areaPointer
  move eoTiot to localEoTiot
end-perform

TIOT er speciel, fordi de enkelte entries er af variabel længde. Det giver den lidt knudrede pointer gymnastik. Hvis en TIOT entry repræsenterer et konkateneret dataset, så er DD-navnet blankt (så vidt jeg husker). Feltet JFCBTOKEN er en nøgle til informationer om det, der er allokeret til DD-navnet. Desværre kan man kun oversætte JFCBTOKEN til en storage adresse ved at anvende assembler.

Hvad kan man så bruge ovenstående til. Jeg synes, at anvendelsesmulighederne er mange. At kigge i TIOT er eksmpelvis langt mere elegant end den metode, jeg anvender tilbage i uge 27/2001. Da TIOT er til stede direkte i storage er den langt hurtigere at slå op i i forhold til at eksekvere en OPEN FILE. Ved først at kigge efter i TIOT kan man undgå at udføre en OPEN FILE, der vil fejle, hvis DD-navnet ikke er til stede. i PL/1 kan man jo åbne filer med variabelt DD-navn, så her kan scanning af TIOT give mange nye spændende anvendelsesmuligheder.

Forrige danske tip        Last tip in english        Tip oversigten