|
>>While using EVAL for computing numbers, if the
>>result of computing gets larger than the result
>>field definition, the throws up an error. Is
>>there any way to get around this? Like say
>>truncate (as it does in Move) some EVAL(T)?? :)
No. EVAL will always behave like this, which is
probably a good thing, otherwise you are losing
precision in your calculated values and don't
know it! If you really want to lose data, you'll
have to stick with ADD/SUB/MULT/DIV.
>>If I use *PSSR, the program goes to the top of the line
>>and I loose all the work that is done till then.
You can set up calculations in your *PSSR that check for
the type of error and set a flag. When you ENDSR *DETC,
you can check the flag at the top of the detail calcs
and start processing at the appropriate place.
Here's a poor example of what I mean:
H Debug
* Sample code to demonstrate use of *PSSR directing
* traffic after an error occurs
* Global declarations
D ErrFlag S 1 Inz('N')
D ErrAction S 6 Inz('*DETC ')
D CurrRoutine S 10 Inz
* Test numbers
D Positive S 5S 0 Inz(15)
D Negative S 5S 0 Inz(-15)
D Zero S 5S 0 Inz(0)
D PI S 10S 9 Inz(3.141592654)
D Result S 3S 0 Inz(0)
* Routine names describe where we are in the program
* When an error occurs, we can steer ourselves
* back to the appropriate place in the program
D RtnAdd S 10 Inz('Add ')
D RtnSub S 10 Inz('Sub ')
D RtnMul S 10 Inz('Mul ')
D RtnDiv S 10 Inz('Div ')
D SDS
D PGNAME *PROC
D STATUS *STATUS
D TMNAME 244 253
D USRNAM 254 263
D JOBNBR 264 269 0
* Mainline. This is just simple code to demonstrate
* how we can direct traffic after an error occurs
* The *PSSR traps the error, gets control and then
* returns to this point in the program.
* *DETC Tag
* Did an error occur? If so, recover!
* For example's sake, only test/recover from an error
* in the division routine
C If ErrFlag='Y'
C Eval ErrFlag='N'
C Select
C When CurrRoutine = RtnAdd
C GoTo Add
C When CurrRoutine = RtnSub
C GoTo Sub
C When CurrRoutine = RtnMul
C GoTo Mul
C When CurrRoutine = RtnDiv
C Eval Result=0
C GoTo PastDiv
C Other
C Dump
C EndSl
C EndIf
C Add Tag
C Eval CurrRoutine=RtnAdd
C Eval Result=Zero+1
C Sub Tag
C Eval CurrRoutine=RtnSub
C Eval Result=Zero-1
C Mul Tag
C Eval CurrRoutine=RtnMul
C Eval Result=Zero*1
C Div Tag
C Eval CurrRoutine=RtnDiv
C Eval Result=PI/Zero
C PastDiv Tag
C Eval *InLR=*On
* An error has occurred
* Set the "Error is happening" flag and return to the mainline
C *PSSR BegSR
C Eval ErrFlag='Y'
C EndSR ErrAction
Buck Calabro
CommSoft, Albany, NY
mailto:mcalabro@commsoft.net
+---
| This is the Midrange System Mailing List!
| To submit a new message, send your mail to MIDRANGE-L@midrange.com.
| To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com.
| To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.