MainframeSupports
tip uge 20/2011:

I denne uge vil jeg afsløre, hvordan du kan læse data direkte fra et hvilket som helst ISPF skærmbillede. I mange år har ISPF faktisk stillet fire variable til rådighed, som gør det muligt at læse direkte fra ISPF skærmbufferen inklusive cursor positionen. De fire variable er: ZSCREENI som indeholder selve skærmbilledet som een lang tegnstreng, ZSCREENC som indeholder cursorens position i ZSCREENI, hvor 0 er den første position og så fremdeles, ZSCREEND som er antallet af linier på skærmbilledet og ZSCREENW som er bredden på skærmbilledet i antal tegn.

Med disse informationer til rådighed har jeg skruet følgende lille og meget anvendelige REXX sammen, som jeg her vil kalde for SCRNSHOT:

/* REXX */
ARG LINECNT COLCNT REUSE
ADDRESS ISPEXEC "VGET (ZSCREENI ZSCREENW ZSCREEND ZSCREENC)"
ADDRESS TSO "ALLOC FI(SCRNSHOT) DA(SCRNSHOT) MOD CATALOG",
            " SPACE(1 1) TRACKS RECFM(F B) LRECL("ZSCREENW") REUSE"
DROP SCRNSHOT.
IF DATATYPE(LINECNT, 'W') = 0
THEN
  LINECNT = 1
IF DATATYPE(COLCNT, 'W') = 0
THEN
  COLCNT = 8
STARTPOS = ZSCREENC + 1
IF REUSE = ''
THEN DO
  SCRNSHOT = STARTPOS
  ADDRESS ISPEXEC "VPUT SCRNSHOT"
END
ELSE DO
  ADDRESS ISPEXEC "VGET SCRNSHOT"
  STARTPOS = SCRNSHOT
END
DO LINENO = 1 TO LINECNT
  SCRNSHOT.LINENO = SUBSTR(ZSCREENI, STARTPOS, COLCNT)
  STARTPOS = STARTPOS + ZSCREENW
END
SCRNSHOT.0 = LINECNT
ADDRESS TSO "EXECIO * DISKW SCRNSHOT (STEM SCRNSHOT. OPEN FINIS)"
ADDRESS TSO "FREE FI(SCRNSHOT)"
ADDRESS ISPEXEC "EDIT DATASET(SCRNSHOT)"
EXIT

Hvis du første gang, du kører denne REXX, bruger kommandoen TSO SCRNSHOT, så vil du nok blive en lille smule skuffet, da den vil kopiere de første 8 tegn fra der, hvor cursoren stod, da du trykkede Enter, over i datasettet userid.SCRNSHOT og vise det i en EDIT session. Da cursoren højst sandsynligt stod i kommando-feltet lige efter T'et i SCRNSHOT, så er de første 8 tegn fra og med cursoren med stor sandsynlighed blanke. Userid.SCRNSHOT vil altså indeholde een blank linie, og det er ret kedeligt.

Hvis dit næste forsøg er TSO SCRNSHOT 10 70 og du, før du trykker Enter, placerer cursoren i øverste venstre hjørne, vil din EDIT session nu vise de første 70 tegn i de første 10 linier fra det panel, du stod på, da du trykkede Enter. Der vil lige være en blank linie øverst i data fra dit første forsøg, da SCRNSHOT appender det nyeste skærm-udsnit til de data, der allerede var i userid.SCRNSHOT. Du kan altså selv styre indholdet af userid.SCRNSHOT med EDIT sessionen. SCRNSHOT accepterer en tredie parameter, som bare skal være til stede, indholdet er ligegyldigt. Denne tredie parameter bevirker, at SCRNSHOT kopierer fra samme cursor-position som sidste gang, den blev kaldt.

Jeg håber, at REXX'en og min tilhørende forklaring vil gøre dig i stand til at lave nye smarte REXX'er, hvor du ved at stille cursoren på forskellige steder i forskellige paneler kan få spændende ting til at ske. Jeg hører gerne om dine ideer, eller endnu bedre: brug MainframeSupport brugergruppen.

Forrige danske tip        Last tip in english        Tip oversigten