MainframeSupports
tip uge 44/2009:

Jeg har for mange år tilbage skrevet et tip om, hvordan man bruger linie-kommandoer i egen-udviklede EDIT-macroer. Måske har du efterfølgende forgæves søgt efter et tip om, hvordan man så får behandlet de data, der er i de linier, som linie-kommandoen markerer. Det kommer her.

Følgende EDIT-macro sammenligner data i to forskellige kolonner (parametrene FRSTCOL og LASTCOL) med bredden angivet i parameteren COLW. Hvis de to forskellige kolonner er ens, så bliver linien markeret som EXCLUDED. Efter eksekveringen af EDIT-macroen vil linier i området markeret med linie-kommandoen *, der ikke er blevet EXCLUDED, have forskellig værdi i de to kolonner. Som en lille snedighed vil EDIT-macroen gennemsøge alle linier i data, hvis der ikke er angivet nogen linie-kommando:

/* REXX */ ADDRESS ISREDIT
'MACRO (FRSTCOL LASTCOL COLW) NOPROCESS'
ADDRESS ISPEXEC "CONTROL ERRORS RETURN"
'PROCESS RANGE *'
IF RC = 0 ! RC = 4
THEN DO
  '(RGHTBND) = LRECL'
  IF ^DATATYPE(FRSTCOL, 'W')
  THEN
    FRSTCOL = 1
  IF ^DATATYPE(COLW, 'W')
  THEN
    COLW = 1
  ELSE
    IF COLW > RGHTBND
    THEN
      COLW = RGHTBND
  IF ^DATATYPE(LASTCOL, 'W')
  THEN
    LASTCOL = RGHTBND - COLW + 1
  ELSE
    IF LASTCOL > RGHTBND - COLW + 1
    THEN
      LASTCOL = RGHTBND - COLW + 1
  '(THISLINE) = LINENUM .ZFRANGE'
  '(LASTLINE) = LINENUM .ZLRANGE'
  FRSTLINE = THISLINE
  DO WHILE THISLINE <= LASTLINE
    '(NEWLINE) = LINE 'THISLINE
    IF SUBSTR(NEWLINE, FRSTCOL,COLW) == SUBSTR(NEWLINE, LASTCOL,COLW)
    THEN
      'XSTATUS 'THISLINE' = X'
    THISLINE = THISLINE + 1
  END
END
EXIT

Hvis du kalder EDIT-macroen COMPCOL, så vil kommandoen COMPCOL 1 5 2 udført på COMPCOL selv EXCLUDE de linier, der har en indrykning på seks blanke. Bemærk i øvrigt, at i stedet for at fejle, hvis parametrene ikke er udfyldt eller er forkert udfyldte, så anvender jeg i stedet default-værdier.

Den vigtige behandling af data startende med første linie i det markerede område og sluttende med den sidste linie i området sker i DO WHILE loop'et. Startlinie og slutlinie sættes ved hjælp af LINENUM .ZFRANGE og LINENUM .ZLRANGE. Hvis der ikke er angivet en linie-kommando, så vil .ZFRANGE pr. default være sat til første linie i data og .ZLRANGE til den sidste linie. Dataindholdet i hver linie udtrækkes med (rexxVarName) = LINE lineno. Herefter er det kun din fantasi, der sætter grænserne for, hvordan de udtrukne data skal behandles. I eksemplet sammenligner jeg indholdet af to kolonner og markerer resultatet ved at EXCLUDE nogen linier, mens andre ikke EXCLUDES. Afhængig af, hvad du gerne vil opnå, kan du benytte andre virkemidler. God fornøjelse.

Forrige danske tip        Last tip in english        Tip oversigten