Another Reason to Use P-Fields
January 26, 2005 Hey, Ted
Within a subfile, I am using an indicator to highlight a field if the value of that field is invalid. Is there a way, when I read a subfile record, to analyze the attributes of the field to see if the indicator was switched on or off when the subfile record was written? My problem is that the display attribute is losing its original setting.
–Alan
I don’t know of a way to determine the original setting. I have included hidden one-byte fields in a subfile to store the settings of indicators so I could reset the indicators before updating the subfile record. You have put your finger on a good reason to use p-fields instead of indicators to control display file attributes.
Here’s a display file, SFL223D, which uses indicator 71 to display a negative balance amount in reverse image.
A DSPSIZ(24 80 *DS3) A R SFL01 SFL A LINENBR01 3 0O 9 2EDTCDE(4) A NAME01 20 O +2 A BALANCE01 9 2O +2EDTCDE(J) A 71 DSPATR(RI) A R CTL01 SFLCTL(SFL01) A CA03(03) A SFLDSP A SFLDSPCTL A SFLSIZ(11) A SFLPAG(10)
Here’s a short program, SFL223R, which loads some records into the subfile and updates one of them. The first time the subfile is displayed, Don’s and Lou’s records show a balance in reverse image. When Don’s name is changed to Bubba, the reverse image attribute disappears.
H dftactgrp(*no) actgrp(*caller) H option(*srcstmt: *nodebugio) Fsfl223d cf e workstn F sfile(sfl01:rrn) D rrn s 3 0 D Load pr D Name 20 value D Balance 9p 2 value D RecNbr 3p 0 D ChangeName pr D RecNbr 3p 0 value D NewName 20 value /free Load('Bob': 200: RRN); Load('Don': -35: RRN); Load('Jim': 25.95: RRN); Load('Lew': 180: RRN); Load('Lou': -99999: RRN); Load('Sue': 500: RRN); Load('Tom': 1750: RRN); exfmt ctl01; ChangeName(2: 'Bubba'); exfmt ctl01; *inlr = *on; /end-free P Load b D pi D Name 20 value D Balance 9p 2 value D RecNbr 3p 0 /free RecNbr += 1; LineNbr01 = RecNbr; Name01 = Name; Balance01 = Balance; *in71 = (Balance01 < *zero); write sfl01; /end-free P e P ChangeName b D pi D RecNbr 3p 0 value D NewName 20 value /free chain RecNbr sfl01; if %found(); Name01 = NewName; update sfl01; endif; /end-free P e
Here’s the same display file, but the setting of the balance field is now controlled by p-field BALATTR01, which is written to the subfile record. The display attributes of the balance field are no longer dependent on the setting of an indicator.
A DSPSIZ(24 80 *DS3) A R SFL01 SFL A LINENBR01 3 0O 9 2EDTCDE(4) A NAME01 20 O +2 A BALANCE01 9 2O +2EDTCDE(J) A DSPATR(&BALATTR01) A BALATTR01 1A P A R CTL01 SFLCTL(SFL01) A CA03(03) A SFLDSP A SFLDSPCTL A SFLSIZ(11) A SFLPAG(10)
Here’s the revised RPG code. When Don’s name is changed to Bubba, the balance of -35 continues to be displayed in reverse image.
H dftactgrp(*no) actgrp(*caller) H option(*srcstmt: *nodebugio) Fsfl224d cf e workstn F sfile(sfl01:rrn) D rrn s 3 0 D Normal c x'20' D Reverse c x'21' D Load pr D Name 20 value D Balance 9p 2 value D RecNbr 3p 0 D ChangeName pr D RecNbr 3p 0 value D NewName 20 value /free Load('Bob': 200: RRN); Load('Don': -35: RRN); Load('Jim': 25.95: RRN); Load('Lew': 180: RRN); Load('Lou': -99999: RRN); Load('Sue': 500: RRN); Load('Tom': 1750: RRN); exfmt ctl01; ChangeName(2: 'Bubba'); exfmt ctl01; *inlr = *on; /end-free P Load b D pi D Name 20 value D Balance 9p 2 value D RecNbr 3p 0 /free RecNbr += 1; LineNbr01 = RecNbr; Name01 = Name; Balance01 = Balance; if (Balance01 >= *zero); BalAttr01 = Normal; else; BalAttr01 = Reverse; endif; write sfl01; /end-free P e P ChangeName b D pi D RecNbr 3p 0 value D NewName 20 value /free chain RecNbr sfl01; if %found(); Name01 = NewName; update sfl01; endif; /end-free P e
To learn more about p-fields, see the article “Anatomy of a P-Field.”
–Ted
Click here to contact Ted Holt by e-mail.