RPG 学习 一 基本

先看实例,下面是 JM 大神 RPG 第一讲 的例程

再来从实际银行系统角度看,来认识一下实际 RPG 程序差别

http://www.jaymoseley.com/hercules/rpgtutor/rpg004.htm
VIEW       IBMUSER.SOURCE.PROGRAM(RPG00001) - 01.02                Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
****** ********************************* Top of Data **********************************
000001 //RPG00001 JOB ,'RPG00001',CLASS=A,MSGLEVEL=(1,1),REGION=512K,                  
000002 //             NOTIFY=&SYSUID                                                   
000003 //PROCLIB  JCLLIB ORDER=SYSC.PROCLIB                                            
000004 //* COMPILE LINK AND RUN RPG                                                    
000005 //RPGCLG   EXEC RPGECLG,COND.LKED=(9,LT,RPG)                                    
000006 //STEPLIB  DD DSN=SYSC.LINKLIB,DISP=SHR                                         
000007 //RPG.SYSUT3 DD UNIT=SYSDA                                                      
000008 //RPG.SYSUT2 DD UNIT=SYSDA                                                      
000009 //RPG.SYSUT1 DD UNIT=SYSDA                                                      
000010 //RPG.SYSGO DD  UNIT=SYSDA                                                      
000011 //RPG.SYSIN DD  *                                                               
000012      H                                                                          
000013      H*                                                                         
000014      H* READ ADDRESS CARDS AND PRINT ADDRESS LIST                               
000015      H*                                                                         
000016      FINCARDS IPE F  80  80            READ40                                   
000017      FOUTLIST O   F 132 132     OF    LPRINTER                                  
000018      LOUTLIST 0010106012                                                        
000019      IINCARDS AA  01                                                            
000020      I                                        1  25 NAME                        
000021      I                                       26  50 ADDR1                       
000022      I                                       51  75 ADDR2                       
000023      OOUTLIST H  201   1P                                                       
000024      O       OR        OF                                                       
000025      O                         PAGE  Z   40                                     
000026      O                                   36 'PAGE'                              
000027      O                                   23 'ADDRESS LIST'                      
000028      O                         UDATE      8 ' 0/  /  '                          
000029      O        D  1     01                                                       
000030      O                         NAME      30                                     
000031      O        D  1     01                                                       
000032      O                         ADDR1     30                                     
000033      O        D  2     01                                                       
000034      O                         ADDR2     30                                     
000035      O        T 3   01 LR                                                       
000036      O                                   24 '*** END OF LIST ***'               
000037 /*                                                                              
000038 //GO.SYSUDUMP DD SYSOUT=A                                                       
000039 //GO.INCARDS  DD *                                                              
000040 MICHELLE COOK            9561 BAYVIEW STREET      BALDWIN, MO 63022             
000041 PATTY JENNINGS           806 JACKSON STREET       VALPARAISO, IN 46383          
000042 RICHARD SMITH            279 PARKER BLVD          NASHAU, NH 03060              
000043 DUNCAN POWERS            9496 BAYVIEW STREET      BUFFALO, NY 14225             
000044 WILLIAM EUBANKS          736 FETLOCK AVENUE       FALLS VILLAGE, CT 06031       
- - -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -   41 Line(s) not Displayed 
000086 JACOB SCHAEFER           8278 LINDENWOOD AVENU    JUNEAU, AK 99801              
000087 JARED HILLFORD           846 QUAIL AVENUE         PHOENIX, AZ 85040             
000088 CLIFF PARKER             674 BRANDYWINE AVENUE    LAGO VISTA, TX 78645          
000089 JOHN SCHAEFER            7210 PARSON COURT        LA HABRA, CA 90631            
000090 /*                                                                              
000091 //GO.OUTLIST  DD SYSOUT=A                                                       
000092 //*                                                                             
****** ******************************** Bottom of Data ********************************

 輸出

 9/05/21   ADDRESS LIST         PAGE   1
     MICHELLE COOK                      
     9561 BAYVIEW STREET                
     BALDWIN, MO 63022                  
     PATTY JENNINGS                     
     806 JACKSON STREET                 
     VALPARAISO, IN 46383               
     RICHARD SMITH                      
     279 PARKER BLVD                    
     NASHAU, NH 03060                   
     DUNCAN POWERS                      
...

首先,这个例程在干啥??

这个例程 读取一堆人名地址数据,每行一组,然后,输出为三行

这例程是一个集合编译连结和运行的 JOB

在主机里我们称这些 JCL 做 JOB,就像 Linux 的 .sh script 一样
JCL 就是 Job Control Language 工作控制语言
我们可以在主机里 Submit 这些 JOB 即提交给系统去执行
主机里面有个专门处理这些 JOB 的子系统或程序叫 JES Job Entry System 工作系统
JES 有不同版本,现在大多用 版本 JES2

把 JOB 写好了 Submit 提交给 JES2 它会把 JOB 里面的工作完成
然后,把结果输出到特定地方,我们去特定地方就可以找到相关输出或错误日志等等

这一步是呼叫 RPGECLG 来编译连接执行

000005 //RPGCLG   EXEC RPGECLG,COND.LKED=(9,LT,RPG)                                    

 SYSC.PROCLIB 还有几个版本的 PROC 可以只编译不运,如下

VIEW              SYSC.PROCLIB                              Row 00067 of 00084
Command ===>                                                  Scroll ===> CSR 
           Name     Prompt       Size   Created          Changed          ID  
_________ RPGEC                    12  1980/11/12  1980/11/12 18:18:00  JAY03 
_________ RPGECL                   22  1980/11/04  1980/11/12 18:18:00  JAY03 
_________ RPGECLG                  24  1980/11/12  1980/11/12 18:18:00  JAY03 
_________ RPGELG                   12  1980/11/12  1980/11/12 18:18:00  JAY03 
_________ SBPASCAL                 15  1980/11/10  1980/11/12 18:18:00  JAY03 

这一步 SYSIN 是 定义 RPG 程序源代码,这个例程把源化码直接写在 JOB,实际工作时不这样做的

000011 //RPG.SYSIN DD  *                                                              
000012      H                                                                         
000013      H*                                                                        
000014      H* READ ADDRESS CARDS AND PRINT ADDRESS LIST                              
000015      H*                                                                        
000016      FINCARDS IPE F  80  80            READ40                                  
000017      FOUTLIST O   F 132 132     OF    LPRINTER                                 
000018      LOUTLIST 0010106012                                                       
000019      IINCARDS AA  01                                                           
000020      I                                        1  25 NAME                       
000021      I                                       26  50 ADDR1                      
000022      I                                       51  75 ADDR2                      
- - -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -   12 Line(s) not Displayed
000035      O        T 3   01 LR                                                      
000036      O                                   24 '*** END OF LIST ***'              
000037 /*                                                                             

 实际工作环境会把源码独立出来,例如放在 DAD001

000011 //RPG.SYSIN DD DISP=SHR,DSN=IBMUSER.SOURCE.PROGRAM(DAD001)

这一步是 INCARDS 是定义程序的输入数据,就像 Java 读一个外部文字档一样
这个例程也是直接写在 JOB 里,实际会放在独立档里 主机 把档叫 Dataset (Data set) 数据组

000038 //GO.SYSUDUMP DD SYSOUT=A                                                      
000039 //GO.INCARDS  DD *                                                             
000040 MICHELLE COOK            9561 BAYVIEW STREET      BALDWIN, MO 63022            
000041 PATTY JENNINGS           806 JACKSON STREET       VALPARAISO, IN 46383         
000042 RICHARD SMITH            279 PARKER BLVD          NASHAU, NH 03060             
000043 DUNCAN POWERS            9496 BAYVIEW STREET      BUFFALO, NY 14225            
000044 WILLIAM EUBANKS          736 FETLOCK AVENUE       FALLS VILLAGE, CT 06031      
000045 SHIRLEY GARLAND          827 SHORE AVENUE         GREENVILLE, SC 29616         
- - -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -   41 Line(s) not Displayed
000087 JARED HILLFORD           846 QUAIL AVENUE         PHOENIX, AZ 85040            
000088 CLIFF PARKER             674 BRANDYWINE AVENUE    LAGO VISTA, TX 78645         
000089 JOHN SCHAEFER            7210 PARSON COURT        LA HABRA, CA 90631           
000090 /*                                                                             

那先把 RPG 代码和输入档独立抽出来

代码 放到 IBMUSER.SOURCE.PROGRAM(DAD001)

VIEW       IBMUSER.SOURCE.PROGRAM(DAD001) - 01.00                  Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
****** ********************************* Top of Data **********************************
000001      H                                                                          
000002      H*                                                                         
000003      H* READ ADDRESS CARDS AND PRINT ADDRESS LIST                               
000004      H*                                                                         
000005      FINCARDS IPE F  80  80            READ40                                   
000006      FOUTLIST O   F 132 132     OF    LPRINTER                                  
000007      LOUTLIST 0010106012                                                        
000008      IINCARDS AA  01                                                            
000009      I                                        1  25 NAME                        
000010      I                                       26  50 ADDR1                       
000011      I                                       51  75 ADDR2                       
000012      OOUTLIST H  201   1P                                                       
000013      O       OR        OF                                                       
000014      O                         PAGE  Z   40                                     
000015      O                                   36 'PAGE'                              
000016      O                                   23 'ADDRESS LIST'                      
000017      O                         UDATE      8 ' 0/  /  '                          
000018      O        D  1     01                                                       
000019      O                         NAME      30                                     
000020      O        D  1     01                                                       
000021      O                         ADDR1     30                                     
000022      O        D  2     01                                                       
000023      O                         ADDR2     30                                     
000024      O        T 3   01 LR                                                       
000025      O                                   24 '*** END OF LIST ***'               
****** ******************************** Bottom of Data ********************************

输入档 放到 Dataset IBMUSER.DAD.CUSTINFO

VIEW       IBMUSER.DAD.CUSTINFO                                    Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
****** ********************************* Top of Data **********************************
000001 MICHELLE COOK            9561 BAYVIEW STREET      BALDWIN, MO 63022             
000002 PATTY JENNINGS           806 JACKSON STREET       VALPARAISO, IN 46383          
000003 RICHARD SMITH            279 PARKER BLVD          NASHAU, NH 03060              
000004 DUNCAN POWERS            9496 BAYVIEW STREET      BUFFALO, NY 14225             
000005 WILLIAM EUBANKS          736 FETLOCK AVENUE       FALLS VILLAGE, CT 06031       
000006 SHIRLEY GARLAND          827 SHORE AVENUE         GREENVILLE, SC 29616          
000007 JOAN FRANKLIN            4550 BIENVILLE CIRCLE    KANSAS CITY, MO 64118         
000008 ANDREW BLUME             2942 BAYVIEW AVENUE      ROCHESTER, NY 03840           
000009 ELIZABETH BOWERS         1023 SOUTHLAND STREET    RIVERSIDE, NJ 08370           
000010 DIANE HAMMOND            3732 BENSON CIRCLE       FORT COLLINS, CO 80524        
000011 LUCY ROSS                208 ALLEN PLACE          EVERETT, WA 98204             
000012 LISA ELISON              488 WESTRIDGE STREET     SPARKS, NV 89431              
000013 MATTHEW RIGHT            6267 BRIARGLEN PLACE     CLEVELAND, OH 44104           
000014 ZELDA BARBER             442 COLISEUM STREET      ALBANY, NY 12206              
000015 BRIAN HARMON             872 GRANT BLVD           WICHITA, KS 67208             
000016 NATHAN MCKAY             1184 JUNIPER CIRCLE      HOUSTON, TX 77053             
000017 LUCY JACOBY              144 MEADOW PLACE         SPARKS, NV 89431              
000018 SCOTT PARRISH            9387 A & M CIRCLE        DES PLAINES, IL 60018         
000019 CALVIN MULL              5924 TWILIGHT COURT      SPARKS, NV 89431              
000020 CYBIL NOELKE             6782 BRIDGE CIRCLE       LAGO VISTA, TX 78645          
000021 RUTH VANACKER            6021 BAYSHORE CIRCLE     NEWPORT BEACH, CA 92663       
000022 JARED BROCKTON           761 GARRETT AVENUE       GREENVILLE, SC 29616          
000023 MATTHEW JACKSON          4691 SHERWOOD STREET     LA JOLLA, CA 92037            
000024 CALVIN POWERS            867 ALLEN STREET         SPRING, TX 77373              
000025 SUE SMITH                9848 PLUM STREET         PALM DESERT, CA 92211         
000026 ARNOLD WEAVER            701 TWILIGHT ROAD        KNOXVILLE, TN 37932           
000027 KEVIN NORTON             5343 PARSON AVENUE       JUNEAU, AK 99801              
000028 SCOTT RENFRO             5418 ATOLL ROAD          PASADENA, CA 91186            
000029 ERNIE LABROIE            2913 BRANDYWINE CIRCL    SAN ANGELO, TX 76903          
000030 SHARON JACKSON           2934 ROSA LINDA AVENU    NEW YORK, NY 10001            
000031 PETER ALEXANDER          7444 ROBINHOOD ROAD      NEW YORK, NY 10001            
000032 SHARON EUBANKS           9619 JUNIPER ROAD        SIOUX FALLS, SD 57112         
000033 SHIRLEY ERICKSON         596 COLLEGE STREET       GRAND RAPIDS, MN 55745        
000034 ANN STUART               9581 DESERT STREET       OKLAHOMA CITY, OK 73120       
000035 SUE FONTAINE             2229 WESTRIDGE STREET    SAN ANTONIO, TX 78216         
000036 KEVIN COOK               3055 ROSA LINDA STREE    DES PLAINES, IL 60018         
000037 DIANE EUBANKS            4404 SOUTHLAND BLVD      PRESCOTT, AZ 86314            
000038 BOB JEFFERSON            542 KINGS RIDGE BLVD     NEWPORT, RI 02840             
000039 CRAIG LANDERS            6276 ELLIS STREET        ANN ARBOR, MI 48107           
000040 NELSON HORTON            3066 SHERWOOD ROAD       NORWALK, CT 06854             
000041 KEITH ERICKSON           227 BAYSHORE PLACE       GREENVILLE, KY 42345          
000042 RICHARD GOODWIN          294 RIDGEWAY ROAD        OKLAHOMA CITY, OK 73120       
000043 DANIEL ROBERTSON         379 ALTAVISTA CIRCLE     EVERETT, WA 98204             
000044 JOAN AUSTIN              203 EASTHAVEN STREET     NEWPORT, RI 02840             
000045 JARED MEEHAN             555 EDMUND CIRCLE        EVERETT, WA 98204             
000046 CRAIG STONE              6791 GUADLAUPE COURT     WEST PALM BEACH, FL 33406     
000047 JACOB SCHAEFER           8278 LINDENWOOD AVENU    JUNEAU, AK 99801              
000048 JARED HILLFORD           846 QUAIL AVENUE         PHOENIX, AZ 85040             
000049 CLIFF PARKER             674 BRANDYWINE AVENUE    LAGO VISTA, TX 78645          
000050 JOHN SCHAEFER            7210 PARSON COURT        LA HABRA, CA 90631            
****** ******************************** Bottom of Data ********************************

覆制一份 RPG00001 到 JCLLIB 为 RPGBLD01

  • IBMUSER.SOURCE.PROGRAM(RPG00001)
  • IBMUSER.ISPF.JCLLIB(RPGBLD01)
VIEW       IBMUSER.ISPF.JCLLIB(RPGBLD01) - 01.09                   Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
****** ********************************* Top of Data **********************************
000001 //RPGBLD01 JOB ,'RPG BUILD',CLASS=C,MSGCLASS=S,MSGLEVEL=(1,1),                  
000002 //             REGION=4096K,TIME=1440,COND=((4,LT)),NOTIFY=&SYSUID              
000003 // !!! PLS DOUBLE CHECK AND REMARK THIS LINE TO SUBMIT                          
000004 //PROCLIB  JCLLIB ORDER=SYSC.PROCLIB                                            
000005 //* COMPILE LINK AND RUN RPG                                                    
000006 //RPGCLG   EXEC RPGECLG,COND.LKED=(9,LT,RPG)                                    
000007 //STEPLIB  DD DSN=SYSC.LINKLIB,DISP=SHR                                         
000008 //RPG.SYSPRINT  DD SYSOUT=*                                                     
000009 //RPG.SYSPUNCH  DD SYSOUT=*                                                     
000010 //LKED.SYSPRINT DD SYSOUT=*                                                     
000011 //RPG.SYSUT3 DD UNIT=SYSDA                                                      
000012 //RPG.SYSUT2 DD UNIT=SYSDA                                                      
000013 //RPG.SYSUT1 DD UNIT=SYSDA                                                      
000014 //RPG.SYSGO  DD UNIT=SYSDA                                                      
000015 //RPG.SYSIN  DD DISP=SHR,DSN=IBMUSER.SOURCE.PROGRAM(DAD001)                     
000016 //GO.SYSUDUMP DD SYSOUT=*                                                       
000017 //GO.INCARDS  DD DISP=SHR,DSN=IBMUSER.DAD.CUSTINFO                              
000018 //GO.OUTLIST  DD SYSOUT=*                                                       
000019 //*                                                                             
****** ******************************** Bottom of Data ********************************

这样如果要编译其他 RPG 程序,只要改 SYSIN,INCARDS 和 OUTLIST 就可以

用时也修改了用的 CLASS,MSGCLASS
这个就像流水线,JES2 有不同的 CLASS 流水线
例如,某些流水线可以优先序高一点

可以在 SDSF 用 JC 查看

   Display  Filter  View  Print  Options  Help                                
 -----------------------------------------------------------------------------
 SDSF JOB CLASS DISPLAY ALL CLASSES                     LINE 1-38 (38)        
 COMMAND INPUT ===>                                            SCROLL ===> CSR
 PREFIX=**  DEST=(ALL)  OWNER=**  SYSNAME=                                    
 NP   CLASS    Status   Mode Wait-Cnt Xeq-Cnt  Hold-Cnt ODisp         QHld Hol
      A        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      B        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      C        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      D        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      E        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      F        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      G        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      H        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      I        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      J        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      K        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      L        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      M        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      N        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      O        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      P        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      Q        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      R        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      S        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      STC                                   31          (PURGE,HOLD)          
      T        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      TSU                                    1          (PURGE,HOLD)          
      U        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      V        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      W        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      X        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      Y        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      Z        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      0        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      1        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      2        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      3        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      4        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      5        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      6        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      7        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      8        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 
      9        NOTHELD  JES                             (HOLD,HOLD)   NO   NO 

最后,来看看 RPG 长甚么样的

这里把 JM 大神的 例程 1 提取并改名为 DAD001
在主机里档名一般最大 8 位 SSMNNNNN

SS 通常用来代表这个程属于那个业务系统
例如: DA 存款系统 (Deposit),LN 按揭抵押系统 (Loans),TD 定期系统 (Time Deposit),IM 汇入系统 (Import),EX 汇出系统 (Export),FX 外汇系统 (Foreign Exchange) 等等

M 通常代表 Mode 模式
例如: M 每月才运行的程序,D 每日,Y 年,H 半年,W 周 等等

JOB 和 Dataset 名字也会采用相似命名方式

NNNNN 程序编号,001,00001,这样,一般只用代号

RPG 程序语言是非常接近汇编语言的

程序结构像写规范文档一样,例如下面 (Column 6 的字来标示)

  • H Header 档头规范
  • F File 档案规范
  • I Input 输入档格式规范
  • O Output 输出档格式规范

还有重点的

  • C Code 代码规范 (这个例程没用到代码,将来其他笔记再聊)
VIEW       IBMUSER.SOURCE.PROGRAM(DAD001) - 01.00                  Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
****** ********************************* Top of Data **********************************
000001      H                                                                          
000002      H*                                                                         
000003      H* READ ADDRESS CARDS AND PRINT ADDRESS LIST                               
000004      H*                                                                         
000005      FINCARDS IPE F  80  80            READ40                                   
000006      FOUTLIST O   F 132 132     OF    LPRINTER                                  
000007      LOUTLIST 0010106012                                                        
000008      IINCARDS AA  01                                                            
000009      I                                        1  25 NAME                        
000010      I                                       26  50 ADDR1                       
000011      I                                       51  75 ADDR2                       
000012      OOUTLIST H  201   1P                                                       
000013      O       OR        OF                                                       
000014      O                         PAGE  Z   40                                     
000015      O                                   36 'PAGE'                              
000016      O                                   23 'ADDRESS LIST'                      
000017      O                         UDATE      8 ' 0/  /  '                          
000018      O        D  1     01                                                       
000019      O                         NAME      30                                     
000020      O        D  1     01                                                       
000021      O                         ADDR1     30                                     
000022      O        D  2     01                                                       
000023      O                         ADDR2     30                                     
000024      O        T 3   01 LR                                                       
000025      O                                   24 '*** END OF LIST ***'               

只要把规范填写好,编译后,程序就会按既定运行方式处理资料

这就是古老的 RPG 程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值