先看实例,下面是 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 程序