MainframeSupports
tip uge 34/2010:

Som opfølgning på ugens tip fra uge 34/2009 vil jeg i denne uge vise dig en EDIT-macro, jeg kalder SUMCOL og bruger rimelig ofte. Ideen er at summere de numeriske værdier i en udvalgt kolonne i data. Som slutresultat viser jeg summen med en ISPF message.

Den kolonne, EDIT-macroen skal arbejde på, angives som start-position og slut-position. Hvis tegnene mellem start-position og slut-position udgør en numerisk værdi, så lægges det til summen. Som udgangspunkt summeres alle linierne i området markeret med linie-kommandoen *. Hvis der ikke er angivet nogen * linie-kommando, så summeres alle linier i data:

/* REXX */ ADDRESS ISREDIT
'MACRO (FRSTCOL LASTCOL) NOPROCESS'
ADDRESS ISPEXEC "CONTROL ERRORS RETURN"
COLSUM = 0
'PROCESS RANGE *'
IF RC = 0 ! RC = 4
THEN DO
  '(RGHTBND) = LRECL'
  IF ^DATATYPE(FRSTCOL, 'W')
  THEN
    FRSTCOL = 1
  ELSE
    IF FRSTCOL > RGHTBND
    THEN
      FRSTCOL = RGHTBND
    ELSE
      IF FRSTCOL < 1
      THEN
        FRSTCOL = 1
  IF ^DATATYPE(LASTCOL, 'W')
  THEN
    LASTCOL = MIN(FIRSTCOL + 9, RGHTBND)
  ELSE
    IF LASTCOL > RGHTBND
    THEN
      LASTCOL = RGHTBND
    ELSE
      IF LASTCOL < FRSTCOL
      THEN
        LASTCOL = FRSTCOL
  COLW = LASTCOL - FRSTCOL + 1
  '(THISLINE) = LINENUM .ZFRANGE'
  '(LASTLINE) = LINENUM .ZLRANGE'
  FRSTLINE = THISLINE
  DO WHILE THISLINE <= LASTLINE
    '(NEWLINE) = LINE 'THISLINE
    COLVALUE = SUBSTR(NEWLINE, FRSTCOL, COLW)
    IF DATATYPE(COLVALUE, 'N')
    THEN
      COLSUM = COLSUM + COLVALUE
    THISLINE = THISLINE + 1
  END
END
CALL ISPF_MESSAGE 'SUM = 'COLSUM, 'The sum is 'COLSUM
EXIT
ISPF_MESSAGE:
  PARSE ARG ZERRSM, ZERRLM
  ZERRALRM = 'YES'
  ZERRHM = '*'
  ADDRESS ISPEXEC "SETMSG MSG(ISRZ002)"
RETURN

Ovenstående EDIT-macro gør mit arbejdsliv ulige lettere, når jeg er gået i EDIT eller VIEW på nogle data, hvor jeg lige står og skal summere nogle tal fra et udsnit af linier eller alle linierne i data. Fejlbehandlingen er måske ikke så udtryksfuld, som du kunne tænke dig, da de fleste input-fejl udløser det lakoniske svar, at summen er 0. Det kan du helt sikkert selv forbedre.

Jeg har ofte tænkt på at udvide denne macro til at kunne summere flere kolonner og til at lave delsummer efter brud i data, men det er aldrig rigtig blevet til noget. Hvis du finder på noget smart i den retning eller allerede har noget lignende, hører jeg gerne fra dig.

Forrige danske tip        Last tip in english        Tip oversigten