免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 12549 | 回复: 24
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-12 11:42 |只看该作者 |正序浏览
整理了一个能对SUBFILE中的列出的数据进行自动累加的技巧,本人自觉得非常实用,特地拿出来和大家分享!
DSPF代码:

  1. A                                      DSPSIZ(24 80 *DS3)               
  2. A                                      CA03(99)                        
  3. A*-------------------------------------------------------------------  
  4. A          R SUBDAT                    SFL                               *SUBFILE
  5. A            SUBOPT         1A  B  3  3CHECK(ER)               *选项字段         
  6. A            SUBAMT         7Y 2B  3  9EDTWRD('     .  ')      *数值字段         
  7. A*-------------------------------------------------------------------  
  8. A          R SUBCTL                    SFLCTL(SUBDAT)           *SUB CONTROL         
  9. A                                      OVERLAY                          
  10. A  65                                  SFLDSP                           
  11. A  75                                  SFLDSPCTL                        
  12. A  30                                  SFLINZ                           
  13. A  50                                  SFLCLR                           
  14. A  40                                  SFLEND(*MORE)                    
  15. A                                      SFLSIZ(0099)                     
  16. A                                      SFLPAG(0012)                     
  17. A            DSPRCD         4S 0H      SFLRCDNBR(CURSOR)      *显示当前光标行数的字段         
  18. A            RELRCD         5S 0H                                              *用于控制光标行数的字段
  19. A                                  2  2'Opt.   Amount  '               
  20. A                                      DSPATR(HI)                       
  21. A                                      DSPATR(UL)                       
  22. A*-------------------------------------------------------------------  
  23. A          R TOTFMT                                                     
  24. A                                      OVERLAY                          
  25. A                                 18  1'Total:'                        
  26. A            TOTAMT         8Y 2O 18  8EDTCDE(3)                   *显示累加结果
复制代码


RPGLE代码:

  1. FCNDDBG    CF   E             WORKSTN SFILE(SUBDAT:RRN)               
  2. C*-------------------------------------------------------------------  
  3. C**   MAIN ROUTINE                                                     
  4. C*-------------------------------------------------------------------  
  5. C                   DOW       *IN99='0'                                 
  6. C*WRITE DATA TO SUBDAT                                    *往SUBFILE里赋值                 
  7. C     1             DO        20            X                 2 0      
  8. C                   EVAL      SUBAMT=X * 10                             
  9. C                   EVAL      RRN=RRN + 1                              
  10. C                   WRITE     SUBDAT                                    
  11. C                   CLEAR                   SUBDAT                     
  12. C                   ENDDO                                               
  13. C*DISPLAY SUBCTL                                                *显示SUBFILE和累加结果         
  14. C     LOOP_TAG      TAG                                                
  15. C                   WRITE     TOTFMT                                    
  16. C                   SETON                                        657540
  17. C                   EXFMT     SUBCTL                                    
  18. C                   SETOFF                                       657540
  19. C*CALCULATE TOTAL AMOUNT                                                
  20. C                   IF        *IN99='0'                                 
  21. C                   READC     SUBDAT                                 10   *读取SUBFILE的变化
  22. C                   IF        *IN10='0'                                 
  23. C                   IF        RRN=20                                    
  24. C                   EVAL      RRN=1                                    
  25. C                   ELSE                                                
  26. C                   EVAL      RRN=RRN + 1                              
  27. C                   EVAL      DSPRCD=RRN                                *操作后光标置于后一项
  28. C                   EVAL      RELRCD=RRN                                
  29. C*SELECT AMOUNT                                                         *累加操作
  30. C                   EVAL      RRN=0                                    
  31. C                   SETOFF                                       11     
  32. C                   DOW       *IN11='0'                                 
  33. C                   EVAL      RRN=RRN + 1                              
  34. C     RRN           CHAIN     SUBDAT                             11     
  35. C                   IF        *IN11='0' AND SUBOPT='Y'                  
  36. C                   EVAL      TOTAMT=TOTAMT + SUBAMT                    
  37. C                   ENDIF                                               
  38. C                   ENDDO                                               
  39. C                                                                       
  40. C                   ENDIF                                               
  41. C                   ENDIF                                               
  42. C                   GOTO      LOOP_TAG                                 
  43. C                   ENDIF                                               
  44. C                                                                       
  45. C                   ENDDO                                               
  46. C                   SETON                                        LR     
  47. C*-------------------------------------------------------------------   
  48. C**   INITIALIZE                                                        
  49. C*-------------------------------------------------------------------   
  50. C     *INZSR        BEGSR                                               *初始化子程序
  51. C                   SETON                                        50     
  52. C                   WRITE     SUBCTL                                    
  53. C                   SETOFF                                       50     
  54. C                                                                       
  55. C                   Z-ADD     *ZEROS        RRN               4 0      
  56. C                   MOVEL     *BLANKS       TOTAMT                     
  57. C                   Z-ADD     1             DSPRCD                     
  58. C                   Z-ADD     1             RELRCD                     
  59. C                                                                       
  60. C                   ENDSR                                               
