领测软件测试网
整理了一个能对SUBFILE中的列出的数据进行自动累加的技巧,本人自觉得非常实用,特地拿出来和大家分享! :em02:
DSPF代码:
[code:1:9b11fde208]
A DSPSIZ(24 80 *DS3)
A CA03(99)
A*-------------------------------------------------------------------
A R SUBDAT SFL *SUBFILE
A SUBOPT 1A B 3 3CHECK(ER) *选项字段
A SUBAMT 7Y 2B 3 9EDTWRD(' . ') *数值字段
A*-------------------------------------------------------------------
A R SUBCTL SFLCTL(SUBDAT) *SUB CONTROL
A OVERLAY
A 65 SFLDSP
A 75 SFLDSPCTL
A 30 SFLINZ
A 50 SFLC
LR
A 40 SFLEND(*MORE)
A SFLSIZ(0099)
A SFLPAG(0012)
A DSPRCD 4S 0H SFLRCDNBR(CURSOR) *显示当前光标行数的字段
A RELRCD 5S 0H *用于控制光标行数的字段
A 2 2'Opt. Amount '
A DSPATR(HI)
A DSPATR(UL)
A*-------------------------------------------------------------------
A R TOTFMT
A OVERLAY
A 18 1'Total:'
A TOTAMT 8Y 2O 18 8EDTCDE(3) *显示累加结果
[/code:1:9b11fde208]
RPGLE代码:
[code:1:9b11fde208]
FCNDDBG CF E WORKSTN SFILE(SUBDAT:RRN)
C*-------------------------------------------------------------------
C** MAIN ROUTINE
C*-------------------------------------------------------------------
C DOW *IN99='0'
C*WRITE DATA TO SUBDAT *往SUBFILE里赋值
C 1 DO 20 X 2 0
C EVAL SUBAMT=X * 10
C EVAL RRN=RRN + 1
C WRITE SUBDAT
C CLEAR SUBDAT
C ENDDO
C*DISPLAY SUBCTL *显示SUBFILE和累加结果
C LOOP_TAG TAG
C WRITE TOTFMT
C SETON 657540
C EXFMT SUBCTL
C SETOFF 657540
C*CALCULATE TOTAL AMOUNT
C IF *IN99='0'
C READC SUBDAT 10 *读取SUBFILE的变化
C IF *IN10='0'
C IF RRN=20
C EVAL RRN=1
C ELSE
C EVAL RRN=RRN + 1
C EVAL DSPRCD=RRN *操作后光标置于后一项
C EVAL RELRCD=RRN
C*SELECT AMOUNT *累加操作
C EVAL RRN=0
C SETOFF 11
C DOW *IN11='0'
C EVAL RRN=RRN + 1
C RRN CHAIN SUBDAT 11
C IF *IN11='0' AND SUBOPT='Y'
C EVAL TOTAMT=TOTAMT + SUBAMT
C ENDIF
C ENDDO
C
C ENDIF
C ENDIF
C GOTO LOOP_TAG
C ENDIF
C
C ENDDO
C SETON LR
C*-------------------------------------------------------------------
C** INITIALIZE
C*-------------------------------------------------------------------
C *INZSR BEGSR *初始化子程序
C SETON 50
C WRITE SUBCTL
C SETOFF 50
C
C Z-ADD *ZEROS RRN 4 0
C MOVEL *BLANKS TOTAMT
C Z-ADD 1 DSPRCD
C Z-ADD 1 RELRCD
C
C ENDSR
[/code:1:9b11fde208]
图例:
|
tom9030 回复于:2004-11-12 12:40:17
| 在哪呢?
| bobofish29 回复于:2004-11-12 12:57:31
| 操作实现的关键在:
1.DSPF中的KEYWORD
[code:1:583a3e6cb9]A SUBOPT 1A B 3 3CHECK(ER)[/code:1:583a3e6cb9]
CHECK(ER):当字段最后一个位置键入字符结束后,记录就由设置送出,类似于按下回车键(ENTER)
2.RPGLE中的READC
READC:读取SUBFILE中修改过的记录
| xuguopeng 回复于:2004-11-12 13:08:49
| 以后发这种原创最好能把代码加上注释或说明 让初学者都能看懂 我想会更好 加精~ 期待更多的原创出来
| bobofish29 回复于:2004-11-12 13:44:39
| 呵呵....我已经加了注释了!有问题随时答复!
| michael9406 回复于:2004-11-12 21:30:01
| 注释很清楚。看来楼主用的是中文系统了。。。
| bobofish29 回复于:2004-11-12 22:17:00
| :mrgreen: 呵呵...我们公司用的是全英文的系统,那些注释是我发贴时加上去的,方便大家了解!
| wildfish 回复于:2004-11-13 08:56:10
| :)不错,我们以前做这种录入的比较少,大多都是程序手动加
| just400 回复于:2004-11-15 09:55:11
| up!
| thursday 回复于:2004-11-19 14:26:06
| 受用
| bobofish29 回复于:2004-11-19 17:49:39
| 大家平时在用RPG时有什么好的方法都拿出来分享一下!
| leonfun 回复于:2005-07-28 13:04:39
| 谢谢楼主提供的源代码。有两个小的问题:1只能加不能减。2最后一行的数初始时加不上。现加以小改,以示参考。
FVTEST02 CF E WORKSTN SFILE(SUBDAT:RRN)
C*----------------------------------------------------------------
C** MAIN ROUTINE
C*----------------------------------------------------------------***
C DOW *IN99='0'
C*WRITE DATA TO SUBDAT *SUBFILE
C 1 DO 20 X 2 0
C EVAL SUBAMT=X * 10
C EVAL RRN=RRN + 1
C WRITE SUBDAT
C CLEAR SUBDAT
C ENDDO
* D A T E N S T R U K T U R E N *
*------------------------------------------------------------------*
C*DISPLAY SUBCTL
C LOOP_TAG TAG
C WRITE TOTFMT
C SETON 657540
C EXFMT SUBCTL
C SETOFF 657540
C*CALCULATE TOTAL AMOUNT
C IF *IN99='0'
C READC SUBDAT 10
C IF *IN10='0'
[color=darkblue:5e9849323e] 定位光标位置----------------------------------------------
C IF RRN=20
C EVAL RRN=1
C EVAL DSPRCD=RRN
C EVAL RELRCD=RRN
C ELSE
C EVAL RRN=RRN + 1
C EVAL DSPRCD=RRN
C EVAL RELRCD=RRN
C ENDIF
------------------------------------------------[/color:5e9849323e]
C*SELECT AMOUNT
C EVAL RRN=0
C SETOFF 11
[color=darkblue:5e9849323e] 初始化TOTAMT值---------------------
C eval totamt=0
-------------------------------------------------------------[/color:5e9849323e]
C DOW *IN11='0'
C EVAL RRN=RRN + 1
C RRN CHAIN SUBDAT 11
C IF *IN11='0' AND SUBOPT='Y'
C EVAL TOTAMT=TOTAMT + SUBAMT
C ENDIF
C ENDDO
C
C ENDIF
C GOTO LOOP_TAG
C ENDIF
C
C ENDDO
C SETON LR
C** INITIALIZE
C*-------------------------------------------------------------------
C *INZSR BEGSR
C SETON 50
C WRITE SUBCTL
C SETOFF 50
C
C Z-ADD *ZEROS RRN 4 0
C MOVEL *BLANKS TOTAMT
C Z-ADD 1 DSPRCD
C Z-ADD 1 RELRCD
C
C ENDSR
C
C
浪人浪语,竟请海涵。
| roden 回复于:2005-07-28 13:19:33
| 创意不错,不过竟然有GOTO,不评价。
| YZG 回复于:2005-07-28 14:04:35
| 既然用了CHECK(ER),只需要操作当前的光标所在的行就行了
循环累加就没有必要了.
| zzw3206 回复于:2005-08-05 19:39:23
| 不错!!!!!!!!!!!
| riancy1106 回复于:2005-08-05 21:58:00
| ding!
| 快乐狗 回复于:2005-08-06 15:00:49
| 还是不明白,光标定位如何实现的
| pachenjun 回复于:2005-08-06 16:21:33
| 我把上面的两段程序都原样的在自己的系统里写了下来.可为什么编译时通不过呢?
|
文章来源于领测软件测试网 https://www.ltesting.net/
|
|