5.3.6. 多个相关数据库操作的回滚ROLBK及COMIT操作
5.3.8. 使用SDA + RPG IV 进行交互式程序设计
关于程序开发,想强调的是:业务流程先于程序——程序是给计算机看得,流程是人执行的;程序是死的,而流程则是一个相对模糊的东西。所以在写程序前,要先弄清楚自己到底要做什么,然后将自己的思想表达给计算机——这个过程就是CODING。
RPG的长处在于数据库处理,界面交互能力倒是其次。所以最开始需要了解一些关于数据库文件的相关知识(这里就只强调跟400有关的)。在下面的操作中,假设朋友已经会用STRPDM,会文件的COPY,修改。
数据文件PF:COPY一个已经有的比较快点。然后修改一下里面的数据,就是自己的。
A*假设文件名字叫BAE
A
R BAER
ß记录名字
A
AREA
3
COLHDG('AREA CODE') ßfield
A
AREANM 22 COLHDG('AREA DESC ')ßfield
*
A
K AREA
ßKey,可选
关于域定义的参考,请在程序里面输入,然后在该行按F4,再在要看得参数上按F1,就可以得到详细信息。
数据文件LF:逻辑文件的作用是按特定的关键字顺序来检索数据库里面的记录。LF中的域定义可以是任意顺序,不必跟PF中顺序的一致。更进一步,LF可以先过滤一部分的记录,减少搜索的范围。下面先看LF如何定义,具体使用程序中再说:
A
R BAER
A
PFILE(BAE) ß表示这个LF引用的是BAE文件
A
K AREA
ß搜索关键字是AREA CODE
这个是简单的,再看一个稍微复杂点的:
A
R BAER
A
PFILE(BAE)
A
K AREANM
A
S AREA
COMP(EQ '001')
上面的片断里面,关键字S表示“选择”,COMP表示比较,EQ表示等于。整句连起来就是:只选择AREA等于001的那些记录。
PS:如果一个PF每个库里面都有,如何确保被引用的就是自己希望的那个?将目标文件放在位于库列表的最上面的库里面。
DDS的创建,有些朋友用SDU(屏幕设计工具)比较快。但是如果是有类似的界面,则COPY一下比较方便。以下片断是几乎每个DDS都要的,除了REF那句可选以外。
A* 假设显示文件名字叫EX001D
A
DSPSIZ(24 80 *DS3)ß设定显示屏大小
A
REF(*LIBL/BAE
A
CHGINPDFT
A
PRINT
再来看看接下来要定义什么东西:
A
R C0
ß显示画面的名字
A
CA11(11 ' 退出 ')
A
CF08(08 ' 测试 ')
现在我们知道我们有一个显示画面叫C0(因为一个程序可能不止一个画面,这样需要定义不同的画面来处理不同的事务);而且这个画面还有3个命令键可以响应:F11,F8,ENTER(ENTER是系统默认的处理键)
再给这个画面添上几个域:
如上,
a.001和008行定义了2个显示常量,在屏幕上起提示和说明作用;
b.002行定义了一个选择域VSELEC,R表示是参考数据库里面已经有的域格式,B代表输入输出双向(双向的意思就是域里面的信息被程序修改了以后还可以反馈给画面),
5 38表示在第5行第38列,REFFLD(DICT/SELEC DICT
c.006行表示一个自己定义的域,名字叫VNAME,
6个字符长,I表示只做输入用
d.009行表示定义了一个VDDATE域,用来显示日期。010行表示显示控制:HI高亮、UL下划线。
e.008行的81是一个指示符,意思是当81号指示符是1的时候,“查询日期”才显示。
这样,显示文件就算定义完毕。
一个程序划分的粗一点,也就是2个部分:一是数据定义,一是执行代码。数据定义包括了文件引用(相当于C语言里面的头文件)、内部DS定义、普通常量等等;执行代码则包括主过程和子程序,也就是程序的主体及要调用的子函数。(详细定义方式请参见RPG400 REFERENCE)。
整个程序的执行过程如下:
定义部分(包括H/F/E/I/D等)à程序初始化(如果有INZ函数则自动执行,否则就是用户自己定义的变量初始化程序,也可以2个都执行)àMAIN循环(包括人机交互、数据处理、反馈)à退出(用户按退出命令键或者程序自动退出)。
如果用代码的表示方式来讲,就是如下的结构:
H
Y
ß头文件定义
F*----------------------------------------
FBAE
FBAE
F
BAE KRENAMEBAE2
F*请注意以上的2句:在使用不同LF检索同一个PF的时候,由于PF记录名字相同而导致一个冲突,这里就通过将记录名字重新命名为BAE2而避免这个问题。
FEX001D CF E
WORKSTN ß显示界面
I* 下面定义一个DS结构,示范用
I@PARM DS
ß结构名字叫@PARM
I
1 6 #FCDDI ß结构体内部的域
I
7 12 #TCDDI ß起止范围可以不连续
C* 下面进入代码段,包括初始化,子程序
C
*INZSR
BEGSR
ß本片断可以放在程序的任何地方
C
MOVE *OFF
INDEX 40 ß但无论放哪里都是最先执行
C
MOVE *ZERO
RESULT 40
C
ENDSR
C*请注意以上的2句,最后2个40的位置错开了一位,但是意义完全不一样。第一个表示是INDEX变量的长度是40,类型是字符型(默认的,可以省略);第二行的40表示RESULT长度是4,小数点位置在0位——这是个数字型的变量。在用F4查看的时候,会很清楚地看到区别。所以MOVE到变量的数据也不一样(*OFF是字符’
C* 主体部分,包括接受命令和处理
C* 往下就是子程序定义了,包括按钮处理在里面
C
MAIN BEGSR
C EXFMTC0 ß这句是让C0画面获得焦点成为活动画面,程序就停在这个地方,直到输入完数据按了F11/F8/ENTER中的一个。当MAIN执行完毕,程序会从上面的012行跳转到010行,继续执行,直到LR标志被置ON才退出整个程序。当再进来的时候,程序会再次停在这个地方,等待用户命令。
C* F11 = QUIT
C
*IN11 IFEQ
*ON
C SETON
LR
C ELSE
C* F8 = TEST
C
*IN08 IFEQ *ON
C VSELEC IFEQ '1'
C
MOVE 'AAAA'
VNAME
C
ENDIF
C
VSELEC IFEQ
'2'
C
MOVEL'BB'
VNAME
ß请注意MOVE和MOVEL的区别
C
ENDIF
C
ELSE
C* 如果有按键,既不是F11,也不是F8,那么就只有ENTER
C
MOVE 20040623 VDDATE ß这个域是数字型的,外面不加引号
C
EXSR SEARCH
ß执行一个搜索子程序
C
ENDIF
C
ENDIF
C
ENDSR
C*
C
SEARCH
BEGSR
C
*LOVAL SETLLBAE ß先将游标停到最低点,然后遍历整个数据库
C
READ BAE
92
C
*IN92
DOWEQ*OFF
C
MOVELAREANM LIST
C
READ BAE 92
C
ENDDO
C* 上面的片断中READ数据库,如果有记录,那么结果指示符92为OFF状态。如果没有读到记录(到文件末尾了?)就会置为ON。通过检测这个指示符状态可以完成遍历。
C* 下面再来试验一下KEY是如何工作的。
C
KBAE KLIST
ß定义一个搜索键
C
KFLD
KNAME
C*
C
MOVE ‘AAA’ KNAME
ß要查找的目标
C
*LOVAL
SETLLBAE
ß还原游标位置
C
KBAE
CHAINBAE
93 ß找到名字为AAA,93就置OFF
C
*IN93
DOWEQ*OFF
C
MOVE AREANM TMPSTR
C
KCUSHD
READECUSHD
93ß如果数据库有重复记录
就多次查找
C
ENDDO
C
ENDSR
关于KLIST的使用:KLIST中FLD的定义必须跟要检索的目标LF中的域一一对应,但可以只有部分。比如LF中定义5个KEY域,分别是1
2 3 4 5,那么KLIST中的定义可以有1,1 2,1 2 3,但不能是2 3。各个对应的域的类型、大小都必须一样。
编译过程可以排除大部分的明显错误:字符拼错、未定义的变量、重复定义。编译完会产生一个SPLF,里面包含错误列表。编译过程不排除逻辑错误。
去掉逻辑错误就是调试的任务。比如A
B两个变量,A 12CHAR, B 8CHAR。希望去掉A的高4位,那么MOVE A B, 再MOVE B A就可以。但是这中间如果不CLEAR A,那么A的内容还是没有变化的。程序大了以后逻辑比较复杂,调试有时很困难,这个时候就是需要心细加耐心。
RPG是采用一种结构化的语言,整个的结构可以采用模块化的编程方法。另外要注意的是变量的定义是即定义即用,而且都是全局的。这个将变量局部化的工作就留给程序员来完成——在其它地方不用就是咯~~~
在RPG中如果要对数据库进行读取,更新,删除,追加记录的操作,必须以相对应的方式说明对这个文件的引用。关于对数据库各种操作的组合及相应的文件引用声明,总结如下:
只从文件读取纪录
FFILENAME IF E
K DISK
只向文件里面写纪录而不读取
FFILENAME O E
DISK
读取纪录并更改和/或删除,不追加纪录
FFILENAME UF E
K DISK
读取纪录并更改和/或删除,且追加纪录
FFILENAME UF E
K
DISK
A
读取纪录和追加纪录,不更新和删除
FFILENAME IF E
K
DISK
A
需要注意的是对文件的操作必须和声明相对应,即有追加调用声明必须有WRITE, 有更新或删除声明必须有UPDAT和DELET操作。
在对文件进行操作的时候,通常会用到指示器来判断对数据库的操作是否成功的情况,关于指示器的位置及其所代表的意义,图示如下:
对文件进行更新或者删除操作的时候,需要注意的一点是更新和删除属于独占操作,同一时间只能为一个SESSION所独占,因而如果有一个SESSION锁定一条纪录,之后再有其他SESSION想以独占的方式读取这个纪录的时候,就会发生显示界面停滞60秒的情况,所以这种现象必须避免。
这种现象的避免相对来说在带有显示界面的程序中更为重要。因为中间有停顿的过程,所以如果在停顿前锁住某一条纪录,整个停顿期间其他人都不能试图以独占的方式来读取纪录。考虑到这种情况,独占的时间必须要尽可能短。对文件声明UF的时候,一般情况下在对文件纪录进行读取操作的时候,在下面的指示器前的H的位置加上N,这样文件就不是以独占的方式进行读取。
CL0N01N02N03FACTOR1+++OPCDEFACTOR2+++RESULTLENDHHILOEQCOMMENTS++++
C
SDKY
在确认需要更新的时候,可以在临更新前锁住纪录,在对需要改变的字段赋值以后,立即进行更新操作。尽可能减少其间的代码以减少独占的时间来防止出现停滞的现象。
COMIT和ROLBK主要目的是为了数据的统一性, 一般用在要同时对几个数据库进行增,删,改, 确保几个数据库都能正确写入,删除,更新数据, 在程序(CL或RPG都可以, 其他语言不清楚)中, 只有执行了COMIT命令后,数据操作才真正被执行。 只要任何一个数据库的操作出错, 可以用ROLBK命令将之前的数据回档。这样的程序, 如果因为某种原因(如被其他用户强行终止, 短电...)而终止,系统会自动ROLLBACK。
对需要进行COMIT的文件的声明:
FFILENAMEIPEAF........L..I........DEVICE+......KEXIT++ENTRY+A....U
FFILENAMEUF E K DISK
KCOMIT
数据库纪录的写入或者更新等都不变,有变动的就是根据实际的条件进行确认或者回滚。
CL0N01N02N03FACTOR1+++OPCDEFACTOR2+++RESULTLENDHHILOEQCOMMENTS++++
C
ROLBK
CL0N01N02N03FACTOR1+++OPCDEFACTOR2+++RESULTLENDHHILOEQCOMMENTS++++
C COMIT
带有COMIT的RPG程序一般通过CL程序进行调用,在调用这个程序的时候有一些针对COMIT的操作,包括:
1、创建日志和日志收集器 CRTJRN 和CRTJRNRCV
2、把PF加入日志 STRJRNPF
3、用CL 执行STRCMTCTL和 ENDCMTCTL上面具体用法去查CL REFERENCE
这样任何对该文件的修改都会记日志,当碰到COMIT 命令时确认修改,碰到ROLBK放弃更新.关于后两步的部分代码如下:
STRJRNPF FILE(FILENAME1)
JRN(JOURNAL)
STRJRNPF FILE(FILENAME2)
JRN(JOURNAL)
STRCMTCTL LCKLVL(*CHG)
CALL PGM(PGMNAME)
PARM(&PARM1 &PARM2)
ENDCMTCTL
ENDJRNPF FILE(FILENAME1)
JRN(JOURNAL)
ENDJRNPF FILE(FILENAME2)
JRN(JOURNAL)
1、PF定义:
Columns . . . : 1 71
Browse QINGZHOU/QDDSSRC
SEU==>
REFILE FMT A* .....A*.
1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
****************** End of data
****************************************
F3=Exit F5=Refresh F9=Retrieve F10=Cursor F11=Toggle F12=Cancel F16=Repeat find
F24=More keys
(C) COPYRIGHT IBM CORP. 1981, 2000. |
Columns . . . : 1 71
Browse
QINGZHOU/QDDSSRC SEU==>
INVOICE
FMT A* .....A*.
1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data
*************************************
****************** End of data ****************************************
F3=Exit F5=Refresh F9=Retrieve F10=Cursor F11=Toggle F12=Cancel F16=Repeat find
F24=More keys
|
2、SDA设计subfile:
A、使用SDA设计子文件:
Design Screens
Type choices, press Enter.
Source file . . . . . . . . QDDSSRC Name, F4 for
list
Library . . . . . .
. . . QINGZHOU Name, *LIBL, *CURLIB
Member . . . . . . . . . . subfile1 Name, F4 for
list
F3=Exit F4=Prompt F12=Cancel
|
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy 4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error 1
SFL01
(No records in file)
Bottom F3=Exit F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
|
Add New
Record
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU Source
type . . . : DSPF
Type choices, press Enter.
New record . . . . . . . . . . . . . . . SFL01
Name
Type . . . . . . . . . . . . . . . . .
. SFL
RECORD, USRDFN
SFL,
SFLMSG
WINDOW, WDWSFL
PULDWN, PDNSFL
MNUBAR
F3=Exit F5=Refresh F12=Cancel
|
Add
New Record
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type choices, press Enter.
New record . . . . . . . . . . . . . . . SFL01
Name
Type . . . . . . . . . . . . . . . . .
. SFL
RECORD, USRDFN
SFL,
SFLMSG
WINDOW, WDWSFL
PULDWN, PDNSFL
MNUBAR
Subfile control record . . . . . . . . . SFL
F3=Exit F5=Refresh F12=Cancel
|
B、子文件主体设计:
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add 2=Edit
comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record Type Related
Subfile Date
DDS Error
12 10 SFL01
SFL
20 SFL
Bottom F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
Record
SFL01 added to member SUBFILE1.
+ |
Select Database Files
Type options and names, press
Enter.
1=Display database field
list
2=Select all fields for input
(I)
3=Select all fields for output
(O)
4=Select all fields for both (B)
input and output
Option Database File Library Record
1
INVOICE
QINGZHOU
F3=Exit F4=Prompt F12=Cancel
|
Select Database Records
Database file . . . . . : INVOICE Library
. . . : QINGZHOU
Type options, press Enter.
1=Select
Option Record
1 IV_FMT
Bottom
F3=Exit F12=Cancel
|
Select Database Fields
Record . . . : IV_FMT
Type information, press Enter.
Number of fields to roll . . . . . . . . . . . . . . . . .
. 8
Name of field to search for . .
. . . . . . . . . . . . . . .
Type options, press Enter.
1=Display extended field
description
2=Select for input (I), 3=Select
for output (O), 4=Select for both (B)
Option Field
Length Type Column Heading
3 IV_CODE
3 IV_NAME
12 O 名称
3 IV_QUTITY 7,0 P 总数
3 IV_AMOUNT 15,2 P 总金额
3 IV_DESC
30 O 备注
|
1:IV_CODE 2:IV_NAME 3:IV_QUTITY
4:IV_AMOUNT 5:IV_DESC
|
&1
&2
&3
&4
1:IV_CODE 2:IV_NAME 3:IV_QUTITY
4:IV_AMOUNT 5:IV_DESC
|
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
1:IV_DESC
|
Work with Fields
Record . . . : SFL01
Type information, press Enter.
Number of fields to roll . . . .
. . . . . . . . . . . . . . 6
Type options, change values, press
Enter.
1=Select keywords 4=Delete field
Option Order Field Type Use Length Row/Col Ref Condition Overlap
10 IV_CODE
O
5 07 015 Y
20 IV_NAME O O 12 07 024 Y
30 IV_QUTITY
O
7,0 07 041 Y
40 IV_AMOUNT
O
15,2 07 056 Y
50 OPTX
I
1 07 012
Bottom Add
H
Hidden
Add
P
Program-to-system
F3=Exit F6=Sort by row/column F12=Cancel
|
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
Subfile
keywords...: SFLPAG:
12
SFLLIN:
0
|
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
1:IV_DESC
|
C、定义子文件隐藏字段:
Work with Fields
Record . . . : SFL01
Type information, press Enter.
Number of fields to roll . . . .
. . . . . . . . . . . . . . 6
Type options, change values, press
Enter.
1=Select keywords 4=Delete field
Option Order Field Type Use Length Row/Col Ref Condition Overlap
10 IV_CODE
O
5 07 015 Y
20 IV_NAME O O 12 07 024 Y
30 IV_QUTITY
O
7,0 07 041 Y
40 IV_AMOUNT
O
15,2 07 056 Y
50 OPTX
I
1 07 012
1
60 IV_DESC
H
30
Bottom Add
H
Hidden
Add
P
Program-to-system
F3=Exit F6=Sort by row/column F12=Cancel
|
Select Field Keywords
Field . . . . . : IV_DESC
Usage . . : H
Length . . . . : 30
Type choices, press Enter.
Y=Yes For Field
Type
Keying options . . . . . . . . .
Hidden, Input or Both
General keywords . . . . . . . .
All types
Database reference . . . . . . . Y Hidden, Input,
Output, Both
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Define Database Reference
Field . . . . . : IV_DESC
Usage . . : H
Length . . . . : 30
Type choices, press Enter.
Keyword
Reference field . . . . . . . . REFFLD Y
Y=Yes
Reference current DDS source . . *SRC
Y=Yes
Field (if different) . . . . .
.
IV_DESC
Name
Database file . . . . . . . . .
INVOICE
Name
Library . . . . . . . . . . . QINGZHOU Name, *LIBL, *CURLIB Record . . . . . . .
. . . . .
Name
Override existing field
definition:
New field length . .
. . . . .
+nnnn,
-nnnn, nnnn New decimal
positions . . . .
+n, -n, nn
New keyboard shift .
. . . . .
N A X W I D M
J O E G
Ignore previously
specified:
Validity check . . . . . . . . DLTCHK
Y=Yes
Editing . . . . . . . . . . . DLTEDT
Y=Yes
F3=Exit F12=Cancel
|
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
1:IV_DESC
|
Exit SDA Work Screen
Select one of the following:
1. Save work since
last Enter and exit work screen
2. Exit without
saving any work done on the work screen
3. Resume work
screen session
Selection
1
F12=Cancel
|
D、子文件控制设计:
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename 8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error
10 SFL01
SFL
12 20 SFL
Bottom
F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
Image
updated for record SFL01.
|
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
Work
screen for SFL |
*date
发票查询
*sysname
*username
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
1:IV_DESC
|
DD/DD/DD
发票查询
SSSSSSSS
5= 明细查询
UUUUUUUUUU
# &2p &3p
&4p
&5p
-- ----- ------------ ---------
--------------------
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
1:IV_DESC 2:IV_CODE 3:IV_NAME
4:IV_QUTITY 5:IV_AMOUNT 6:IV_DESC
|
DD/DD/DD
发票查询
SSSSSSSS
UUUUUUUUUU
5= 明细查询
# 发票 名称
总数
总金额
-- ----- ------------ ----------
---------------------
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666
-6,666,666,666,666.66
1:IV_DESC 2:IV_CODE 3:IV_NAME
4:IV_QUTITY 5:IV_AMOUNT 6:IV_DESC
|
E、子文件控制关键字:
Work with Display
Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU Source
type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile Date
DDS Error
10 SFL01
SFL
8 20 SFL
Bottom
F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
|
Select Subfile Control Keywords
Subfile control record . . . . . . . .
. : SFL
Type choices, press Enter.
Y=Yes
General keywords . . . . . . . . Y
Subfile display layout . . . . . Y
Subfile messages . . . . . . . .
Select record keywords . . . . . Y
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Define General Keywords
Subfile control record . . . . . . . .
. : SFL
Type choices, press Enter.
Keyword
Related subfile record . . . . .
. . SFLCTL SFL01
Name
Subfile cursor relative record .
. . SFLCSRRRN
Name
Subfile mode . . . . . . . . . .
. . SFLMODE
Name
Y=Yes
Indicators/+ Display subfile records . . . . . . SFLDSP Y
N30
Display control record . . . . .
. . SFLDSPCTL Y
N30
Initialize subfile fields . . . . . SFLINZ
Delete subfile area . . . . . . . . SFLDLT
Clear subfile records . . . . . . . SFLCLR
30
Indicate more records . . . . . . . SFLEND
N30
SFLEND parameter . . . . . . . . *MORE
SFLEND
parameter . . . . . . .
. *SCRBAR
*MORE ... Record not active . . . . . . . . . SFLRNA
More... F3=Exit F12=Cancel
|
Define Display
Layout
Subfile control record . . . . . . . .
. : SFL
Type values, press Enter.
Keyword Number
Records in subfile . . . . . . .
. . . SFLSIZ 12
Program-to-system
field . . . . . .
Records per display . . . . . . . . . SFLPAG 200
Spaces between records . . . . .
. . . SFLLIN
F3=Exit F12=Cancel
|
Select Record Keywords
Record . . . : SFL
Type choices, press Enter.
Y=Yes
General keywords . . . . . . . . Indicator keywords . . . . . . . Y
Application
help . . . . . . . .
Help keywords . . . . . . . . .
.
Output keywords . . . . . . . .
.
Input keywords . . . . . . . . .
Overlay keywords . . . . . . . .
Print keywords . . . . . . . . .
ALTNAME keyword . . . . . . . .
.
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Define Indicator Keywords
Record . . . : SFL
Type keywords and parameters, press
Enter.
Conditioned keywords: CFnn
CAnn CLEAR PAGEDOWN/ROLLUP PAGEUP/ROLLDOWN
HOME HELP HLPRTN
Unconditioned keywords: INDTXT VLDCMDKEY
SETOF CHANGE
Keyword Indicators/+ Resp Text
CA03
03 Exit
Bottom F3=Exit F12=Cancel
|
Select Record Keywords
Record . . . : SFL
Type choices, press Enter.
Y=Yes
General keywords . . . . . . . . Indicator keywords . . . . . . .
Application
help . . . . . . . .
Help keywords . . . . . . . . .
.
Output keywords . . . . . . . .
.
Input keywords . . . . . . . . .
Overlay keywords . . . . . . . . Y
Print keywords . . . . . . . . .
ALTNAME keyword . . . . . . . .
.
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Select Overlay Keywords
Record . . . : SFL
Type choices, press Enter.
Keyword
Y=Yes Indicators/+ Roll Overlay without erasing . . . . . . OVERLAY Y
Retain data on re-display . . . . . PUTRETAIN
Protect all input fields . . . .
. . PROTECT Activate OVRDTA and OVRATR . . .
. . PUTOVR
Override Data . . . . . . . . . . . OVRDTA
Override Attribute . . . . . . .
. . OVRATR
Initialize input fields . . . . . . INZINP
Reset all modified data tags . .
. . MDTOFF
MDTOFF parameter . .
. . . . . . .
*UNPR
*ALL
Erase all input fields . . . . .
. . ERASEINP
ERASEINP parameter .
. . . . . . .
*MDTON
*ALL
Erase all records below . . . . . . ERASE
F3=Exit F12=Cancel
|
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error 1
SFL01T
10 SFL01
SFL
20 SFL
Bottom
F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
Keywords updated for record SFL |
Select Additional Records for Display
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1,2,3=Select for display as
additional record
Option Record
Type Status 1
2
3
2 SFL01
SFL
3 SFL
SFL01T
RECORD In use
Bottom F3=Exit F5=Refresh F12=Cancel
|
DD/DD/DD
发票查询
SSSSSSSS
5= 明细查询
UUUUUUUUUU
# 发票
名称
总数
总金额
-- -----
------------
----------
---------------------
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66 I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
Additional record(s) selected: SFL01
SFL |
DD/DD/DD
发票查询
SSSSSSSS
5= 明细查询
UUUUUUUUUU
# 发票
名称
总数
总金额
-- -----
------------
----------
---------------------
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66 I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO
OOOOOOOOOOOO
-6,666,666
-6,666,666,666,666.66
I OOOOO OOOOOOOOOOOO -6,666,666 -6,666,666,666,666.66
'F3=@CCCC@'
Additional record(s) selected: SFL01
SFL |
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile Date
DDS Error
10 SFL01
SFL
20 SFL
30 SFL01T
RECORD
Bottom F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More
keys
Record
SFL01T added to member SUBFILE1.
|
F、设计显示记录窗体:
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error 1
DSP01W
10 SFL01
SFL
20 SFL
30 SFL01T
RECORD
Bottom
F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
Record
SFL01T added to member SUBFILE1. |
Add New Record
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type choices, press Enter.
New record . . . . . . . . . . . . . . . DSP01W
Name
Type . . . . . . . . . . . . . . . . .
. WINDOW RECORD,
USRDFN
SFL,
SFLMSG
WINDOW, WDWSFL
PULDWN,
PDNSFL
MNUBAR
F3=Exit F5=Refresh F12=Cancel
|
Select Window Keywords
Window record . . . . . . . . . . . . .
: DSP01W
Type choices, press Enter.
Y=Yes
General keywords . . . . . . . . Y
Select record keywords . . . . .
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Select General Keywords
Window record . . . . . . . . . . . . .
: DSP01W
Type choices, press Enter.
Keyword
Y=Yes Indicators/+
Window parameters . . . . . . . . . . . . WINDOW Y
Select
parameters . . . . . . . . . .
.
Y
Window borders . . . . . . . . .
. . . . . WDWBORDER
Select
parameters . . . . . . . . . .
. Remove windows . . . . . . . . .
. . . . . RMVWDW
User Restore Display . . . . . .
. . . . . USRRSTDSP
F3=Exit F12=Cancel
|
Define Window Parameters
Record . . . : DSP01W
Keyword . . : WINDOW
Referenced window . . . . . . . . . . . .
Name
- Window definition
Default start positioning . . . . . . .
Y=Yes
- Start line
Program-to-system
field . . . . . . .
Name
Actual line . . . . . . . . . . . . . 9
1-25
Start position
Program-to-system
field . . . . . . .
Name
Actual position . . . . . . . . . . . 12
1-128
Window lines . . . . . . . . . .
. . . .
10
1-25
Window position . . . . . . . . . . . . 60
1-128
Message line . . . . . . . . . .
. . . .
Y
Y=Yes
Restrict cursor to window
. . . . . . . Y
Y=Yes
F3=Exit F12=Cancel
|
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error
10 SFL01
SFL
20 SFL
30 SFL01T
RECORD
12 40 DSP01W
WINDOW
Bottom F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
|
................................................................
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:..............................................................:
Work
screen for record DSP01W: Press Help for function keys.
|
................................................................
:
'@cccccccc@'
:
:
:
:
&
:
&
:
& :
&
:
&
:
:
: '@cccccccccc@'
:
:
:
:..............................................................:
1:IV_CODE 2:IV_NAME 3:IV_QUTITY
4:IV_AMOUNT 5:IV_DESC
|
................................................................
:
显示明细
:
:
:
: 发票
: OOOOO
:
:
名称 : OOOOOOOOOOOO
:
: 总数
: -6,666,666
:
: 总金额
: -6,666,666,666,666.66
:
: 备注
: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
:
:
:
:
按执行继续
:
:
:
:..............................................................:
|
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
SUBFILE1 Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords
12=Design image
Opt Order Record
Type
Related Subfile
Date
DDS Error
10 SFL01
SFL
20 SFL
30 SFL01T
RECORD
40 DSP01W
WINDOW
Bottom F3=Exit
F12=Cancel F14=File-level
keywords
F15=File-level comments F17=Subset F24=More keys
|
H、定义文件级关键字:
Select File Keywords
Member . . . : SUBFILE1
Type choices, press Enter.
Y=Yes
General keywords . . . . . . . . Y
Indicator keywords . . . . . . .
Print keywords . . . . . . . . .
Help keywords . . . . . . . . .
.
Display sizes . . . . . . . . .
.
Alternate keywords . . . . . . . DBCS conversion . . . . . . . .
.
Window Borders . . . . . . . . .
Menu-bar keywords . . . . . . .
.
F3=Exit F4=Display Selected
Keywords F12=Cancel
|
Select General Keywords
Member . . . : SUBFILE1
Type choices, press Enter.
Keyword Y=Yes Indicators/+ Invite devices for later read .
. . . . . INVITE
Allow graphics . . . . . . . . . . . . . ALWGPH
Sound alarm on messages . . . .
. . . . . MSGALARM
Separate indicators area . . . . . . . . INDARA Y
Manage display in S/36 mode . .
. . . . . USRDSPMGT
Allow blanks . . . . . . . . . . . . . . CHECK(AB)
Move cursor right-left,
top-bottom . . . CHECK(RLTB)
Move cursor right to left . . .
. . . . . CHECK(RL)
Right to left processing . . . . . . . . DSPRL Change input defaults . . . . .
. . . . . CHGINPDFT
Select parameters .
. . . . . . . . . .
Entry field attribute . . . . .
. . . . . ENTFLDATR
Select parameters .
. . . . . . . . . .
Write error messages to subfile
. . . . . ERRSFL
More...
F3=Exit F12=Cancel
|
Save DDS - Create Display File
Type choices, press Enter.
Save DDS source . . . . . . . . . . . . Y
Y=Yes
Source file . . . . . . . . . . . . . QDDSSRC F4 for
list
Library . . . . . . . . .
. . . . . QINGZHOU Name, *LIBL ... Member . . . . . . .
. . . . . . . . . SUBFILE Text . . . . . . . .
. . . . . . . . .
Create display file . . . . . . . . . . Y
Y=Yes Prompt for
parameters . . . . . . . .
Y=Yes
Display file . . . .
. . . . . . . . . SUBFILE
Library . . . . . . . . .
. . . . . QINGZHOU Name, *CURLIB Replace existing
file . . . . . . . .
Y=Yes
Submit create job in batch . . .
. . . . Y
Y=Yes
Specify additional
save
or create options . . . . . . . .
Y=Yes
F3=Exit F4=Prompt F12=Cancel
Member
SUBFILE1 already exists. Press Enter to replace.
+ |
Columns . . . : 1 71
Browse
QINGZHOU/QDDSSRC
SEU==>
SUBFILE1
FMT A* .....A*.
1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
*************** Beginning of data *************************************
****************** End of data ****************************************
F3=Exit F5=Refresh F9=Retrieve F10=Cursor F11=Toggle F12=Cancel
F16=Repeat find
F24=More keys
SDA(Screen Design Aid)意思为:屏幕设计帮助。
SDA是屏幕设计工具,可以将屏幕设计用形象化画图方式进行设计。设计完成后可以同时生成DSPF源程序以及DSPF OBJECT目标。
显示文件+高级语言=程序。
以下以OS/400 V5R
A、创建QDDSSRC、QRPGLESRC注意事项:
由于要支持简体中文,所以在创建SRCPF时要注意选取参数User specified DBCS data . . . > *YES,在创建QRPGLESRC还要设定Record
length . . . > 112 。
Create Source Physical File (CRTSRCPF)
Type choices,
press Enter.
File . . . .
. . . . . . . . . . > QRPGLESRC Name
Library . . . . . . . . . .
. > QINGZHUO Name, *CURLIB
Record
length . . . . . . . . . >
112
Number
Member, if
desired . . . . . . .
*NONE
Name, *NONE, *FILE
User
specified DBCS data . . . . > *YES
*NO, *YES
Text
'description' . . . . . . . > 'RPGIV source code'
Bottom
F3=Exit F4=Prompt F5=Refresh F10=Additional parameters F12=Cancel
F13=How to
use this display F24=More
keys
B、PF文件说明:
a、QINGZHOU/QDDSSRC(REFILE)是数据公共字典:
Columns . . .
: 1 71
Browse
QINGZHOU/QDDSSRC
SEU==>
REFILE
FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+...
6 ...+... 7
*************** Beginning of data *************************************
****************** End of data ****************************************
F3=Exit F5=Refresh F9=Retrieve F10=Cursor F11=Toggle F12=Cancel
F16=Repeat
find
F24=More keys
(C) COPYRIGHT IBM CORP. 1981, 2000.
b、QINGZHOU/QDDSSRC(INVOICE)是参照数据公共字典的其中一个PF:
Columns . . .
: 1 71
Edit
QINGZHOU/QDDSSRC
SEU==>
INVOICE
FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+...
6 ...+... 7
****************** End of data ****************************************
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F10=Cursor F11=Toggle
F16=Repeat
find
F17=Repeat change
F24=More keys
三、利用SDA制作DSPF:
1、进入SDA单屏幕设计:
1.1、在OS/400命令行执行STRSDA,选择1. Design screens :
AS/400 Screen Design Aid (SDA)
Select one of
the following:
1. Design
screens
2. Design
menus
3. Test display
files
Selection or
command
===>
1
F1=Help F3=Exit F4=Prompt F9=Retrieve F12=Cancel
(C) COPYRIGHT IBM CORP. 1981, 2000.
1.2、敲入Source file、Library以及Member,注意:Member名确定了DSPF的名字。
Design
Screens
Type choices,
press Enter.
Source
file . . . . . . . .
QDDSSRC
Name, F4 for list
Library . . . . . . . . .
QINGZHOU Name, *LIBL, *CURLIB
Member . . . . . . . . .
. IVSCREEN Name, F4 for list
F3=Exit F4=Prompt F12=Cancel
1.3、选择1,并键入记录格式名DSP_PMPT,每一个记录格式表示显示文件的一个显示界面。最常用的是RECORD型,每个画面可以处理数据库文件一个记录。
Work with Display
Records
File . . . . . . : QDDSSRC
Member . . . . . . :
IVSCREEN
Library . . . . :
QINGZHOU
Source type . . . : DSPF
Type options,
press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords 12=Design image
Opt Order Record
Type
Related Subfile
Date DDS
Error
1
DSP_PMPT
(No
records in file)
Bottom
F3=Exit
F12=Cancel
F14=File-level keywords
F15=File-level comments F17=Subset F24=More keys
1.4、执行后见如下画面:
我们可以看到Type类型有很多选择,RECORD是单屏幕设计,SFL是子文件类型,通过PULDWN、MNUBAR可以制作出精美的下拉菜单画面。由于篇幅有限,只能一笔带过。
Add New Record
File
. . . . . . :
QDDSSRC
Member . . . . . . :
IVSCREEN
Library . . . . : QINGZHOU
Source type . . . : DSPF
Type choices, press Enter.
New record . . . . . . . . . . . . . . . DSP_PMPT Name
Type . . . . . . . . . . . .
. . . . . . RECORD RECORD,
USRDFN
SFL, SFLMSG
WINDOW,
WDWSFL
PULDWN, PDNSFL
MNUBAR
F3=Exit F5=Refresh F12=Cancel
1.5、键入执行可以看见25行×80列5250显示空白画面如下:
Work screen for record DSP_PMPT: Press Help
for function keys.
1.6、可以通过F14反复切换开启或者关闭标尺:
... ... 1 ... ... 2 ... ... 3 ... ... 4
... ... 5 ... ... 6 ... ... 7 ... ... 8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2、选取数据库文件
2.1按F10,使用选项1,敲入Database File、Library,并将光标移至Record然后按F4:
Select Database
Files
Type options
and names, press Enter.
1=Display database field list
2=Select all fields for input (I)
3=Select all fields for output (O)
4=Select all fields for both (B) input and output
Option Database File Library Record
1
INVOICE
QINGZHOU
F3=Exit F4=Prompt F12=Cancel
2.2选择记录格式IV_FMT,执行:
Select Database Records
Database
file . . . . . : INVOICE Library
. . . : QINGZHOU
Type options,
press Enter.
1=Select
Option Record
1 IV_FMT
Bottom
F3=Exit F12=Cancel
2.3可见如下画面,我们可以暂时都选取为3输出型,我们可以在后面的屏幕重新定义。
备注:2=输入型(I),3=输出型(O),4=输入输出型(B)。
Select Database Fields
Record . . .
: IV_FMT
Type
information, press Enter.
Number
of fields to roll . . . . . . . . .
. . . . . . . . .
8
Name
of field to search for . . . . . . . . . . . . . . . . .
Type options,
press Enter.
1=Display extended field description
2=Select for input (I), 3=Select for output (O), 4=Select for both
(B)
Option Field
Length Type Column Heading
3 IV_CODE
3 IV_NAME
12 O 名称
3 IV_QUTITY 7,0 P 总数
3 IV_AMOUNT 15,2 P 总金额
3 IV_DESC
30 O 备注
Bottom
F3=Exit F12=Cancel
2.4连续2次执行,回到设计屏幕界面,得到第24行显示的字段名集合。
至此我们完成了使用F10选取数据库文件功能。
... ... 1 ... ... 2 ... ... 3 ... ... 4 ...
... 5 ... ... 6 ... ... 7 ... ... 8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1:IV_CODE
2:IV_NAME 3:IV_QUTITY 4:IV_AMOUNT 5:IV_DESC
c、在屏幕上放置数据库文件字段:
3.1使用“&+字段名序号”可以将字段放置在屏幕上,在字段名序号之后可以加上L表示字段标题居左。建议将字段放置在屏幕中部。
... ... 1 ... ... 2 ... ... 3 ... ... 4 ...
... 5 ... ... 6 ... ... 7 ... ... 8
2
3
4
5
6
7
&
8
9
&
10
11
&
12
13
&
14
15
&
16
17
18
19
20
21
22
23
1:IV_CODE
2:IV_NAME 3:IV_QUTITY 4:IV_AMOUNT 5:IV_DESC
3.2键入执行后,所定义的字段标题、字段属性以及长度显示在屏幕上。
发票 : OOOOO
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
3.3我们可用I、O、B改变字段属性。
例如:将光标放在发票字段范围内,键入I之后执行,可以发现原字段属性已经由O改为I型。
备注:
字段类型 |
输入型 |
输出型 |
输入输出型 |
字符型 |
I |
O |
B |
数值型 |
3 |
6 |
9 |
发票 : IIIII
名称
: OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 : OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
d、添加常数项:
4.1现在为屏幕添加一个标题。将光标置于顶部合适位置键入‘@cccccccc@’,其含义为‘ ’之内表示常数项,一对@之间表示为中文双字节倍数,注意cccccccc必须为偶数,因为汉字是双字节。
'@cccccccc@'
发票 : IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
4.2键入执行后,可见4行下划线,一行可输入一个汉字。
____
发票
: IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
4.3在下划线上敲入汉字“发票查询”,执行:
发票查询
发票
: IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
4.4我们可以使用F20开关反显常数项,然后使用>>>右移或<<<左移常数项。
发票查询 >>>>
发票
: IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注
:
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
4.5同时在屏幕下方放置一个既包括西文以及符号又包括汉字的常数项'F3=@cccc@',必须使用单撇号‘
’将所有常数字段包括在里面。
发票查询
发票
: IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
'F3=@cccc@'
4.6执行后,用同样方法在下划线上输入“退出”。
发票查询
发票 : IIIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
F3= 退出
e、添加变量字段以及系统关键字:
5.1在屏幕24行,我们可以采用+OOOOOOOO增加字符型变量,或者采用+O(40)快速添加长度为40的输出型变量。
备注:
字段类型 |
输出型 |
输入型 |
输入输出型 |
字符型 |
+IIII 或 +I(4) |
+OOOOO 或 +O(5) |
+BBBBBBBB 或 +B(8) |
数值型 |
+33.33 或 +3(4,2) |
+666.66 或 +6(5,2) |
+9999.999 或 +9(7,3) |
发票查询
发票 : IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
F3= 退出
+O(40)
5.2执行后发现在屏幕下方增加了一个字符型变量,系统自动给它命名为FLD001。
发票查询
发票
: IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
F3= 退出
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
5.3按F4,翻页找到FLD001:
Work with Fields
Record . . . : DSP_PMPT
Type information, press Enter.
Number of fields to
roll . . . . . . . . . . . . . . . . . . 6
Type options,
change values, press Enter.
1=Select keywords
4=Delete field
Option Order Field Type Use Length Row/Col Ref Condition Overlap
130 FLD001
O
40 24 019
Bottom
Add
H
Hidden
Add
M
Message
Add
P
Program-to-system
F3=Exit F6=Sort by row/column F12=Cancel
5.4将FLD001改为MSGLINE:
Work with Fields
Record . . .
: DSP_PMPT
Type
information, press Enter.
Number
of fields to roll . . . . . . . . . . . . . . . . . . 6
Type options,
change values, press Enter.
1=Select keywords
4=Delete field
Option Order Field Type Use Length Row/Col Ref Condition Overlap
130 MSGLINE
O
40 24 019
Bottom
Add
H
Hidden
Add
M
Message
Add
P
Program-to-system
F3=Exit F6=Sort by row/column F12=Cancel
5.5 在屏幕上方标题行左右位置键入:*DATE、*SYSNAME、*USER,“*名称”通常为系统定义的保留字。
*DATE
发票查询
*SYSNAME
*USER
发票 : IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
F3= 退出
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
5.6执行后,可见系统名、用户名放置在右上角,日期项放置在左上角。
DD/DD/DD
发票查询
SSSSSSSS
UUUUUUUUUU
发票 : IIIII
名称 : OOOOOOOOOOOO
总数 : -6,666,666
总金额 :
-6,666,666,666,666.66
备注 :
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
F3= 退出
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
f、修改字段属性:
6.1可以通过对屏幕字段前面键入通配符*修改字段属性:
例如:修改“F3=退出”的颜色属性。
DD/DD/DD
发票查询
SSSSSSSS
UUUUUUUUUU
INVOICE: IIIII
NAME:
OOOOOOOOOOOO
SUM: -6,666,666
TOTAL: -6,666,666,666,666.66
DEMO: OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
*F3= 退出
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
6.2选取Colors…Y :
Select Field Keywords
Constant . . . : F3= 退出
Length . . . . : 9
Row . . . : 21 Column
. . . : 25
Type choices,
press Enter.
Y=Yes For Field Type
Display attributes . . . . .
. .
All except Hidden
Colors . . . . . . . . . . .
. . Y All except Hidden
General keywords . . . . . .
. .
All types
TEXT
keyword . . . . . . . . . .
F3=Exit F4=Display Selected Keywords F12=Cancel
6.3 用1选择Blue . . . BLU蓝色颜色:
Select Colors
Constant . . . : F3= 退出
Length . . . . : 9
Row . . . : 21 Column
. . . : 25
Type choices,
press Enter.
Keyword Order Indicators/+
(1-7)
Colors:
COLOR
Blue . . . . . . . . . . . . . . . BLU 1
Green . . . . . . . . . . .
. . . GRN
Pink . . . . . . . . . . . . . . . PNK
Red . . . . . . . . . . . .
. . . RED
Turquoise . . . . . . . . .
. . . TRQ
White . . . . . . . . . . .
. . . WHT
Yellow . . . . . . . . . . . . . . YLW
F3=Exit F12=Cancel
6.4键入2次执行,回到编辑屏幕,可以看到其颜色已经变成蓝色:
6.5用同样方法:“*IIIII”可改变字段IV_CODE字段属性为反白Reverse
image,执行后选择Display attributes:
Select Field Keywords
Field . . . .
. : IV_CODE
Usage . . : I
Length . . . . : 5
Row . . . : 7 Column
. . . : 33
Type choices,
press Enter.
Y=Yes For Field
Type
Display attributes . . . . .
. . Y All except Hidden
Colors . . . . . . . . . . .
. .
All except Hidden
Keying
options . . . . . . . . .
Hidden, Input or Both
Validity check . . . . . . . . .
Input or Both, not float
Input
keywords . . . . . . . . .
Input or Both
General keywords . . . . . .
. .
All types
Database reference . . . . .
. .
Hidden, Input, Output, Both
Error
messages . . . . . . . . .
Input, Output, Both
TEXT
keyword . . . . . . . . . . INVOICE
F3=Exit F4=Display Selected Keywords F12=Cancel
6.6用Y选择Reverse image :
Select Display Attributes
Field . . . .
. : IV_CODE
Usage . . : I
Length . . . . : 5
Row . . . : 7 Column
. . . : 33
Type choices,
press Enter.
Keyword Y=Yes Indicators/+
Field
conditioning . . . . . . . . . . .
Program-to-system field . .
. . . . . .
Display attributes:
DSPATR
High intensity . . . . . . . . . . . . HI
Reverse image . . . . . . .
. . . . . RI
Y
Column separators . . . . .
. . . . . CS
Blink . . . . . . . . . . .
. . . . . BL
Nondisplay . . . . . . . . . . . . . . ND
Underline . . . . . . . . .
. . . . . UL
Position cursor . . . . . .
. . . . . PC
Set modified data tag . . .
. . . . .
MDT
Protect field . . . . . . .
. . . . . PR
Operator ID magnetic card .
. . . . . OID
Select by light pen . . . .
. . . . . SP
F3=Exit F12=Cancel
6.7键入2次执行,同时也修改发票字段属性为B型;修改第24行的字符型变量MSGLINE颜色为红色,以让提示信息醒目。
最后完成屏幕设计如下:
h、保存屏幕:
7.1按F3,选择1=保存退出:
Exit SDA Work Screen
Select one of
the following:
1. Save work since last Enter and exit work screen
2. Exit without saving any work done on the work screen
3. Resume work screen session
Selection
1
F12=Cancel
i、为屏幕添加控制关键字:
为了使用键盘上的F1至F24功能键控制屏幕动作,我们需要为屏幕添加控制关键字。
下列为我们刚设计的屏幕添加F3退出功能的控制关键字。
8.1键入8选择屏幕关键字:
Work with Display Records
File
. . . . . . :
QDDSSRC
Member . . . . . . :
IVSCREEN
Library . . . . : QINGZHOU
Source type . . . : DSPF
Type options, press Enter.
1=Add
2=Edit comments
3=Copy
4=Delete
7=Rename
8=Select keywords 12=Design image
Opt Order Record
Type
Related Subfile
Date DDS
Error
8 10 DSP_PMPT RECORD
Bottom
F3=Exit
F12=Cancel
F14=File-level keywords
F15=File-level comments F17=Subset F24=More
keys
Image updated
for record DSP_PMPT.
8.2在Indicator keywords…Y,然后执行。
使用指示符是为了嵌入在RPGIV中进行逻辑控制,它仅有‘1’或‘0’两种状态。
Select Record Keywords
Record . . .
: DSP_PMPT
Type choices,
press Enter.
Y=Yes
General keywords . . . . . .
. .
Indicator keywords . . . . .
. . Y
Application help
. . . . . . . .
Help
keywords . . . . . . . . . .
Output
keywords . . . . . . . . .
Input
keywords . . . . . . . . .
Overlay keywords . . . . . .
. .
Print
keywords . . . . . . . . .
ALTNAME keyword . . . . . . . . .
TEXT keyword . . . . . . . . . .
F3=Exit F4=Display Selected Keywords F12=Cancel
8.3 本界面是定义屏幕的功能键,可以定义F1至F24一共24键的功能,以及向上翻页、向下翻页、帮助键等等。
注意:CF键与CA键是有所不同的,CF键可以实现对屏幕键入数据的修改,而CA键仅仅是控制屏幕,不涉及修改数据。CF、CA键不可以混用。
Define Indicator Keywords
Record . . .
: DSP_PMPT
Type keywords
and parameters, press Enter.
Conditioned keywords: CFnn CAnn
CLEAR PAGEDOWN/ROLLUP PAGEUP/ROLLDOWN
HOME HELP HLPRTN
Unconditioned keywords: INDTXT VLDCMDKEY SETOF
CHANGE
Keyword Indicators/+ Resp Text
CF03
03 Exit
Bottom
F3=Exit F12=Cancel
j、保存DSPF文件并编译为目标:
9.1按F3后回到如下画面;
Work with Display Records
File . . . . . . : QDDSSRC
Member . . . . . . :
IVSCREEN
Library . . . . :
QINGZHOU
Source type . . . : DSPF
Type options,
press Enter.
1=Add
2=Edit comments
3=Copy 4=Delete
7=Rename
8=Select keywords 12=Design image
Opt Order Record
Type
Related Subfile
Date DDS Error
10 DSP_PMPT RECORD
Bottom
F3=Exit
F12=Cancel
F14=File-level keywords
F15=File-level comments F17=Subset F24=More keys
Keywords
updated for record DSP_PMPT.
9.2再按F3时,出现编译DSPF画面:
连续2次执行。第一次表示保存DDS源码,第二次表示生成目标。
Save DDS - Create Display File
Type choices,
press Enter.
Save
DDS source . . . . . . . . . . .
. Y
Y=Yes
Source file . . . . . . . . . . . . . QDDSSRC F4 for list
Library . . . . . . . . . .
. . . . QINGZHOU Name, *LIBL ...
Member . . . . . . . . . . . . . . . . IVSCREEN F4 for list
Text . . . . . . . . . . . . . . . . .
Create
display file . . . . . . . . .
. Y
Y=Yes
Prompt for parameters . . .
. . . . .
Y=Yes
Display file . . . . . . . . . . . . . IVSCREEN F4 for list
Library . . . . . . . . . .
. . . . QINGZHOU Name, *CURLIB
Replace existing file . . .
. . . . .
Y=Yes
Submit
create job in batch . . . . . . .
Y Y=Yes
Specify additional
save or create options . . . . . . . .
Y=Yes
F3=Exit F4=Prompt F12=Cancel
Member
IVSCREEN already exists. Press Enter to replace.
+
至此屏幕设计已经全部完成。
对于选项2. Design menus设计菜单,由于很简单,在次不再赘述。
附IVSCREEN这个DSPF的源码如下:
Columns . . .
: 1 71
Edit
QINGZHOU/QDDSSRC
SEU==>
IVSCREEN
FMT A* .....A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+...
6 ...+... 7
*************** Beginning of data *************************************
****************** End of data ****************************************
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F10=Cursor F11=Toggle
F16=Repeat
find
F17=Repeat change
F24=More keys
D、编制RPGIV交互式程序:
下面举例说明:编制一个数据查询程序,键入发票号,显示发票明细项。
4.1.利用SEU书写RPGIV代码,假设RPGIV程序名为QRYIV:
Start Source Entry Utility (STRSEU)
Type choices,
press Enter.
Source
file . . . . . . . . . . >
QRPGLESRC Name,
*PRV
Library . . . . . . . . . .
. > QINGZHOU Name, *LIBL, *CURLIB, *PRV
Source
member . . . . . . . . . QRYIV
Name, *PRV, *SELECT
Source
type . . . . . . . . . . RPGLE
Name, *SAME, BAS, BASP...
Text
'description' . . . . . . .
Query Invoice RPGIV Program
Bottom
F3=Exit F4=Prompt F5=Refresh F12=Cancel F13=How to use this display
F24=More
keys
4.2.出现SEU屏幕。
小技巧:我们可以在左栏键入FMT,同时在通行代码栏键入F后执行,可以调出FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++栏,便于书写代码对应位置。
Columns . . .
: 6 76
Edit
QINGZHOU/QRPGLESRC
SEU==>
QRYIV
FMT F FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++++++++++++
*************** Beginning of data *************************************
FMT F
****************** End of data ****************************************
F3=Exit F4=Prompt F5=Refresh F9=Retrieve F10=Cursor F11=Toggle
F16=Repeat
find
F17=Repeat change
F24=More keys
Prompt or format not correct, or does not exist.
3.实现查询功能的RPGIV程序代码如下:
大家可以感觉到RPGIV书写格式明显比RPGIV自由了很多。
如果需要详细解说每行代码的意思,可以跟帖提出。
Columns . . . : 6 76
Browse
QINGZHOU/QRPGLESRC
SEU==>
QRYIV
FMT ** ... 1
...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+.
*************** Beginning of data *************************************
0000.04 //Create by TRF.LIU YUAN YAO
2004.12.18.
0000.05
//Query invoice RPGIV Program.
0000.06
0001.00 FINVOICE IF E
K DISK
0002.00
0003.00 FIVSCREEN CF
0004.00
0005.00
/FREE
0005.01
0006.00
DOW NOT *IN03;
0006.01
0007.00
EXFMT DSP_PMPT;
0008.00
0009.00
IF IV_CODE<>*BLANK;
0009.01
0010.00 CHAIN
IV_CODE IV_FMT;
0011.00 *IN50=NOT
%FOUND;
0011.01
0012.00 IF
*IN50;
0012.01
0013.00
IV_NAME=*BLANK;
0014.00
IV_QUTITY=*ZERO;
0015.00
IV_AMOUNT=*ZERO;
0016.00
MSGLINE=' 无此备件 !';
0016.01
0017.00 ELSE;
0017.01
0018.00
MSGLINE=*BLANK;
0018.01
0019.00
ENDIF;
0019.01
0020.00
ENDIF;
0020.01
0021.00
ENDDO;
0022.00
0023.00
*INLR=*ON;
0024.00
RETURN;
0025.00
0026.00
/END-FREE
****************** End of data ****************************************
F3=Exit F5=Refresh F9=Retrieve F10=Cursor F11=Toggle F12=Cancel
F16=Repeat
find
F24=More keys
E、利用DFU输入数据:
5.1.由于已经在上回有专门详细讲解DFU用法,在此只做一笔带过。
Work with Objects Using PDM
S
Library . . .
. . QINGZHOU
Position to . . . . . . . .
Position to type . . . .
.
Type options,
press Enter.
12=Work with
13=Change text
15=Copy file
16=Run
18=Change using DFU 25=Find string ...
Opt Object Type
Attribute Text
QRYIV *PGM
RPGLE
Query Invoice RPGIV Program
18 INVOICE *FILE PF-DTA invoice dds
cource code
IVSCREEN *FILE DSPF
invoice screen display file
QDDSSRC *FILE PF-SRC dds source code
QRPGLESRC *FILE
PF-SRC
rpgiv source code
REFILE *FILE PF-DTA data dictionary
reference file
Bottom
Parameters or
command
===>
F11=Display
names and types
F12=Cancel
F13=Repeat
F14=Display
Size
F23=More options
F24=More keys
5.2.输入2笔测试数据:
WORK WITH
DATA IN A FILE
Mode . . . . :
CHANGE
Format . . .
. : IV_FMT
File . . . . :
INVOICE
发票 : 00001
名称 : DICTIONARY
总数 : 100
总金额 :
100000
备注 : 测试数据
F3=Exit
F5=Refresh
F6=Select format
F9=Insert
F10=Entry
F11=Change
WORK WITH
DATA IN A FILE
Mode . . . . :
CHANGE
Format . . .
. : IV_FMT
File . . . . :
INVOICE
发票 : 00002
名称 : AS/400 教材
总数 :
2
总金额 :
560000
备注 : AS06 (RPGIV FUNDAMENTALS)
F3=Exit
F5=Refresh
F6=Select format
F9=Insert
F10=Entry
F11=Change
5.3数据保存完毕,可以通过STRSQL查询结果:
Enter SQL Statements
Type SQL
statement, press Enter.
Current
connection is to relational database S
===> select * from qingzhou/invoice
Bottom
F3=Exit F4=Prompt F6=Insert line F9=Retrieve F10=Copy line
F12=Cancel
F13=Services
F24=More keys
(C) COPYRIGHT IBM CORP. 1982, 2000.
5.4、STRSQL查询结果如下:
Display Data
Data width . . . . . . : 87
Position to
line . . . . .
Shift to column . . . . .
.
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....
发票 名称
总数
总金额 备注
00001 DICTIONARY
100
1,000.00 测试数据
00002 AS/400 教材 2
5,600.00 AS06 (RPGIV
FUNDAMENTA
******** End of data ********
Bottom
F3=Exit F12=Cancel F19=Left F20=Right F21=Split
5.5、或者通过STRQRY查询输入的结果。如果查询定义已经保存,下次可以直接通过执行:RUNQRY
QRY(QINGZHOU/QUERY_IV) 快速查询结果。
Display Report
Report width . . . . . : 87
Position to line . . . . .
Shift to column . . . . . .
Line
....+....1....+....2....+....3....+....4....+....5....+....6....+....7..
发票 名称
总数
总金额 备注
000001
00001 DICTIONARY
100
1,000.00 测试数据
000002
00002 AS/400 教材
2
5,600.00 AS06 (RPGIV FUN
******
******** End
of report ********
Bottom
F3=Exit F12=Cancel F19=Left F20=Right F21=
F、运行程序:
通过:编译—检查SPLF错误列表—修正程序—再编译—完成
步骤,调试好RPGIV程序。
确保LIBL库列表中含有放置代码的对应库,然后在命令行执行CALL
QRYIV 。
6.1在发票栏输入00000后执行,下方提示“无此备件!”,说明程序实现了所期待的提醒机能。
6.2、再分别查询00001、00002发票号,屏幕列出该发票号对应的明细项。
G、结束语:
现在,我们终于完成了从DSPF到RPGIV编写过程,实现了简单的交互式程序的设计过程。我们学习了基本的SDA、RPGIV的F、C类定义,指示符的用法,以及如何使用DSPF+RPGIV来编制程序。
我们本篇用SDA所设计的是对文件单一记录进行操作的显示文件界面,而子文件可以同时对文件一组记录进行操作的显示文件界面。
子文件设计是程序设计的重点和难点,如果可能的话,将在下一篇幅进行逐步深入介绍。
5.4.1 概
述
提要:
* CL 命令的作用
* CL 命令的分类
* 系统菜单
5.4.1 .1
CL 命令的作用
CL (Control
Language) 控制语言是用户与操作系统之间的主要接口。可以说用户管理和操作 AS/400 系统,均可以通过 CL 实现。用户在不同的工作站或客户端可以同时使用 CL,其输入方式有五种:
* 在命令行输入
* 在菜单画面选择
* 在
work with 菜单中,option 选项
* 在 CL
程序中执行
* 远程调用
前三种输入方式给用户提供一种交互式的操作方法,只执行一条命令;第四种方式给用户提供一种操作,并包含逻辑控制,可以完整地实现一项功能;第五种方式给用户提供在客户端直接执行主机操作的接口。
由于 CL 使用了统一的命名方法,提供 prompt 式的提示功能和具体到域值的在线帮助,以及自动生成命令参数的缺省值, 再加上有效性检查,从而使得 CL 的使用变得非常简单、方便和灵活。
5.4.1
.2 CL 命令的参数
CL 使用了一种很科学,较为成功的命名方法。每条命令由命令名和一系列参数组成。命令名通常由动词加上接受动词的名词定义为目标Ob ject)组成,单词通常缩写为三个字母。
例如:
CL 命令 命令名
Send Message SNDMSG
Copy File CPYF
Work with Device Desripyions WRKDEVD
CL 的参数由关键字和参数值组成,关键字通常和命令一样缩写,它用于说明参数的作用,在命令输入屏,按 F11 键,即可看到关键字。在命令行输入命令时,如果参数是按照固定的顺序输入,则可以省略关键字。
例如: SNDMSG MSG (HOLLEO) TOUSR (LENG)
命令名 关键字 参数值
大多数 CL 都是 针对目标而言,目标是一个占据了一定存储空间的实体,它包括自身属性及其数据特征的描述,系统可以对它进行操作。目标的属性包括名字、类型、长度、建立日期及其它属性。不同目标具有不同的属性描述,大部分属性是可以修改的,而不需要重新建立。目标的数据值是储存于目标中的信息集合,例如: 程序的值是组成程序的执行码,文件的值是组成文件的记录。
目标的类型很多,常用的几种包括:
* LIB 库
* FILE 文件
* MSGF 信息文件
* PGM 程序
* CMD 命令
* JOBQ 作业队列
* DTAQ 数据队列
* MSGQ 信息队列
* OUTQ 输出队列
* DTAARA 数据域
* JRN 日志
* JRNRCV 日志接受器
* USRPRF 用户简要表
* SBSD 子系统描述
* JOBD 作业描述
* LIND 线路描述
* CTLD 控制器描述
* DEVD 设备描述
一个具体目标是由目标名和目标类型来唯一标识的,不同的目标类型可以使用同一个目标名。目标名由用户指定,目标类型由生成它的命令决定。不同类型的目标具有不同的操作。例如:
CALL 命令只针对
*PGM 目标进行操作。
关于目标的操作,系统也进行了统一的规范,常用的几种包括:
* WRK 工作
* CRT 建立
* ADD 增加
* CHG 改变
* DLT 删除
* DSP 显示
* EDT 编辑
* CPY 拷贝
* MOV 移动
* RNM 变名
* SAV 备份
* RST 恢复
* RTV 获取
* GRT 授权
* DMP 转储
5.4.2 CL 编程
5.4.2.
1 CL 程序的作用
CL 程序是由
CL 命令组成,这些命令被编译成可供随时调用的程序。使用 CL 程序的优点包括:
* CL 程序比单独输入和运行命令快,因为命令被编译成能够立即运行的形式。
* 有些功能需要多条 CL 命令一起完成。
* 参数可以传递给 CL 程序,CL 程序内部也接收变量的定义, 以适应特殊需要的程序操作。
* CL 程序能够像其它高级语言程序一样被测试和监控。
CL 程序可以应用到许多方面,包括:
* 通过 CL 程序完成单独输入 CL 命令所不能完成的功能,例如,人工或者定时提交批作用完成一项工作,如启动子系统, 进行文件备份,整顿系统资源。
* 给交互式或批处理的应用程序提供一个接口,使得在应用程序中直接进行系统操作或者获取系统参数。
* 在网络通信方面,CL 程序往往承担应用主控程序的角色。
5.4.2.
2 CL 程序的结构
CL 程序是借助于
ADT 工具中的 SEU 输入的,在输入过程中,键入一条命令并按 F4
键,就会显示出这条命令的提示画面,方便用户输入相应的参数值。CL 源程序主要分为以下几个部分:
* 程序的开始和结束:
PGM PARM(&A &B) 开始 CL 程序
END PGM 结束程序
* 变量定义:
DCL 定义变量
DCLF 定义文件
* CL 处理命令:
CHGVAR 变量赋值
MONMSG 监控错误信息
SNDPGMMSG 传送程序信息
RTVJOBA 获取作业属性值
* 逻辑控制命令: IF THEN ELSE
DO ENDDO
GOTO
* 内部函数: % SST 取子串
* CAT 连接字符
* 程序控制命令: CALL 调用子程序
RETURN 返回调用程序
5.4.2. 3 CL 程序的命令
CL 程序中仅可包含 CL 命令,由系统提供的大多数 CL 命令可用于 CL 程序,而有些
CL 命令是专门用在 CL 程序中的。 下面是一张用在 CL 程序中的部分命令清单,其中带有星号的表示该命令仅能用于 CL 程序内部。
变量的使用
* 变量说明,使用 DCL 命令来定义变量及其属性、长度和初值。标准格式如下:
* CHAR
DCL VAR (变量名)
TYPE * DEC LEN (长度) VALUE(初值)
* LGL
使用 DCL 命令时,必须遵循的规则如下:
#CL 变量名必须以 & 开始,后跟字符不多于 10 个,& 后的第一个字符必须是字母,其余的可以是字母或数字。
#CL 变量值必须是:字符型最长为 9999 个字符;数值型为压缩十进制数,最长为 15 位,其中小数位最长为 9 位; 逻辑型为“
#CL 变量的缺省初值为:字符型为空,数值型为 0,逻辑型为“
#对于字符型和数值型,如果指定了初值而未指定长度,则缺省长度为初值长度。
* 变量值中小写字符的限制
用作变量的保留值必须用大写字母表示,特别是当它们用引号括起来的时候。例如:
DCL VAR(&LIB)
TYPE(*CHAR) LEN(10) VALUE('*LIBL')
DLTPGM &LIB/MY PROG
注意:如果 VALUE 参数不使用引号,则小写是正确的。因为使用
SEU 编辑会自动转换成大写。
* 变量赋值,使用 CHGVAR 命令给变量赋值,其值可改变成:
#常量:
CHGVAR VAR(&A) VALUE(0)
#变量:
CHGVAR VAR(&A) VALUE(&B)
#计算量:CHGVAR
VAR(&A) VALUE(&A+1)
#函数量:CHGVAR
VAR(&A) VALUE(%SST(&B 1 5))
CHGVAR VAR(%SST(&A 1 5)) VALUE(&B)
赋值时应注意以下几点:
#对逻辑变量,被改变的值必须是一个逻辑值。
#对数值变量,只能赋予十进制数,或者数字字符变量(包括小数点和正负号)。
#对字符变量,既可接受字符,也可接受十进制数。赋十进制数时,该字符变量的值是右对齐,前导补零,负号放在最左边。
* CL 程序中注解的书写,在命令的头尾使用一对符号:/* 和*/。
如果一行写不下一条命令,使用 +。
5.4.2. 4 CL 程序内部的逻辑控制
* 条件转移命令:
IF COND(条件)
THEN(一条命令)
ELSE CMD(一条命令)
或者 IF COND(条件) THEN(DO)
.
ENDDO
ELSE CMD (DO)
.
ENDDO
* 无条件转移命令:GOTO LABEL
* 操作符:
逻辑的 *AND *OR *NOT
算术的 + - * /
字符的 *CAT *TCAT
关系的 *EQ *GT *LT *GE *LE *NE
* 监视信息命令:MONMSG
MONMSG MSGID(信息标识
1 … 信息标识 50)+ EXEC(CL命令)
系统对于CL命令执行错误所送出的信息都具有唯一的标识符,如果不进行监视,则系统会终断程序,自动显示错误信息。
5.4.2. 5 系统资源的获取
* 日期格式转换命令:CVTDAT
CVTDAT DATE(被转换日期) TOVAR(转换后日期) FROMFMT(原格式) TOFMT(新格式) TOSEP(新分隔符)
其中:转换后日期的长度至少是:
#对儒略日期(如 YMD,DMY 或 JUL 格式),不使用分隔符为 5 个字符,使用分隔符为 6 个字符。
#对非儒略日期,不使用分隔符为 6 个字符,使用分隔符为8 个字符。 日期格式和分隔符可以通过按 F4 键选择。
* 检索系统值命令:RTVSYSVAL
RTVSYSVAL SYSVAL(系统值名)RTNVAR(CL变量名)
其中:系统值名可以通过按 F4 键选择,如:系统当前日期的系统值是
QDATE。变量名必须和系统值的类型匹配,对字符型和逻辑型系统值而言,变量名的长度必须相符,对数字型,则长度不小于系统值长度。
* 检索配置源命令:RTVCFGSRC
用于将现有配置的描述存放到源文件成员中
* 配置状态检索命令:RTVCFGSTS
用于获取各类配置描述的现行状态,放入 CL 变量。
* 检索网络属性的命令:RTVNETA
用于获取系统的网络属性,放入相应的 CL 变量。如:系统名SYSNAME,本地网络标识 LCLNETID。
* 检索作业属性命令:RTVJOBA
用于获取当前运行作业的属性,放入相应的 CL 变量。如:作业名 JOB,用户名
USER。
* 检索目标描述命令:RTVOBJD
用于获取指定目标的描述属性,放入相应的 CL 变量。
* 检索用户档案命令:RTVUSRPRF
用于获取指定用户的档案资料,放入相应的 CL 变量。
程序间的通讯是指不同程序之间数据或参数的传递和交流。这种通讯可以出现在不同种类的程序中。如:RPG 与 C 语言,也可以出现在不同机器上,如:PC 与 AS/400。针对OS/400 而言,通常程序间的通讯具有三种方式:
* CALL、RETURN
命令
* 数据队列通讯
* 数据域通讯
调用程序: CALL PGM(PGMA)
PARM(&A &B)
被调用程序:PGM PARM(&C &D)
有关 CALL 命令使用的几点说明:
* 参数值可以是字符常量、数值常量、逻辑常量或 CL 常量,最多可达 40 个。
* 参数值以
CALL 命令中出现的顺序传送,这必须与被调用程序的参数顺序相匹配,变量名不一定相同。
* 被调程序中的接收参数必须说明,但接收值不受变量说明中初值的影响。
* 接收参数值的改变会反映到调用程序中,但常量传送不会改变。
* 字符常量通常以 32 个字节传送,数字常量以 15.5 长度压缩格式传送。
数据队列(*DTAQ)是系统目标中的一种类型,当建立了这种目标后,一个程序可以发送数据给它,另一个程序再从中接收数据,从而达到程序之间的数据通讯。
* 数据队列是两个作业之间进行异步通讯的最快方法。相对数据库文件、消息队列或数据域而言,它需要较少的额外开销。
* 多个作业可以向相同的数据队列送数据和取数据,而数据队列的先进先出、后进先出或关键字顺序排列属性,能够保证数据送取的正确性。
* 在任何高级语言程序中,通过调用系统提供的程序,就可以对数据队列进行操作,而且操作方法灵活方便。数据队列的操作和使用包括两类:第一类使用 CL 命令;第二类调用系统程序。
CL 命令:
CRTDTAQ 建立数据队列
DLTDTAQ 删除数据队列
WRKDTAQ 工作数据队列
系统程序:
QSNDDTAQ 发送数据队列
QRCVDTAQ 接收数据队列
QCLRDTAQ 清除数据队列
QMHQRDQD 检索数据队列
需要将数据发送给数据队列,只要在程序中调用QSNDDTAQ 。在 CL 程序中,调用的格式如下:
CALL PGM(QSNDDTAQ)
PARM(&QNAME &LIB &FLDLEN &FIELD &KEYLEN &KEY)
&QNAME: 是长度为10的字符型,它命名了数据队列,如:IN_Q。
&LIB: 是长度为10的字符型,它命名了数据队列所在的库,如:*LIBL。
&FLDLEN: 是长度为5的数字型,它规定了发送给数据队列的字符数,如:100。
&FIELD: 是长度为&FLDLEN的字符型,它包含了具体发送给数据队列的数据。
&KEYLEN: 是长度为3的数字型,它说明了传送给数据队列的关键字长度,如:6。
&KEY: 是长度为&KEYLEN的字符型,它包含了传送给数据队列的关键字数据。
注:后两个参数可以自选,如果说明了一个,则必须说明另一个。
需要从数据队列中接收数据,只要在程序中调用QRCVDTAQ 。在 CL 程序中,调用的格式如下:
CALL PGM(QRCVDTAQ)
PARM(&QNAME &LIB &FLDLEN &FIELD &WAIT &ORDER KEYLEN
&KEY &SNDRLEN &SNDR)
&QNAME: 是长度为10的字符型,它命名了数据队列。如: OUT_Q。
&LIB: 是长度为10的字符型,它命名了数据队列所在的库。如:*LIBL。
&FLDLEN: 是长度为5的数字型,它规定了发送给数据队列的字符数。
&FIELD: 是长度为&FLDLEN的字符型,它包含了从数据队列中接收到的具体数据。
&WAIT: 是长度为5的数字型,它说明了等待接收数据的时间。负数表示无限制的等待;零表示不等待;
正数示要等待的秒数,最大值是9999。这个参数只有在数据队列中无满足条件的数据时, 才起作
用。
&ORDER: 是长度为2的字符型,它说明了按关键字接收数据的条件。可用的字符值是:GT、LT、EQ、
GE、LE。
&KEYLEN: 是长度为3的数字型,它说明了接收数据队列的关键字长度。
&KEY: 是长度为&KEYLEN的字符型,它标识了用于从数据队列中接收数据的关键字变量。
&SNDRLEN:是长度为3的数字型,它规定了发送者标识的长度。
&SNDR: 是长度为&SNDRLEN
的字符型,它包含了发送者标识的数据。
注:后三个参数可以任选,但是&ORDER、&KEYLEN和&KEY
必须同时说明。
需要从数据队列中清除数据,只要在程序中调用 QCLRDTAQ 在 CL 程序中,调用的格式如下:
CALL PGM(QCLRDTAQ)
PARMM(&QNAME &LIB)
需要检索一个数据队列的描述项,只要在程序中调用QMHQRDQD。在 CL 程序中,调用的格式如下:
CALL PGM(QMHQRDQD)
PARM(&RCVR &RCVRLEN &FORMAT &DQNAME)
&RCVR: 是长度为&RCVRLEN的字符型,它标识了含有数据队列性的变量。
&RCVRLEN: 是长度为4的数字型,它说明了&RCVR长度。
&FORMAT: 是长度为8的字符型,它定义了接收模板的格式。
&DQNAME: 是长度为20的字符型,它标识了数据队列和所在库,前十个字符是队列名字,后十个字符是库名。
数据域(*DTAARA)是系统目标中的一种类型。当建立了这种目标后,可以用来存入数据,以便任何程序进行读取和修改。数据域的典型用途如下:
* 提供用于几个程序中的常数字段,易于共享和修改。如:标题、说明等。
* 在一个作业中提供一个传递信息的区域。
* 在一个作业中提供一个字段作为控制参数,以便容易地得到修改。
数据域的 CL 命令包括:
CRTDTAARA 建立数据域,长度不超过2000
CHGDTAARA 改变数据域,改变时数据域被锁定
DSPDTAARA 显示数据域,可以以十六进制方式显示
RTVDTAARA 检索数据域,检索值需要存入 CL 变量
DLTDTAARA 删除数据域
WRKDTAARA 工作数据域
CL 源程序必须经过编译,生成 *PGM 方可运行。建立程序的方法有两种:一是,使用 CL 命令 CRTCLPGM,二是,使用PDM
菜单选项 14,按 F4 键即可对命令参数进行选择。
系统编译的情况全部记录在编译清单中,通过 WRKSPLF 即可看到。编译过程中的错误被列在相应命令后面,以及文件的最后,方便用户查找。下列类型的错误将停止程序的建立:
* 值错
* 句法错
* 命令内部与参数间不符
* 有效性检查有错
CL 程序可以通过反编译命令 RTVCLSRC,重新建立 CL源程序。使用该命令时,必须满足建立编译程序的参数
ALWRTVSRC 为 *YES。 当源程序被反编后,任何注释信息不再重新产生,以下程序序言将被建立:
* 所有者名
* 源程序的最终修改日期
* 源程序的重建日期和时间
* 最初编译时的许可程序级
CL 程序的测试
对于 CL 程序在编译和运行中的错误,系统提供以下几种测试功能:
* 程序转储。 在 CL 源程序中输入命令 DMPCLPGM,运行后通过
WRKSPLF 即可看到转储内容。包括程序信息队列的全部信息和全部变量的数值。如果程序运行出错,出现提示画面时,输入 D 也可进行程序转储。
* 设置断点。第一步,启动测试环境,使用命令 STRDBG PGM (PGMA);第二步,设置断点,使用命令 ADDBKP STMT 1500) PGMVAR( '&A'
'&B'); 第三步,运行程序,显示断点信息;第四步,结束测试环境,使用命令 ENDDBG。
* 设置跟踪。跟踪是记录程序中语句执行顺序的过程。系统并不自动显示跟踪信息,而须使用命令 DSPTRCDTA 请求显示跟踪信息,信息包括语句执行的顺序和
ADDTRC 命令中指定的变量值。
例如:
Auto RGZPFM
STRCLPGM: PGM PARM(&LIBRARY)
DCL VAR(&LIBRARY)
TYPE(*CHAR) LEN(10)
DCL VAR(&PERCENT)
TYPE(*DEC) LEN(4 3)
DCLF FILE(QTEMP/WORKFILE)
RCDFMT(QWHFDMBR)
DSPFD FILE(&LIBRARY/*ALL) TYPE(*MBR) +
OUTPUT(*OUTFILE) OUTFILE(QTEMP/WORKFILE)
NEXT: RCVF RCDFMT(QWHFDMBR)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDCLPGM))
IF COND(&MBFILA
*EQ '*PHY') THEN(DO)
CHGVAR VAR(&PERCENT) VALUE(&MBNDTR / &MBNRCD)
MONMSG MSGID(MCH1211) EXEC(GOTO CMDLBL(NEXT))
IF COND(&PERCENT
*GT .15) THEN(DO)
SBMJOB CMD(RGZPFM FILE(&MBLIB/&MBFILE) MBR(&MBNAME))
ENDDO
ENDDO
GOTO CMDLBL(NEXT)
ENDCLPGM: DLTF FILE(QTEMP/WORKFILE)
ENDPGM
5.4.5常用CL命令
系统功能 |
命令 |
命令功能 |
修改过程控制 |
CALL
(Call) |
调用一个程序 |
CALLPRC
(Call Procedure) |
调用一个过程 |
|
RETURN
(Return) |
返回到引起程序或过程运行的下一条命令 |
|
CL过程界限 |
PGM
(program) (1) |
指出CL过程源码的开始 |
ENDPGM
(End Program) (1) |
指出CL过程源码的结束 |
|
CL过程逻辑 |
IF (If)
(1) |
根据逻辑表达式的值执行命令 |
ELSE (Else)
(1) |
对IF命令为假条件定义采取的行动 |
|
DO (Do)
(1) |
指出DO组的开始 |
|
ENDDO
(End Do) (1) |
指出DO组的结束 |
|
GOTO (Go
To) (1) |
转移到另外的命令 |
|
CL过程变量 |
CHGVAR
(Change Variable) (1) |
修改CL变量的值 |
DCL
(Declare) (1) |
说明一个变量 |
|
替换 |
CHGVAR
(Change Variable) (1) |
修改CL变量的值 |
CVTDAT
(Convert Date) (1) |
修改日期格式 |
|
数据区 |
CHGDTAARA
(Change Data Area) |
修改数据区 |
CRTDTAARA
(Create Data Area) |
生成一个数据区 |
|
DLTDTAARA
(Delete Data Area) |
删除一个数据区 |
|
DSPDTAARA
(Display Data Area) |
显示一个数据区 |
|
RTVDTAARA
(Retrieve Data Area) |
把数据区的内容复制到一个CL变量中 |
|
文件 |
ENDRCV
(End Receive) (1) |
取消由前面的RCVF,SNDF或SNDRCVF 命令对一个显示文件发出的输入请求. |
DCLF
(Declare File) (1) |
说明一个显示文件或数据库文件 |
|
RCVF
(Receive File) (1) |
从显示文件和数据库文件中读记录 |
|
RTVMBRD
(Retrieve Member Description) (1) |
取得数据库文件成员的描述 |
|
SNDF
(Send File) (1) |
往显示文件中写记录 |
|
SNDRCVF
(Send/Reveive File)(1) |
往显示文件中写记录,在用户回答后读记录 |
|
WAIT
(Wait) (1) |
等待从显示文件发出的SNDF,RCVF或SNDRVF命令接收文件 |
|
信息 |
MONMSG
(Monitor Message)(1) |
监控送往程序队列的逃逸,状态和通知信息 |
RCVMSG
(Receive Message)(1) |
把信息从信息队列复制到一个CL变量中 |
|
|
RMVMSG
(Remove Message)(1) |
从信息队列取消信息 |
RTVMSG
(Retrieve Message)(1) |
把预先定义的信息从信息文件复制到CL变量中 |
|
SNDPGMMSG(Send Program Message)(1) |
往信息队列发送程序信息 |
|
SNDRPY (Send Reply)(1) |
给查询信息的发送者发送回答信息 |
|
SNDUSRMSG(Send User Message)(1) |
给显示工作站或系统操作员发送消息或查询信息 |
|
混杂命令 |
CHKOBJ
(Check Object) |
检查目标是否存在及使用目标必须有的权限 |
PRTCMDUSG
(Print Command Usage) |
产生一个用在某组CL过程中的一组命令中的交叉引用表 |
|
RTVCFGSRC
(Retrieve Configuration Source) |
对生成的已存在的配置目标建立一个CL命令源码且把它放在源文件成员中 |
|
RTVCFGSTS(RetrieveConfiguration
Status)(1) |
从三个配置目标(线路,控制器和设备)中取得配置状态 |
|
RTVJOBA (Retrieve
Job Attributes) (1) |
取得一个或多个作业属性的值且把它们放到CL变量中 |
|
RTVSYSVAL
(Retrieve System Value)(1) |
取得系统值并且把它放到一个CL变量中 |
|
RTVUSRPRF
(Retrieve User Profile)(1) |
取得用户文件属性并把它放到CL变量中 |
|
程序生成命令 |
CRTCLMOD (Create
CL Module) |
生成一个CL模块 |
DLTMOD (Delete Module) |
删除一个模块 |
|
DLTPGM (Delete Program) |
删除一个程序 |
|
CRTBNDCL
(Create Bound Control Language Program) |
生成一个联编的CL程序 |
|
CRTPGM (Create
Program) |
生成一个程序 |
|
CRTSRVPGM(Create Service
Program) |
生成一个服务程序 |
(1) 表示这些命令仅能用在CL过程中。
其实,delphi 和其他语言一样,如果只是单纯的利用as400的数据库的功能,通常,我们都选用windows平台。数据驱动选择client
的odbc.如果AS400的服务器的OS版本>4.4应该就可以用OLDEB的方式。速度会快一些。如果主机版本比较低,只能用ODBC。
下面讲述从如何准备环境到开始写程序。
1. 安装client access
CU上面已经有ca5.2的下载了。下载下来安装,新版本的client access在ado的性能上总体来的好一些。不过也不是所有的主机都能够支持的。有一些特性仅限于比较高的版本。
2. 设置ODBC数据源
点击 添加
选择Client Access ODBC Driver (32-bit)
设置odbc的名字
System中,如果是新版本的可以直接填入ip,如果不是,得修改host表
然后从中选择一个
3. ado连接
就是简单的ODBC的连接。
第二节:调用400上的rpg 或者cl程序
这个我每什么经验,所以等后人来填充
Delphi for AS/400是Borland公司(现改为Inprise公司)专门为AS/400用户提供的用于开发AS/400应用程序的Delphi前端开发工具。除了具有 3.0的全部功能外,Delphi/400提供了与AS/400相兼容的三组元件--SCD400 Data、SCD400
System和 DB。其中SCD400 Data和 DB两组元件与普通Delphi 3.0所属两组元件 Access和Data Controls中元件具有相同或类似的功能。在System元件组中,提供的元件,可以直接调用PGM程序和直接调用A/400
CL命令。
一、 在AS/400上编制实现打印货物舱单的RPG程序
为叙述方便,假设所需要用到的AS/400上的文件(在AS/400中称为对象--Object)都放在TEST库(Library)中。DCPRTMF为打印文件,用来输出打印舱单的打印格式和内容。DCRPGMF为RPG程序,带两参数VSLCOD(船代码)和VOYNO(航次),用来生成舱单。
二、 在AS/400上将打印文件转化为AS/400的物理文件
在AS/400上建一物理文件MFPC(相当于其它数据库的Table),记录名为MP,字段名为MP198,长度为198字符。此物理文件用来保存货物舱单打印文件内容。这个过程用MFCPYSPL程序(CLP类型)来实现,程序如下:
***************Beginning of
data***************
01.0 PGM PARM(STRJOB
STRUSR STRNBR)
0002.00 DCL VAR(STRJOB)
TYPE(*CHAR) LEN(10)
0003.00 DCL VAR(STRUSR)
TYPE(*CHAR) LEN(10)
04.0 DCL VAR(STRNBR)
TYPE(*CHAR) LEN(6)
0005.00 CPYSPLF FILE(DCPRTMF)
TOFILE(TEST/MFPC) +
0006.00 JOB(STRNBR/STRUSR/STRJOB)
TOMBR(MFPC) +
0007.00 MBROPT(*REPLACE) ①
0008.00 DLTSPLF FILE(DCPRTMF)
JOB(STRNBR/STRUSR/STRJOB) ②
0010.00 ENDPGM
****************** End of data
**************
上述文件定义了三个参数STRJOB、STRUSR和STRNBR,是与操作Spool File相关的参数。
①将打印文件(Spool
File)拷贝到物理文件MFPC;②删除打印文件。
三、 用Delphi/400将AS/400上的打印文件转化为微机的文本文件
在进行程序处理以前,先在Delphi的 Module进行如下VCL组件设置:
1.AS400组件设置:name--AS4001。
2.Table组件设置:name--MfpcTbl;
tablename--MFPC。与AS/400上的物理文件连接。
3.Call400组件设置:name--Call400PRTMF;
AS400--AS4001;LibraryName--TEST;
ProgramName--DCRPGPC;Params定义对应VSLCOD和VOYNO。
4.Call400组件设置:name--Call400CPYSPL;
AS400--AS4001;LibraryName--TEST;
ProgramName--MFCPYSPL;Params
定义对应STRJOB、STRUSR和STRNBR。
5.Cmd400组件设置:name--Cmd400Addlible;
AS400--AS4001;CommandLine--ADDLIBLE
LIB(TEST)
POSITION(*FIRST)。将TEST加入库表。
6.Cmd400组件设置:name--Cmd400Rtvjob;AS400--AS4001;
CommandLine--RTVJOBA JOB(P.1) USER(P.2)
NBR(P.3) USRLIBL(P.4)。用于获取运行MFCPYSPL程序所需要的参数。
以下就是实现将AS/400上的打印文件DCPRTMF转化为微机的文本文件的源程序。
var
F,ToF:TextFile;
TempStr:String;
Fname:String;
Str_Job:String;
Str_Usr:String;
Str_Nbr:String;
begin
//获取运行将打印文件转换为物理文件程序的参数
CommDtmFrm.Cmd400Rtvjoba.Execute;
Str_Job:=CommDtmFrm.Cmd400Rtvjoba.Value[0];
Str_Usr:=CommDtmFrm.Cmd400Rtvjoba.Value[1];
Str_Nbr:=CommDtmFrm.Cmd400Rtvjoba.Value[2];
//增加库表
CommDtmFrm.Cmd400Addlible1.Execute;
//生成CARGO MENIFEST,其中StrVslcod、
StrVoyage为打印舱单的参数
CommDtmFrm.Call400PRTMF.Value[0]:=StrVslcod;
CommDtmFrm.Call400PRTMF.Value[1]:=StrVoyage;
CommDtmFrm.Call400PRTMF.Execute
;
//转换为物理文件
CommDtmFrm.Call400Cpyspl.Value[0]:=Str_Job;
CommDtmFrm.Call400Cpyspl.Value[1]:=Str_Usr;
CommDtmFrm.Call400Cpyspl.Value[2]:=Str_Nbr;
CommDtmFrm.Call400Cpyspl.Execute
;
//产生一个新文件
Fname:='C:\Communication\Newmf.txt';
AssignFile(F,Fname);
ReWrite(F);
if
CommDtmFrm.MfpcTbl.Active=false then
CommDtmFrm.MfpcTbl.Active:=True ;
//将物理文件的数据读出保存为文本文件
with CommDtmFrm.MfpcTbl
do
begin
DisableControls;
try
First;
while not EOF do
begin
{ Process each record here }
TempStr:=CommDtmFrm.MfpcTblMP198.Value;
writeln(F,TempStr);
Next;
end;
finally
EnableControls;
end;
end;
if SaveDialog1.Execute
then
begin
AssignFile(ToF,
SaveDialog1.FileName);
ReWrite(ToF);
Reset(F);
while not EOF(F) do
begin
{ Process each record here }
Readln(F,TempStr);
writeln(ToF,TempStr);
end;
end;
CloseFile(F);
CloseFile(ToF);
请先安装CA,才能使用一下开发技巧。
5.6.1
ODBC连接AS400
ConnectString = "Provider=IBMDA400;Data
Source='" & Trim(LjIp) & "';User ID='" &
Trim(LjUser) & "' ;PassWord='" & Trim(LjPwd) &
"'"
Sourece
处请填写400的地址
Useid 处请填写用户名
Password
处请填写密码
5.6.2
通过API下载数据
' 通过IBM提供的参数,下载400文件,并检查下载结果
'输入参数
' 无
'输出参数
' 参照MAIN说明
'调用函数
' 无
Dim SysName As New cwbx.SystemNames
Dim AsSys As
New cwbx.AS400System
Dim AsTr As
cwbx.DatabaseTransferResults
Dim Dlt As
New cwbx.DatabaseDownloadRequest
Dim DltACC As cwbx.DatabaseDownloadASCIIOptions
Dim SysNum As Integer
Dim SysExist As Boolean
Dim StrTime As Date
Dim FreeNum As Integer
'检查收到的地址是否有效 AS400
SysExist = False
StrTime = Now()
For SysNum = 1 To
SysName.Count '
RunInput(1) 就是400系统名
If SysName.Item(SysNum) = RunInput(1) Then
SysExist = True
Exit For
End
If
Next SysNum
If SysExist = False Then
Ca_Down = -305
Exit
Function
End If
'开始系统连接定义
On Error GoTo SysErr
AsSys.Define RunInput(1)
AsSys.UserID = RunInput(2) '用户名
AsSys.Password = RunInput(3) '密码
AsSys.Signon
'开始下载定义
Set Dlt.System = AsSys
Dlt.AS400File = RunInput(4) ’400文件名
Dlt.Query.Select =
RunInput(5) '下载的字段列表
Dlt.Query.Where =
RunInput(6) ’下载条件
If Trim(RunInput(8)) = 0 Or
Len(Trim(RunInput(8))) = 0 Then
'下载文件的保存格式
Dlt.pcFile.FileType = cwbdtASCIIText
Set
DltACC = Dlt.pcFile.Options
DltACC.TruncateSpaces = False
DltACC.CodePage = cwbnlCodePageClientANSI
Else
Dlt.pcFile.FileType = cwbdtCSV
End If
Dlt.pcFile.Name =
RunInput(7)
’Pc机上保存的文件名
'开始下载
On Error GoTo DltErr
Dlt.Download
Set AsTr =
Dlt.TransferResults
'下载结果处理
On Error GoTo AsTrErr
If AsTr.DataErrors.Count
> 0 Then
Select Case AsTr.DataErrors.Item(1).ErrorType
Case 1, 5
Ca_Down = -311
Case 2, 6
Ca_Down = -312
Case 3, 7
Ca_Down = -313
Case 4, 8
'数据转换错误
Ca_Down = -314
End
Select
End If
Ca_Down = DateDiff("s",
StrTime, AsTr.CompletionTime)
Set DltACC = Nothing
Set Dlt = Nothing
Set AsSys = Nothing
Exit Function
DltErr:
Select Case Dlt.Errors.ReturnCode
Case
3
'下载文件目录不存在
Ca_Down = -322
Case
112
'磁盘空间满
Ca_Down = -323
Case
7004
'空记录
FreeNum = FreeFile
Open RunInput(7) For Append As #FreeNum
Close #FreeNum
Ca_Down = -308
Case
6053
'通讯错误
Ca_Down = -306
' Case
7412
'
'AS400系统文件存在记录锁
'
Ca_Down = -307
Case
7038, 7040, 7412
'指定文件或者库不存在
RunInput(4) = LCase(RunInput(4))
If InStr(1, RunInput(4),
"abjq/batfiles") > 0 Then
If InStr(1, RunInput(4), "batfiles1")
> 0 Then
RunInput(4) = Replace(RunInput(4),
"batfiles1", "batfiles3")
Else
RunInput(4) = Replace(RunInput(4),
"batfiles3", "batfiles1")
End If
RepNum = RepNum + 1
If RepNum >= 2 Then
Ca_Down = -316
Exit Function
End If
Set AsTr = Nothing
Set DltACC = Nothing
Set Dlt = Nothing
Set AsSys = Nothing
Ca_Down
Else
Ca_Down = -316
End If
Case
Else
'出现无法预测错误
Ca_Down = -317
End Select
Set AsSys = Nothing
Exit Function
SysErr:
Select Case
AsSys.Errors.ReturnCode
Case
8002
'密码错
Ca_Down = -309
Case
8001
'用户名错
Ca_Down = -310
Case
Else
'出现无法预测错误
Ca_Down = -317
End Select
Exit Function
AsTrErr:
Ca_Down = -315
End Function
随着IT的发展,微软提出下一代将是.net的时代。如果五到十年之内,还是windows占据个人电脑的擦作系统的主流的话。那应该是这样的情况。
对OS的要求:v5r1.
如果不需要事务支持4.4就可以了。
客户端,如果是应用程序,客户端需要安装client acess v5r3 或者 以上的。因为这个版本提供了.net
provider
如果是基于web的,只需要web server安装client acessv5r3 或者以上就可以了。
connection 的连接串:
Protection
Level=None;User ID=用户名;Force Translate=65535;Data Source=服务器ip;Password=密码;Provider=IBMDASQL;Transport
Product=Client Access;Catalog Library List=;Default Collection=用户名;Persist
Security Info=True;Convert
Date Time To Char=TRUE;SSL=DEFAULT
这是对简单的,要求系统管理员对用户进行授权,最好是public 是*EXCLUDE.然后根据用户在进行授权。
ADO.NET强调的是断开式连接。就是说,如果你和数据库连接用完了,就断开。.net framework默认有数据库连接池管理。
目前的.net provider还不支持数据队列等一些比较高级的操作。
用.net访问as400有很多种选择,我们为了提供可迁移性,所以只用oledb,其实client acess本身提供了一套类似ado.net的.net类。
客户端程序最重要的是索引。当然索引的设置最好慎重,过多的索引会浪费硬盘空间。
还有用户调用sql的时候需要事先测试sql是否安全,比如,我查找数据,但是我时间期限设置很大,然后又多表关联,这样会吃光内存,最终导致400当机。所以做程序的时候要考虑到这些范围。
目前做.net访问400感觉还是不是很快,但是至少可以接受。不过400的优点在于大批量数据检索的时候效率比sqlserver之类的来得快。当你的数据超过100万的时候,体现更加的明显。
由于速度不是太快,所以建议,尽可能减少数据库往返,不过如果关联的数据库都是数据量很大,我觉得宁愿多几次数据往返,因为400的关联实在是太慢了。他得建立访问路径,特消耗时间。、
我能写得就这么多了。其余的都是.net的知识了。
经过一段时间的基于as400的.net开发之后,发现了一些常见的问题:
a)
如果需要事务支持,那么首先PF得添加journal,可以用strjrnpf绑定journal.
如果没有绑定journal,得到的exception通常都是在进行insert/update/delete的
时候发生,错误一般都是:xxx/xxxpf不能适用于这种操作。
b)
如果不用5250 ,client access只需要安装base.exe dataccess.exe
c)
As400的数据字典在qsys2/systables syscolumns里面,不过是被锁定,可以copf的形式拷贝到别的地方,修改ccid=935,供客户端建模使用。
d)
一般来说,我们在400上使用的数据类型对应pc
S----int32
P----decimal
O等字符型—string
日期型没用过,不是很清楚
5. 报表最好用推模式,这样可以防止很多地方需要记住数据库连接串,具体的推模式
就是先build一个dataset,数据源用这个来绑定,写报表的时候,按照之前build
好的一个dataset的结构,填充数据,然后推给报表就可以了。
最好做一个dal层,统一管理数据访问,具体的可以参考微软的data
acesss block
6. 推荐按照微软的duwamish的架构,个人感觉比较适合as400的开发,可以让你比较
容易的摆脱填写繁杂的sql语句,当然了,还有更加多更加优秀的架构,不过对于
应用框架,可以参考目前最先进的aop(面向方面编程)
7. 另外是关于ccid的事情(frank碰到的)
如果发现你的pf的ccid不能更改,那么是因为这个object被人锁住了
更改了,但是不能立马起效果,应该是还有人锁住,机器重新启动玩之后就可以
了,或者把tcp/ip重新启动一下就可以了。
如果发现还是不行,那么就是userporfile的问题
以前默认的*SYSVAL 改成935或1388就可以了!
JDBC
是JAVA 程序中访问数据库系统的标准接口,主要的数据库厂商都为自己的数据库管理系统提供了配套的JDBC 驱动程序。IBM 为UDB/400 数据库提供了两种类型的JDBC 驱动程序。一种是IBM ToolBox for JAVA 中包含的com.ibm.as400.access.AS400JDBCDriver
驱动程序,另一种是UDB/400 自带的com.ibm.db2.jdbc.app.DB2Driver 驱动程序。现在两种驱动程序均广泛的应用在各种基于JAVA 的UDB/400 应用程序中。下面将详细的介绍两种驱动的使用方法和差别
A. IBM ToolBox for JAVA JDBC 驱动程序
IBM
ToolBox for JAVA 是IBM 提供的一个JAVA 类库。使用这个类库,开发者不但可以访问UDB/400
数据库。而且可以访问和使用OS/400 操作系统中的各种作业队列、消息队列、验证用户权限等相关服务和作业,功能非常强大。这里着重介绍IBM ToolBox for JAVA 提供的JDBC
驱动程序(简称ToolBox JDBC 驱动程序)的使用方法。
ToolBox
JDBC 驱动程序包含在com.ibm.as400.access.* 包中,使用时通过注册com.ibm.as400.access.AS400JDBCDriver 来使用。在使用ToolBox JDBC 驱动程序之前,OS/400
系统必须安装许可程序“IBM Developer Kit for Java” 5722JV1 (或V4R5 版本以前5769JV1)和许可程序“IBM ToolBox for JAVA” 5722JC1(或5769JC1)。安装了IBM ToolBox for JAVA 后,需要将ToolBox
for JAVA 的JAR 文件加入到系统的CLASSPATH 中,使JAVA
程序可以找到该类库。在OS/400 的IFS文件系统下:/QIBM/ProdData/HTTP/Public/jt400/lib
引用ToolBox JDBC 驱动程序时,应在程序中导入com.ibm.as400.access.*
包。同时使用DriverManager 注册com.ibm.as400.AS400JDBCDriver 类。import
com.ibm.as400.access.*; //导入com.ibm.as400.access.*
包try {//注册com.ibm.as400.access.AS400JDBCDriver 驱动程序Driver driver = (Driver) Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance();DriverManager.registerDriver(driver);}
每种JDBC 驱动程序都有自己的数据库连接串(Database URL)格式,ToolBoxJDBC 驱动程序的数据库连接串格式为:jdbc:as400://HostAddress/DatabaseName,其中“jdbc:as400://”为JDBC
连接协议,指定连接数据库使用ToolBox JDBC 驱动程序。而“HostAddress”代表要连接的数据库服务器的IP 地址,如果OS/400 中指定了HostTable 或可用的DNS 服务器也可以使用要连接的主机名代替IP 地址。如果要连接的UDB/400 数据库和JAVA 程序在同一台机器上,则使用“*local”来表示本机地址。参见下面的例子:
jdbc:as400://169.254.200.4/testdb
//连接169.254.200.4 上的testdb
库
jdbc:as400://*local/testdb
//连接本地的testdb 库
下面是一个完整的在JSP 中引用ToolBox JDBC 驱动程序访问UDB/400 数据库
的例子:
<%@ page language="java" import="java.sql.*,
com.ibm.as400.access.* "%>
<%
//加载数据库驱动程序
try{
//注册com.ibm.as400.access.AS400JDBCDriver
驱动程序
Driver driver = (Driver) Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance();
DriverManager.registerDriver(driver);
out.print("iSeries 400 JDBC Driver 正确安装<br>");
}
catch(Exception
e){
out.print("iSeries 400 JDBC Driver 安装失败<br>");
}
//连接数据库并执行查询
try {
Connection conn = null;
conn =
DriverManager.getConnection("jdbc:as400://169.254.200.4/testdb","qsecofr","qsecofr");
out.print("正确连接 iSeries
400 数据库 <br>");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select *
from test");
out.println("<br>查询结果:<br>");
while
(rs.next()) {
String a = rs.getString(1);
out.print("
name= " + a + "<br>");
}
rs.close();
stmt.close();
conn.close();
} catch( Exception e ) {
out.println("<br>查询失败<br>");
}
%>
ToolBox
JDBC 驱动程序是TYPE 2 类型的驱动程序(符合JDBC 3.0 标准),这意味着ToolBox JDBC 驱动程序是由纯JAVA 编写的,可以运行在任何支持JAVA 的平台上。比如运行在Linux 服务器上的JAVA 程序就可以通过ToolBox JDBC 驱动程序访问运行在iSeries
上的UDB/400 数据库。实现应用服务器和数据库服务器的分离。
B. iSeries Native
JDBC 驱动程序
iSeries
Nativer JDBC 驱动程序又称为UDB/400 本地驱动程序,和ToolBox JDBCDriver 不同。Native JDBC 驱动程序的底层是用C/C++语言实现的,上层通过JNI(JAVA
Native Interface)进行了封装。由于Native JDBC 驱动程序的底层是用高级语言实现的二进制代码,执行效率要比ToolBox for
JAVA 驱动高。但是由于依赖于底层的二进制代码,Native JDBC 驱动程序只能运行在OS/400 操作系统之上。
Native
JDBC 驱动程序包含在com.ibm.db2.* 包中, 使用时通过注册“com.ibm.db2.jdbc.app.DB2Driver”来使用。在使用之前Native
JDBC 驱动程序的JAR 文件加入到系统的CLASSPATH 中,使JAVA 程序可以找到该类库。在OS/400的IFS 文件系统下:/QIBM/ProdData/Java400/ext引用ToolBox
JDBC 驱动程序时,应在程序中导入com.ibm.as400.access.* 包。同时使用DriverManager 注册com.ibm.as400.AS400JDBCDriver
类。
import
com.ibm.db2.*; //导入com.ibm.db2.* 包
try {
//注册com.ibm.db2.jdbc.app.DB2Driver
驱动程序
Driver
driver = (Driver) Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();
DriverManager.registerDriver(driver);
}
Native
JDBC 驱动程序的数据库连接串格式为:jdbc:db2:DataBaseName,其中
“jdbc:db2:”为JDBC 连接协议,指定连接数据库使用Native
JDBC 驱动程序。而
“DataBaseName”代表要连接的本地数据库名称(library
name)。参见下面的例子:
jdbc:db2:testdb
//连接本地的testdb 库
下面是一个完整的在JSP 中引用Native JDBC 驱动程序访问UDB/400 数据库的例子:
<%@
page language="java" import="java.sql.*, com.ibm.db2.*
"%>
<%
//加载数据库驱动程序
try{
//注册com.ibm.db2.jdbc.app.DB2Driver
驱动程序
Driver
driver = (Driver) Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();
DriverManager.registerDriver(driver);
out.print("<br>iSeries
400 JDBC Native Driver 正确安装<br>");
}
catch(Exception
e){
out.print("<br>iSeries
400 JDBC Native Driver 安装失败<br>");
}
//连接数据库并执行查询
try {
Connection
conn = null;
conn =
DriverManager.getConnection("jdbc:db2://*local/slb2b","slb2b","b2b720");
out.print("正确连接
iSeries 400 数据库 <br>");
Statement
stmt = conn.createStatement();
ResultSet
rs = stmt.executeQuery("select * from
test");
out.println("<br>查询结果:<br>");
while
(rs.next()) {
String
a = rs.getString(1);
out.print("
name= " + a + "<br>");
}
rs.close();
stmt.close();
conn.close();
} catch( Exception e ) {
out.println("<br>查询失败<br>");
}
%>
A. 数据库连接池实例
import
java.io.*;
import
java.sql.*;
import
java.util.*;
import
java.util.Date;
/*
* 数据库连接池类
*/
public
class DBConnectPool {
static private
DBConnectPool instance; // 唯一实例
private
int checkedOut = 0;
private Vector
freeConnections = new Vector(); //连接池向量表
private int maxConn;
//连接池中最大连接数
private String name;
//连接池的名字
private String user;
//数据库用户
private String
password; //数据库密码
private String URL;
//数据库连接串
/*
* 私有方法创建数据库连接池,防止随意的创建连接池。所有的客户端程序都使用统一的实例
* @param name 连接池名字
* @param URL 数据库的JDBC
URL
* @param user 数据库帐号,或 null
* @param password 密码,或
null
* @param maxConn 此连接池允许建立的最大连接数
*/
private
DBConnectPool (String name, String URL, String user, String password, int
maxConn) {
this.name = name;
this.URL = URL;
this.user = user;
this.password =
password;
this.maxConn =
maxConn;
//注册数据库JDBC 驱动程序
try {
Driver driver =
(Driver) Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance();
DriverManager.registerDriver(driver);
}
catch
(Exception e) {
return;
}
//创建连接池
try {
for
(int i = 0; i<maxConn; i++) {
Connection conn = newConnection();
//如果连接不空则将给连接加入连接池
if
(conn != null) {
freeConnections.addElement(conn);
}
}
}
catch
(Exception e) {
}
}
/*
* 将不再使用的连接返回给连接池
* @param con 客户程序释放的连接
*/
public
synchronized void freeConnection(Connection con) {
freeConnections.addElement(con);
//将指定连接加入到向量末尾
checkedOut--; //将当前使用连接数减少一个
notifyAll();
}
/*
* 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接
* 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,
* 然后递归调用自己以尝试新的可用连接.
*/
public
synchronized Connection getConnection() {
Connection conn =
null; //先生成一个空的连接
//判断当前连接池的尺寸是不是大于0
if
(freeConnections.size() > 0) {
// 获取向量中第一个可用连接
conn =
(Connection) freeConnections.firstElement();
freeConnections.removeElementAt(0);
try {
if
(conn.isClosed()) {
// 递归调用自己,尝试再次获取可用连接
conn =
getConnection();
}
}
catch
(SQLException e) {
// 递归调用自己,尝试再次获取可用连接
conn = getConnection();
}
}
else if
(maxConn == 0 || checkedOut < maxConn) {
conn =
newConnection();
}
//如果连接不空,则计数器怎加一
if
(conn != null) {
checkedOut++;
}
return
conn;
}
/*
* 从连接池获取可用连接.可以指定客户程序能够等待的最长时间,参见前一个getConnection()方法.
* @param timeout 以毫秒计的等待时间限制
*/
public
synchronized Connection getConnection(long timeout) {
//记录开始时间
long
startTime = new Date().getTime();
Connection conn;
while
((conn = getConnection()) == null) {
try {
wait(timeout);
}
catch
(InterruptedException e) {
}
if
((new Date().getTime() - startTime) >= timeout) {
// wait()返回的原因是超时
return
null;
}
}
return
conn;
}
/*
*获取DBConnectPool 的唯一实例,如果实例为空,则创建一个实例
*/
static
synchronized public DBConnectPool getInstance() {
if
(instance == null) {
instance =
new DBConnectPool("ConnPool","jdbc:as400://9.185.43.193/","chenjh","chenjh",3);
}
return
instance;
}
/*
* 创建新的连接
*/
private
Connection newConnection() {
//先建一个空连接
Connection conn =
null;
try {
//获取一个新的数据库连接
if
(user == null) {
conn =
DriverManager.getConnection(URL);
}
else {
conn =
DriverManager.getConnection(URL, user, password);
}
//取消自动提交
if
(conn != null) {
conn.setAutoCommit(false);
}
}
catch
(SQLException e) {
return
null;
}
return
conn;
}
/*
* 关闭所有连接
*/
public
synchronized void release() {
//提取所有的连接元素到列举数组
Enumeration
allConnections = freeConnections.elements();
while
(allConnections.hasMoreElements()) {
//遍历每一个连接
Connection conn =
(Connection) allConnections.nextElement();
try {
conn.close();
}
catch
(SQLException e) {
}
}
//清空所有的连接
freeConnections.removeAllElements();
}
}
B. DBConnectPool 实现说明
DBConnectPool
是一个数据库连接池的具体实现,其中包括了7 个具体的方法用来构件和撤销数据库连接池
ü DBConnectPool
() 构建数据连接池
ü getInstance()
获取数据库连接池的唯一实例
ü freeConnection()
释放空闲的连接到连接池
ü getConnection()
从连接池中提取空闲的连接
ü getConnection(timeout)
等待指定的时间,从连接池中提取空闲的连接
ü newConnection()
构造连接池的时候新建连接
ü release()
释放数据库连接池
对所有使用连接池的JAVA 程序来说数据库连接池是一个共享的资源,因此所有的JAVA 程序应该使用唯一连接池实例。在DBConnectPool 程序中提供了一个方法getInstance(),供调用连接池的JAVA
程序获取连接池的唯一实例。调用getInstance()时如果连接池实例不存在,则调用DBConnectPool 方法创建一个新的连接池实例,并作为唯一的连接池实例保存。DBConnectPool
方法负责创建新的数据库连接池实例。DBConnectPool 方法被定义为私有的方法,只能够被getInstance 方法调用,这样就保证了连接池的实例是唯一的。在调用DBConnectPool
方法的时候,需要指定数据库连接串URL、用户名、密码、最大的数据库连接数等参数。在DBConnectPool 方法中注册JDBC 驱动程序,同时根据输入的相关参数创建指定数目的数据连接。所有的可用连接对象均登记在名为freeConnections
的向量(Vector)中。
如果向量中有多于一个的连接,getConnection()总是选取第一个。同时,由于新的可用连接总是从尾部加入向量,从而使得数据库连接由于长时间闲置而被关闭的风险减低到最小程度。客户程序可以使用DBConnectionPool
类提供的两个getConnection 方法获取可用连接。两者的共同之处在于:如连接池中存在可用连接,则直接返回,否则创建新的连接并返回。如果没有可用连接且已有连接总数等于最大限制数,第一个方法将直接返回null,而第二个方法将等待直到有可用连接为止。第一个getConnection
方法在返回可用连接给客户程序之前,调用了isClosed()方法验证连接仍旧有效。如果该连接被关闭或触发异常,getConnection()递归地调用自己以尝试获取另外的可用连接。如果在向量freeConnections
中不存在任何可用连接,getConnection()方法检查是否已经指定最大连接数限制。如已经指定,则检查当前连接数是否已经到达极限。此处maxConn 为0
表示没有限制。如果没有指定最大连接数限制或当前连接数小于该值,该方法尝试创建新的连接。如创建成功,则增加已使用连接的计数并返回,否则返回空值。
创建新连接由newConnection()方法实现。创建过程与是否已经指定数据库帐号、密码有关。JDBC
的DriverManager 类提供多个getConnection()方法,这些方法要用到JDBCURL 与其它一些参数,如用户帐号和密码等。DriverManager 将使用指定的JDBCURL 确定适合于目标数据库的驱动程序及建立连接。第二个getConnection()方法需要一个以毫秒为单位的时间参数,该参数表示客户程序能够等待的最长时间。建立连接的具体操作仍旧由第一个getConnection()方法实现。该方法执行时先将startTime
初始化为当前时间。在while 循环中尝试获得一个连接。如果失败,则以给定的时间值为参数调用wait()。wait()的返回可能是由于其它线程调用notify()或notifyAll(),也可能是由于预定时间已到。为找出wait()返回的真正原因,程序用当前时间减开始时间(startTime),如差值大于预定时间则返回空值,否则再次调用getConnection()。把空闲的连接登记到连接池由freeConnection()方法实现,它的参数为返回给连接池的连接对象。该对象被加入到freeConnections
向量的末尾,然后减少已使用连接计数。调用notifyAll()是为了通知其它正在等待可用连接的线程。release()方法供JAVA 程序调用。该方法遍历freeConnections
向量并关闭所有连接,然后从向量中删除这些连接。
5.10.3. JDBC 程序设计优化
A. SQL 语句预处理
在JDBC
中用ExecuteQuery 方法执行一条SQL 语句是通过PreparedStatementàExecute
两个步骤来完成的。如果每次都是用都使用ExecuteQuery 的方法的话,很多的时间都用来做预处理的工作。如果每次执行的SQL 语句操作都是一样的,只是操作的值不一样,则可以人工的执行PreparedStatement
操作,然后再执行Execute语句。减少重复进行的PreparedStatement。“一次Prepared,多次执行”。
BigDecimal bd = new BigDecimal("123456");
PreparedStatement ps
= c.prepareStatement("insert into cujosql.xxx
values(?, ?, ?, ?)");
ps.setInt(1, 99); //设置SQL
语句的参数
ps.setBigDecimal(2,
bd);
ps.setBigDecimal(3,
bd);
ps.setBigDecimal(4,
bd);
ps.executeQuery(); //执行预处理语句
ps.setInt(1,200); //设置SQL
语句的参数
ps.setBigDecimal(2,
bd);
ps.setBigDecimal(3,
bd);
ps.setBigDecimal(4,
bd);
ps.executeQuery(); //执行预处理语句
B. 合理的使用SELECT 语句
在使用SELECT
语句的时候尽量减少使用不确定的模糊查询,尽量精确的表达查询的条件和结果对象。加设一个表有COL1… COLN 个Column,查询需要选取COL1,COL2
作为查询结果。如果使用“SELECT * FROM TABLENAME”进行查询,则数据库会返回所有的Column 作为结果集。而实际被使用的只有COL1 和COL2两个Column 的结果。
建议将查询语句改为精确的查询语句“ SELECT COL1,COL2 FROM TABLENAME”。将模糊的查询结果描述“*”,改变为精确的结果描述“COL1,COL
关于更详细的SQL 性能调整,请参见DB2 SQL Performance Tuning Guide。
C. 块插入功能支持
UDB/400
的JDBC 驱动程序支持块插入功能,支持一次插入多条数据纪录,块插入可以明显的减少插入大量数据消耗的时间和系统资源。并且在随V5R1 提供的JDBC 驱动程序中提供了新的块插入支持语句:”use
block insert=true”。快插入的限制条件:
l 必须是Insert
语句
l 必须使用
PreparedStatement 对Insert 语句进行预处理
l 必须在Insert
语句中描述表的每一个Columns
l 必须对本地系统进行操作
块插入的使用方法参见下面的例子:
// 获取一个数据库连接,并使用新的块插入语句
Connection c = DriverManager.getConnection("jdbc:db2:*local;use block
insert=true");
BigDecimal bd = new BigDecimal("123456");
// 生成一个SQL 预处理语句
PreparedStatement ps
= c.prepareStatement("insert into cujosql.xxx
values(?, ?, ?, ?)");
for
(int i = 1; i <= 10000; i++) {
ps.setInt(1, i); //设置SQL
语句的参数
ps.setBigDecimal(2,
bd);
ps.setBigDecimal(3,
bd);
ps.setBigDecimal(4,
bd);
ps.addBatch(); //将参数加入到Batch
操作中
}
// 执行块插入
int[]
counts = ps.executeBatch();
__