> Från: ISPF discussion list [mailto:
ISP...@LISTSERV.ND.EDU] För Pedro Vera
> Skickat: den 4 oktober 2011 19:59
> Till:
ISP...@LISTSERV.ND.EDU
> Ämne: Re: SV: Bugs in ISPF PANEL *REXX interface ?
> > I would not expect a S0c4 abend, rather an error message.
>
> An abend in an IBM module should be reported to the IBM support center. I
> doubt very many on the ISPF-L list will have knowledge of ISPF internal
> logic.
>
> Do you have a short example that can reproduce the abend? Perhaps we can
> suggest some improvements in your panel. Panel rexx works for me in my
> limited experiments.
The problem with PMR's is that it takes much time which I don't have. If this was a common disturbance I would of course do that but as I'm probably is the only one here (for the moment) that have this problem I rather try other ways to do it.
I'm getting quite often abends in the ISPF environment which mostly seems to relate to memory shortage (e g it works after exiting one or more screens).
Probably because I'm an extensive user of compiled rexx:s and ISPF services etc.
A short example is not so easy to get as the panel works a couple of times before the abend.
The scenario is (simplified):
opt = first level menu
SELECT PANEL(MENU &opt) --> menu level 1 displayed --> enter option menu level 2 --> SELECT(%MENUSEL &opt) --> SELECT PANEL(MENU &opt) --> menu level 2 displayed --> enter 'END' --> ABEND S0C4
When modules are mentioned in the abend output they varies form time to time. So I suspect some memory overlay.
The panel in question:
)ATTR DEFAULT( ) FORMAT(MIX)
/*******************************************************************************
/*
/* This is a general non-confessional panel for displaying arbitray
/* ISPF select Menus created from a file.
/*
/* It reads the menudata from dataset UM.SPF.SPAMENU and is supposed to be
/* called from a rexx program.
/* Format for the call:
/* "SELECT PANEL(MENU) OPT(MENUmenuname)"
/*
/* menuname The name of the menu which must be the same as the membername
/* in the dataset.
/*
/*
/* 2011/10/03 Thomas Berg
/*
/*******************************************************************************
£ TYPE(OUTPUT) COLOR(YELLOW) JUST(LEFT) SKIP(ON) CAPS(OFF)
§ TYPE(DATAOUT) COLOR(TURQ) SKIP(OFF) PAS(ON)
[ TYPE(DATAOUT) COLOR(BLUE) SKIP(ON)
\ TYPE(DATAOUT) COLOR(WHITE) SKIP(ON)
# TYPE(CH) /* column heading */
+ TYPE(NT) /* normal text */
% TYPE(ET) /* emphasized text */
¤ AREA(DYNAMIC) EXTEND(ON) SCROLL(ON)
_ TYPE(INPUT) CAPS(ON) JUST(LEFT)
)BODY
+ £Z
%Option ===>_ZCMD
+Menu:£Z +Appid:£Z +Sys:£Z + (Use PF-keys UP/DOWN to scroll)
#
¤AREA1 ¤
)INIT
&ZSEL = &Z
&ZHTOP = ISR00003 /* TUTORIAL TABLE OF CONTENTS */
&ZHINDEX = ISR91000 /* TUTORIAL INDEX - 1ST PAGE */
.HELP = ISR00003
&APPLID = &ZAPPLID
&SYSID = &ZSYSID
.ZVARS = '(TITLE MENUMBR APPLID SYSID)'
IF (&ZVERB = 'DOWN') &SCROLLN = '&ZSCROLLN'
ELSE IF (&ZVERB = 'UP') &SCROLLN = '-&ZSCROLLN'
ELSE &SCROLLN = 0
VGET (MENUSEQ MENUMBR) ASIS
&INOPT = &OPT
&INMNU = &MENUSEQ
IF (&OPT = &Z)
IF (&MENUMBR ^= &Z)
&X1 = TRUNC(&MENUSEQ,' ')
&X2 = .TRAIL
IF (&X1 = &X2)
&X = TRUNC(&MENUSEQ,' ')
&MENUSEQ = .TRAIL
&X1 = TRUNC(&MENUSEQ,' ')
IF (&X1 ^= &Z)
IF (&X1 ^= &MENUMBR)
&OPT = 'MENU&X1'
*REXX(*,ZSEL,OPT,SCROLLN,AREA1,AREA2,TITLE,ZCMD,MENUMBR)
If Substr(opt,1,4) == 'MENU' Then Do
menumbr = Space(Translate(Substr(opt,5),,'=():'),0)
opt = ''
zcmd = ''
End
area1 = ''
area2 = ''
Address Tso
"ALLOC F(SPAMENU) DA('UM.SPF.SPAMENU("menumbr")') SHR REUSE"
'EXECIO * DISKR SPAMENU (STEM M. FINIS'
done = 0
Do 2 While area1 = ''
Do i = 1 To m.0
If Substr(m.i,1,1) /== '*' Then Do
m = ' 'Strip(m.i)
If Pos(' TITLE=',m) > 0 Then Do
Parse Var m 'TITLE=' title ';' .
title = Strip(title)
End
Parse Var m ' O=' o . ';' .
Parse Var o o ' D=' .
Parse Var m ' D=' d ';' .
Parse Var d d ' C=' .
Parse Var m ' C=' c ';' .
If Word(Reverse(m),1) = ',' Then Do
i = i + 1
m = ' 'Strip(m.i)
If o == '' Then Parse Var m ' O=' o . ';' .
Parse Var o o ' D=' .
If d == '' Then Parse Var m ' D=' d ';' .
Parse Var d d ' C=' .
If c == '' Then Parse Var m ' C=' c ';' .
End
Else If o <> '' & d <> '' & c = '' Then Do
i = i + 1
m = ' 'Strip(m.i)
Parse Var m ' O=' o2 . ';' .
Parse Var m ' D=' d2 ';' .
Parse Var m ' C=' c ';' .
If o2 = '' & d2 = '' & c <> '' Then Nop
Else Do
i = i - 1
c = ''
End
End
d = Strip(d)
a = '§'
b = '['
If Verify(Substr(o,1,1),'§[\','M') Then Do
Parse Var o a 2 o
End
If Verify(Substr(d,1,1),'§[\','M') Then Do
Parse Var d b 2 d
End
If o /== '' & c /== '' Then Do
If d /== '' Then Do
done = done + 1
If done > scrolln Then Do
area1 = area1 !! Left(a !! Left(o,6) !! b !! d,80)
End
End
area2 = area2 !! '$'Left(o,6) Strip(c)';'
End
Else Do
If d /== '' Then Do
Parse Value Space(d) With dc do
Parse Var do do1 2 do2
If dc == 'SPACE' Then ,
area1 = area1 !! '['Left(' ',79)
Else If dc == 'LINE' Then ,
area1 = area1 !! do1 !! Left(Copies(do2,79),79)
Else If dc == 'TEXT' ! dc = 'TEXTL' Then ,
area1 = area1 !! do1 !! Left(do2,79)
Else If dc == 'TEXTC' Then ,
area1 = area1 !! do1 !! Center(do2,79)
Else If dc == 'TEXTR' Then ,
area1 = area1 !! do1 !! Right(do2,79)
End
End
End
End
scrolln = 0
End
*ENDREXX
)PROC
VPUT (MENUMBR) ASIS
VGET (MENUSEQ) ASIS
IF (.RESP = 'END')
IF (&MENUMBR ^= &Z)
&X1 = TRUNC(&MENUSEQ,' ')
IF (&X1 = &MENUMBR)
&X = TRUNC(&MENUSEQ,' ')
&MENUSEQ = .TRAIL
VPUT (MENUSEQ) ASIS
ELSE
IF (&MENUMBR ^= &Z)
&X2 = &MENUSEQ
&X1 = TRUNC(&MENUSEQ,' ')
IF (&X1 ^= &MENUMBR)
&MENUSEQ = '&MENUMBR &MENUSEQ'
VPUT (MENUSEQ) ASIS
&CSRPOS = .CSRPOS
&CURSOR = .CURSOR
*REXX(OPT,MENUMBR,CURSOR,CSRPOS,AREA1,AREA2,ZSEL,ZTRAIL)
Say 'opt =' opt
Say 'cur =' cursor
Say 'cpo =' csrpos
zsel = ''
If Substr(opt,1,4) == 'MENU' Then Do
opt = ''
End
Else Do
pas = ''
If cursor == 'AREA1' Then Do
pas = Strip(Substr(area1,csrpos,6),'T')
Say '1 >'pas'<'
x1 = Strip(Substr(pas,1,1))
If Verify(x1,'ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ0123456789') Then ,
pas = ''
End
Parse Var opt sel '.' ztrail
If Words(sel) > 1 ! ztrail = '' Then Do
ztrail = ''
Parse Var opt sel ' ' parm
End
Say '2 >'pas'<'
If pas /== '' Then Do
parm = sel parm
sel = pas
End
Say '3 >'sel'<'
If sel /== '' Then Do
zsel = '?'
p = Pos('$'sel' ',area2)
Say p" = Pos('$'"sel"' ',area2)"
If p > 0 Then Do
x1 = Strip(Substr(area2,p + 8,200))
Say x1" = Strip(Substr(area2,"p" + 8,200))"
Parse Var x1 x1 ';' .
Parse Var x1 x2 '&OPT' x3
If x3 <> '' Then Do
zsel = x2 !! parm !! x3
End
Else ,
zsel = x1
End
End
End
Say Length(zsel) '===>'zsel'<'
*ENDREXX
)END
Regards,
Thomas Berg