复制代码


图例:

Picture1.jpg (11.27 KB, 下载次数: 139)

Picture1.jpg

论坛徽章:
0
25 [报告]
发表于 2011-02-25 16:22 |只看该作者
算法有误  总值应该是 780

论坛徽章:
0
24 [报告]
发表于 2011-01-26 09:43 |只看该作者
{:3_200:}学习

论坛徽章:
0
23 [报告]
发表于 2010-12-10 16:26 |只看该作者
谢谢楼主提供的源代码。有两个小的问题:1只能加不能减。2最后一行的数初始时加不上。现加以小改,以示参考 ...
leonfun 发表于 2005-07-28 13:04



在DSPF定义隐藏field更方便吧
重新计算时只要先减掉隐藏field的值再加上新的值就可以了

论坛徽章:
0
22 [报告]
发表于 2010-12-06 23:58 |只看该作者
total的值怎么是840?

论坛徽章:
0
21 [报告]
发表于 2010-08-24 22:28 |只看该作者
厉害。。。感谢楼主,收藏了。。

论坛徽章:
0
20 [报告]
发表于 2010-08-21 20:21 |只看该作者
good sharing~~

论坛徽章:
0
19 [报告]
发表于 2007-07-06 17:41 |只看该作者
对RPGLE程序作了一些修改,不使用goto也可以实现。

     FMOUTDSPF  CF   E             WORKSTN SFILE(SUBDAT:RRN)
     C*-
     C**   MAIN ROUTINE
     C*-
     C                   DOW       *IN99='0'
     C*WRITE DATA TO SUBDAT                                            
     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                                                       
     C                   Move      '0'           Tag               1
     C                   DoW       Tag = '0'
     C                   WRITE     TOTFMT
     C                   SETON                                        657540
     C                   EXFMT     SUBCTL
     C                   SETOFF                                       657540
     C                   If        *IN99='1'
     C                   Leave
     C                   EndIf
     C*CALCULATE TOTAL AMOUNT
     C                   IF        *IN99='0'
     C                   READC     SUBDAT                                 10SUBFILE
     C                   IF        *IN10='0'
     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
     C*SELECT AMOUNT
     C                   EVAL      RRN=0
     C                   SETOFF                                       11
     C                   Eval      Totamt=0
     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                   ENDIF
     C                   Iter
     C                   ENDIF
     C                   ENDDO
     C                   ENDDO
     C                   SETON                                        LR
     C                   Return
     C*----------------------------------------------------------
     C**   INITIALIZE
     C*----------------------------------------------------------
     C     *INZSR        BEGSR                                              
     C                   SETON                                        50
     C                   WRITE     SUBCTL
     C                   SETOFF                                       50
     C                   Z-ADD     *ZEROS        RRN               4 0
     C                   MOVEL     *BLANKS       TOTAMT
     C                   Z-ADD     1             DSPRCD
     C                   Z-ADD     1             RELRCD
     C                   ENDSR


论坛徽章:
0
18 [报告]
发表于 2005-08-06 16:21 |只看该作者

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

我把上面的两段程序都原样的在自己的系统里写了下来.可为什么编译时通不过呢?

论坛徽章:
0
17 [报告]
发表于 2005-08-06 15:00 |只看该作者

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

还是不明白,光标定位如何实现的
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP