• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

[原创]SUBFILE中数值自动累加功能(RPGLE技巧一则)

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 29次 | 进入软件测试论坛讨论

领测软件测试网
整理了一个能对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                                  SFLCLR                           
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/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网