AS06课程资料-HT

更新时间:2024-04-20 09:45:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

RPG Ⅳ基础

Unit 2. Coding Specifications for RPG IV

Symbolic Names and Reserved Words

The valid character set for the RPG IV language consists of:

? The letters A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

? RPG IV accepts lowercase letters in symbolic names but translates them to

uppercase during compilation ? The numbers 0 1 2 3 4 5 6 7 8 9

? The characters + - * , . ' & / $ # : @ _ > < = ( ) % ? The blank character

Note: The $, #, and @ may appear as different symbols on some codepages. For more information, see the iSeries Information Center globalization topic.

Symbolic Names

A symbolic name is a name that uniquely identifies a specific entity in a program or procedure. In the RPG IV language, symbolic names are used for the following:

? Arrays

? Conditional compile names ? Data structure

? Exception output records ? Fields

? Key field lists ? Labels

? Named constants ? Parameter lists ? Prototype names ? Record names ? Subroutines ? Tables

The following rules apply to all symbolic names except for deviations noted in the description of each symbolic name:

? The first character of the name must be alphabetic. This includes the

characters $, #, and @.

? The remaining characters must be alphabetic or numeric. This includes the

underscore (_).

? The name must be left-adjusted in the entry on the specification form except

in fields which allow the name to float (definition specification, keyword fields, and the extended factor 2 field).

? A symbolic name cannot be an RPG IV reserved word.

? A symbolic name can be from 1 to 4096 characters. The practical limits are

determined by the size of the entry used for defining the name. A name that is up to 15 characters can be specified in the Name entry of the definition or procedure specification. For names longer than 15 characters, use a

RPG Ⅳ基础

continuation specification. For more information, see About Specifications. A symbolic name must be unique within the procedure in which it is defined.

?

Array Names

The following additional rule applies to array names:

? An array name in a standalone field cannot begin with the letters TAB. Array

names may begin with TAB if they are either prototyped parameters or data structures defined with the DIM keyword.

Conditional Compile Names

The symbolic names used for conditional compilation have no relationship to other symbolic names. For example, if you define a file called MYFILE, you may later use /DEFINE to define condition name MYFILE, and you may also use /UNDEFINE to remove condition name MYFILE. This has no effect on the file name MYFILE. Conditional compile names can be up to 50 characters long.

Data Structure Names

A data structure is an area in storage and is considered to be a character field.

EXCEPT Names

An EXCEPT name is a symbolic name assigned to an exception output record. The following additional rule applies to EXCEPT names:

? The same EXCEPT name can be assigned to more than one output record.

Field Names

The following additional rules apply to field names:

? A field name can be defined more than once if each definition using that name

has the same data type, the same length, and the same number of decimal positions. All definitions using the same name refer to a single field (that is, the same area in storage). However, it can be defined only once on the definition specification.

? A field can be defined as a data structure subfield only once unless the data

structure is qualified (defined with QUALIFIED or LIKEDS). In this case, when the subfield is used, it must be qualified (specified in the form dsname.subfieldname).

? A subfield name cannot be specified as the result field on an *ENTRY PLIST

parameter.

KLIST Names

A KLIST name is a symbolic name assigned to a list of key fields.

Labels

A label is a symbolic name that identifies a specific location in a program (for example, the name assigned to a TAG or ENDSR operation).

RPG Ⅳ基础

Named Constants

A named constant is a symbolic name assigned to a constant.

PLIST Names

A PLIST name is a symbolic name assigned to a list of parameters.

Prototype Names

A prototype name is a symbolic name assigned to a prototype definition. This name must be used when calling a prototyped procedure or program.

Record Names

A record name is a symbolic name assigned to a record format in an externally described file. The following additional rules apply to record names in an RPG IV program:

? A record name can exist in only one file in the program.

Note: See RENAME(Ext_format:Int_format) for information on how to overcome this limitation.

Subroutine Names

The name is defined in factor 1 of the BEGSR (begin subroutine) operation.

Table Names

The following additional rules apply to table names:

? A table name can contain from 3 to 10 characters. ? A table name must begin with the letters TAB. ? A table cannot be defined in a subprocedure.

RPG IV Words with Special Functions/Reserved Words

The RPG IV reserved words listed below have special functions within a program.

? The following reserved words allow you to access the job date, or a portion

of it, to be used in the program: UDATE *DATE UMONTH *MONTH UYEAR *YEAR UDAY *DAY

? The following reserved words can be used for numbering the pages of a report,

for record sequence numbering, or to sequentially number output fields: PAGE

PAGE1-PAGE7

RPG Ⅳ基础

?

?

?

?

?

?

Figurative constants are implied literals that allow specifications without referring to length: *BLANK/*BLANKS *ZERO/*ZEROS *HIVAL *LOVAL *NULL *ON *OFF

*ALLX'x1..' *ALLG'oK1K2i' *ALL'X..'

The following reserved words are used for positioning database files. *START positions to beginning of file and *END positions to end of file. *END *START

The following reserved words allow RPG IV indicators to be referred to as data: *IN *INxx

The following are special words used with date and time: *CDMY *CMDY *CYMD *DMY *EUR *HMS *ISO *JIS *JOB *JOBRUN *JUL *LONGJUL *MDY *SYS *USA *YMD

The following are special words used with translation: *ALTSEQ *EQUATE *FILE *FTRANS *PLACE allows repetitive placement of fields in an output record. (See *PLACE for more information.)

RPG Ⅳ基础

?

?

?

*ALL allows all fields that are defined for an externally described file to be written on output. (See Rules for Figurative Constants for more information on *ALL)

The following are special words used within expressions: AND NOT OR Note:

NOT can only be used within expressions. It cannot be used as a name anywhere in the source.

The following are special words used with parameter passing: *NOPASS *OMIT *RIGHTADJ *STRING *VARSIZE

User Date Special Words

The user date special words (UDATE, *DATE, UMONTH, *MONTH, UDAY, *DAY, UYEAR, *YEAR) allow the programmer to supply a date for the program at run time. The user date special words access the job date that is specified in the job description. The user dates can be written out at output time; UDATE and *DATE can be written out using the Y edit code in the format specified by the control specification. (For a description of the job date, see theWork Management manual.)

Rules for User Date

Remember the following rules when using the user date:

? UDATE, when specified in positions 30 through 43 of the output specifications,

prints a 6-character numeric date field. *DATE, when similarly specified, prints an 8-character (4-digit year portion) numeric date field. These special words can be used in three different date formats: Month/day/year Year/month/day Day/month/year

Use the DATEDIT keyword on the control specification to specify the date formats of UDATE and *DATE:

DATEDIT *MDY *DMY *YMD UDATE format *DATE format *MDY *DMY *YMD *USA (mmddyyyy) *EUR (ddmmyyyy) *ISO (yyyymmdd) ?

Note that the DATEDIT keyword also controls the format of the Y edit code. If this keyword is not specified, the default is *MDY.

For an interactive job or batch program, the user date special words are set

RPG Ⅳ基础

to the value of the job date when the program starts running in the system. The value of the user date special words are not updated during program processing, even if the program runs past midnight or if the job date is changed. Use the TIME operation code to obtain the time and date while the program is running.

UMONTH, *MONTH, UDAY, *DAY, and UYEAR when specified in positions 30 through 43 of the output specifications, print a 2-position numeric date field. *YEAR can be used to print a 4-position numeric date field. Use UMONTH or *MONTH to print the month only, UDAY or *DAY to print the day only, and UYEAR or *YEAR to print the year only.

UDATE and *DATE can be edited when they are written if the Y edit code is specified in position 44 of the output specifications. The DATEDIT(fmt{separator}) keyword on the control specification determines the format and the separator character to be inserted; for example, 12/31/88, 31.12.88., 12/31/1988.

UMONTH, *MONTH, UDAY, *DAY, UYEAR and *YEAR cannot be edited by the Y edit code in position 44 of the output specifications.

The user date fields cannot be modified. This means they cannot be used:

o In the result field of calculations o As factor 1 of PARM operations

o As the factor 2 index of LOOKUP operations o With blank after in output specifications o As input fields

The user date special words can be used in factor 1 or factor 2 of the calculation specifications for operation codes that use numeric fields. User date fields are not date data type fields but are numeric fields.

?

?

? ?

? ?

PAGE, PAGE1-PAGE7

PAGE is used to number the pages of a report, to serially number the output records in a file, or to sequentially number output fields. It does not cause a page eject. The eight possible PAGE fields (PAGE, PAGE1, PAGE2, PAGE3, PAGE4, PAGE5, PAGE6, and PAGE7) may be needed for numbering different types of output pages or for numbering pages for different printer files.

PAGE fields can be specified in positions 30 through 43 of the output specifications or in the input or calculation specifications.

Rules for PAGE, PAGE1-PAGE7

Remember the following rules when using the PAGE fields:

? When a PAGE field is specified in the output specifications, without being

defined elsewhere, it is assumed to be a four-digit, numeric field with zero decimal positions.

? Page numbering, unless otherwise specified, starts with 0001; and 1 is

automatically added for each new page.

? To start at a page number other than 1, set the value of the PAGE field to

RPG Ⅳ基础

one less than the starting page number. For example, if numbering starts with 24, enter a 23 in the PAGE field. The PAGE field can be of any length but must have zero decimal positions (see Figure 1).

? Page numbering can be restarted at any point in a job. The following methods

can be used to reset the PAGE field:

o Specify blank-after (position 45 of the output specifications). o Specify the PAGE field as the result field of an operation in the

calculation specifications.

o Specify an output indicator in the output field specifications (see

Figure 2). When the output indicator is on, the PAGE field will be reset to 1. Output indicators cannot be used to control the printing of a PAGE field, because a PAGE field is always written.

o Specify the PAGE field as an input field as shown in Figure 1. ? Leading zeros are automatically suppressed (Z edit code is assumed) when a

PAGE field is printed unless an edit code, edit word, or data format (P/B/L/R in position 52) has been specified. Editing and the data format override the suppression of leading zeros. When the PAGE field is defined in input and calculation specifications, it is treated as a field name in the output specifications and zero suppression is not automatic.

Figure 1. Page Record Description

*...1....+....2....+....3....+....4....+....5....+....6....+....7... IFilename++SqNORiPos1+NCCPos2+NCCPos3+NCC................................ I........................Fmt+SPFrom+To+++DcField+++++++++L1M1FrPlMnZr.... IINPUT PG 50 1 CP I 2 5 0PAGE Figure 2. Resetting the PAGE Fields to Zero

*...1....+....2....+....3....+....4....+....5....+....6....+....7... OFilename++DF..N01N02N03Excnam++++B++A++Sb+Sa+........................... O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat O* When indicator 15 is on, the PAGE field is set to zero and 1 is O* added before the field is printed. When indicator 15 is off, 1 O* is added to the contents of the PAGE field before it is printed. OPRINT H L1 01 O 15 PAGE 1 75 F表说明

F(File):定义所有程序使用到的文件。

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++++++++++++++++

RPG Ⅳ基础

FCMU120FM CF E WORKSTN INFDS(FEEDBK)

文件类型 Position 17 (File Type)

I:输入 I 以指示输入文件。 O:输入 O 以指示输出文件。 U:输入 U 以指示更新文件。 C:输入 C 以指示组合(输入 / 输出)文件。

文件指定 Position 18 (File Designation)

空白: 留空此字段以指示输出文件。 P :输入 P 以指示主文件。 S :输入 S 以指示次文件。 R :输入 R 以指示“记录”地址文件。 T :输入 T 以指示数组或表文件。 F :输入 F 以指示全过程文件。

文件添加 Position 20 (File Addition)

空白: 保留字段为空白,以阻止添加记录到输入或更新文件中。对于输出文件,一个 空格相当于一个 A 。 A : 如想在 DISK 文件添加记录,则输入 A 。 如果程序中只有WRITE操作,文件类型用O; 如果程序中有UPDATE、WRITE操作,文件类型用U+A; 如果程序中只有WRITE操作,文件类型用U+A,则编译有20的错误,如果 修改错误级别为21,可通过; 序列 Position 21 (Sequence)

A 或空白: 若匹配字段是依升序排列,输入 A 或使字段保 留为空白。 D: 若匹配字段是依降序排列,输入 D 。

文件格式 Position 22 (File Format) E:输入 E 以表示外部描述文件

F:输入 F 以表示程序描述文件(在I表/O表中描述的)

记录地址类型 Position 34 (Record Address Type)

对于指定为带索引文件或记录地址极限文件的程序描述文件,从下列各项中选择: RAT:空白:用RRN处理文件(按记录顺序),K:按键值处理

空白: 若使用相对记录号以处理文件,或连续读取记录,或记录地址极限文件中的关 键字与要处理的文件中关键字的格式相同,则将该字段留空。 A: 对于字符关键字输入 A 。 D: 对于“日期”关键字输入 D 。 F: 对于浮点数字关键字输入 F 。 G: 对于“图形”关键字字段输入 G 。 K: 对于用于处理文件的关键字值输入 K 。它仅对外部描述文件有效。

RPG Ⅳ基础

P: 对于压缩关键字输入 P 。 T: 对于“时间”关键字输入 T 。 Z: 对于“时间戳记”关键字输入 Z 。

设备 Positions 36-42 (Device)

PRINTER:该文件是一个打印文件。

DISK:这文件是磁盘文件。该文件提供顺序读/写和随机读/写功能。 WORKSTN:该文件是工作站文件。 SPECIAL:这是特别文件。 SEQ:这是顺序组织的文件。

1.顺序和直接存取只用于输入操作 ( Read , Chain ) FCustomer IF E K DISK 2.仅使用Write来增加记录 FCustomer O E K DISK 3.顺序和直接存取用于输入( Read , Chain ) , Update , Delete不包含Write操作 FCustomer UF E K DISK 4.顺序和直接存取用于输入( Read , Chain ) , Update , Delete包含Write操作 FCustomer UF A E K DISK 5.显示文件定义说明 FCustomerD CF E Workstn 6.打印文件定义说明 FCustomerP O E Printer

F表关键字:

BLOCK(*NO | *YES) 输入此关键字,以控制文件记录的分区 (BLOCKing) 。 COMMIT{(rpg 名称 )} 若此文件在委托控制下,则输入 COMMIT 。若要确定在运行时间文件是否在委托控

制下,则指定 rpg 名称。

在程序中用COMMIT和ROLBK命令把对文件的改变放到组中,以使所有的改变一起发

生或均不发生。

DEVID (字段名) 输入 DEVID 以指定包含设备名的字段名。 EXTIND(*INU1-*INU8)

指定此关键字以指示仅当在作业中设置外部指示符时,该文件是用于 OPEN的侯选。 IGNORE (记录格式名 : 记录格式名 :... )

输入要从外部描述文件中忽略的记录格式名。可指定多个记录格式。若要指定

INCLUDE ,则不能指定 IGNORE 。 INCLUDE (记录格式名 : 记录格式名 :... ) 输入要包括的记录格式名。不指定对有 SFILE 关键字的 WORKSTN 文件指定的 记录格式。可指定多个记录格式。若要指定 IGNORE ,则不指定 INCLUDE 。 INDDS (数据结构名) 输入与工作站或打印机文件相关的指示符数据结构的名称。

RPG Ⅳ基础

INFDS (数据结构名) 输入要包含异常/错误信息的数据结构名。

FCMU120FM CF E WORKSTN INFDS(FEEDBK) F INFSR(*PSSR) D*

D FEEDBK DS

D FUNKEY 369 369 C*Input field check

C FUNKEY IFEQ X'F1' C EXSR CHK1 C GOTO DSP C ENDIF

INFSR (子程序名) 输入当发生异常/错误情况时将获得控制的子程序名。 FSARDL11 IF E K DISK INFSR(*PSSR) FSARDL02 UF E K DISK INFSR(*PSSR)

当由该文件引发异常/错误情况出现时,控制交给*PSSR子例程。

MAXDEV(*ONLY|*FILE) 指定 WORKSTN 设备文件的类型。缺省值 *ONLY 指示单个设备文件。输入 *FILE 以检索文件打开时的最大设备数。 OFLIND (指示符) 输入从 *IN01 到 *IN99 之间的数以设置指示符,指示何时在溢出行上打印一 行,或在空格或跳过操作时,何时到达或通过溢出行。 FFONTPR O E PRINTER OFLIND(*IN73) *IN73 = * ON 时,重写表头,换页。

C WRITEDETAIL OF C *INOF IFEQ *ON C WRITEHEADING C ENDIF

PGMNAME (程序名) 输入用户提供的程序名以获得 SPECIAL 文件的控制。 PLIST (参数列表名) 输入对 SPECIAL 文件要传递的参数列表名。 PREFIX (前缀名 {: 被置换的字段符数 } ) 输入要应用于外部描述文件的所有记录中定义的所有字段名的前缀。应用前缀之后

名称的总长度不能超过 14 个字符。在“输入说明”上显式重新命名的字段不受影响。

RECNO (字段名) 为根据相对记录号处理的 DISK 文件或由随机 WRITE 计算参考的输出文件或 与输出说明上的 ADD 一起使用的输出文件,输入相对记录号。 RENAME (外部格式 : 内部格式) 输入要重新命名的记录格式的外部名以及要使用的内部名。该外部名由程序中 此名称置换。

RPG Ⅳ基础

FUCLACFL3 IF E K DISK INFSR(*PSSR)

F RENAME(UCLREC:UCL3) UCLREC为记录格式名。

SAVEDS (数据结构名) 输入为每个设备保存和复原的数据结构名。 SAVEIND (数字) 输入指示符号,以保存从 01 到该号码的指示符。 SFILE (记录格式名 : 字段)

为作为子文件处理的输入字段输入要包含相对记录号的记录格式和字段的名称。 FZZZZDSP CF E WORKSTN

F RRN KSFILE SCRN02 FADC330D CF E WORKSTN

F SFILE(ADC33002:RRN) FUPL3000D CF E WORKSTN SFILE(UPL30001:RRN1) F SFILE(UPL30005:RRN5) 1.SFL的记录格式; 2.RRN的定义,

A SFLSIZ(9999) (0012) A SFLPAG(0012) A RRN 4S 0H

用READC或CHAIN检索到的记录号被放到RRN中。也可用RRN对该文件执行WRITE或 ADD操作。

SLN (名称) 为 WORKSTN 文件输入开始行号 (SLN) 字段的名称。 USROPN

指定此关键字以指示不应执行隐式 OPEN 。该文件必须用 OPEN 操作码显式打开。 FFONTPR O E PRINTER INFSR(*PSSR) F USROPN

D表说明

D(Definition):定义在程序中所使用到的数组、表、数据结构、常量、独立的字段等。 (Arrays,tables,data structures,subfields,constants,standalone fields,and prototypes )

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++ D var10 S 10A INZ('0123456789')

外部的(E) Position 22 (External Description)

空白:若在”名称”字段中指定的项目不是外部描述数据结构,则将此字段留空。 E :若在”名称”字段中指定的项目是外部描述数据结构,则输入 E 。 注:在位置 24 到 25 中的项必须是数据结构的 DS 。

RPG Ⅳ基础

数据结构类型 Data Structure Type

空格:若这不是程序状态或数据区数据结构,则将此字段保留为空白。 S:若这是程序状态数据结构,则输入 S 。 U:若这是数据区数据结构,则输入 U 。

说明类型(Declaration Type) Positions 24-25 (Definition Type)

空白: 若此说明不定义数据结构、常数、独立的字段、数组或表,则将此字段留空。 DS: 若此说明定义数据结构,则输入 DS 。 C: 若此说明定义了常数,则输入 C 。

PI:若此说明定义了过程接口,则输入 PI 。 PR:若此说明定义了调用的原型,则输入 PR 。

S: 若此说明定义了独立的字段、数组或表,则输入 S 。

内部数据类型 Position 40 (Internal Data Type)

空白:对于字符字段、压缩的小数独立字段或区化小数字段的数据结构子字段,将该字段保

留为空白。对于区化或压缩的数据类型,此小数位字段必须是非空白的。 A: 若这是字符字段,则输入 A 。 B: 若这是固定二进制字段,则输入 B 。 D: 若这是日期字段,则输入 D 。 F: 若这是浮点字段,则输入 F 。 G: 若这是图形字符字段,则输入 G 。 I: 若这是带正负号的整数字段,则输入 I 。 N: 若这是指示符字段,则输入 N 。 P: 若这是压缩十进制字段,则输入 P 。 S: 若这是区化字段,则输入 S 。 T: 若这是时间字段,则输入 T 。 U: 若这是无符号的整数字段,则输入 U 。 Z: 若这是时间戳记字段,则输入 Z 。 *: 若这是指针字段,则输入 * 。

1. 字符型 (A)

* DBCS字符包含一个移出和一个移入字符,所以其总字节数要+2; * 初始化值必须加单引号,两单引号间可为空;

D var10 S 10A INZ('0123456789') D var11 S 10A INZ(' ')

D var12 S 7A INZ('O”CLOCK') * 标志位:1)*ON = ‘1’ *OFF = ‘0’ 2)初始值为’0’;

3)RPG IV中有99个标志位;

4)85意味着标志位85为*ON(‘1’)时; N40意味着标志位40为*OFF(‘0’)时; *IN15意味着标志位15为*ON(‘1’)时; * 可变长度字符字段:

RPG Ⅳ基础

VARYING:在任何字符或图形字段定义上指定此关键字,指示该字段可同时具有最大长度

和当前长度。

D var5 S 5A VARYING

D var10 S 10A VARYING INZ('0123456789')

2. 数字型

? 区化型(Zoned-Decimal): (S) 这种类型每个字节包含一个数字(DIGIT);

每个字节分为两部分存储,一部分4位(bit)为1111,另一部分4位为一个二进制数; 最后一个字节的前4位表示符号,F(1111)为正号,D(1101)为负号; 所占字节数 = 数字个数

ZONE DIGIT SIGN

F 1 F 2 F 3 +123 1111 0001 1111 0010 1111 0011

ZONE DIGIT SIGN

F 1 F 2 D 3 -123 1111 0001 1111 0010 1101 1011

? 压缩型(Packed-Decimal): (P)

每个字节两个数字;

最后一个字节的后4位表示符号,F(1111)为正号,D(1101)为负号; 如果为偶数个数字,第一个字节前半字节为0; 小数点位置被忽略;

所占字节数 = 数字个数/2 + 1 (忽略小数) SIGN

1 2 3 F +123 0001 0010 0011 1111 SIGN

0 2 3 D -23 0000 0010 0011 1101 SIGN +1.23

区化型 1 2,3 4,5 ? 28,29 30

压缩型 1 2 3 ? 15 16 1 2 3 F 0001 0010 0011 1111 RPG Ⅳ基础

? 浮点型(Float): (F)

1E1 = 10 1.2e-1 = .12 -1234.9E0 = -1234.9 12e12 = 12000000000000 +67,89E+0003 = 67890 (the comma is the decimal point)

在H表中指定关键字DECEDIT

? 固定二进制型(Binary): (B) ? 带正负号的整数型(Integer): (I) ? 无正负号的整数型(Unsigned): (U)

RPG Ⅳ基础

数据结构:ILE RPG编译器允许你在存储器中定义一个区域,在这个区域中你可以规定字段,声明子字段,存储器中的这个区域叫数据结构(data structure)。你需要在D表的24,25列指定DS来定义一个数据结构。

D表关键字:

OVERLAY (名称 {: 位置 } )

对于数据结构子字段,它指示子字段在‘位置’值覆盖由‘名称’值指定的子字段的存储。位置的默认值为1。

------------------------------------------------------- D DataStruct DS

RPG Ⅳ基础

D A 10 DIM(5) D B 5 OVERLAY(A) D C 5 OVERLAY(A:6)

------------------------------------------------------- D DataStruct DS

D A 5

D B 1 OVERLAY(A) DIM(4) A

B(1) B(2) B(3) B(4)

-------------------------------------------------------

PREFIX (前缀名 {: 被置换的字段符数 } ) 输入应用于外部描述文件的所有记录中定义的所有字段名的前缀。 例如PREFIX(YE:3) 的结果为 'YTDTOTAL' —》 'YETOTAL'

如果{: 被置换的字段符数 }没有被指定,则前缀名被加到字段名前。 例如PREFIX(YE_) 的结果为 'TOTAL' —》 'YE_TOTAL'

如果子字段明确指定EXTFLD关键字,则按EXTFLD关键字指定. D extds1 E DS EXTNAME (CUSTDATA) D PREFIX (CU_)

D Name E INZ ('Joe's Garage') D Custnum E EXTFLD (NUMBER) 子字段为CU_NAME, NUMBER. INZ(自变量)

D FIELD1 S 8 INZ D FIELD2 S 8 INZ(‘BATCH ID ’)

OCCURS (数字常数) 定义多重数据结构的出现次数。

EXTFLD (外部字段名) 指定在外部描述数据结构中要重新命名的字段。

EXTNAME (文件名 {: 格式名 } ) 指定外部描述文件名和任选地用于描述外部描述数据结构的格式名。 DITEMNO 1 8 DCUSTNO 9 16 DQTY 17 20 DCUSTNO DS

D AREA 2 0 D CUSTTYPE 1 D NUMBER 5 0

ALIGN 若要求对带正负号和无符号的整数子字段对齐,则输入此关键字。 ALT (数组名) 指示编译时间或运行时间之前数组或表用替代格式。

RPG Ⅳ基础

ALTSEQ(*NONE) 即使指定替代整理顺序,也可指定正常整理顺序将用于字符比较。此关键字对 字符定义有效。 ASCEND 或 DESCEND ASCEND 指示该数组或表用升序顺序。 DESCEND 指示该数组或表用降序顺序。 BASED(ptr) 指示数据结构、运行时间数组或表或字段定义是以该指针为基础。 CONST (自变量) 指定命名常数的值。 CTDATA 指定数组是编译时间数组。数据要在程序结尾指定,用** 或 **CTDATA(array/table

name)。

D AM S 78 DIM(3) CTDATA PERRCD(1) Ask Message

数据有三个元素,每个元素一条记录。 在程序结尾: ** ASK MESSAGE

Are you sure to save XXX account? Are you sure to post XXX account? Are you sure to exit without save?

----------------------------------------

D TABA S 2 0 DIM(7) CTDATA PERRCD(7) D TAB1 S 4 DIM(7) ALT(TABA)

C DD LOOKUP TABA TAB1 80 在程序结尾: ** TABA - TAB1

01 1st02 2nd03 3rd2121st2222nd2323rd3131st ----------------------------------------

D TABB S 1 DIM(2) CTDATA PERRCD(1) D TAB2 S 6 DIM(2) ALT(TABB)

C RAO@ LOOKUP TABB TAB2 41 ** TABB - TAB2 Retro A/C Type AT-A/C CT-Cash

DATFMT (格式 { 分隔符 } ) 指定日期类型字段的数据格式。 从下列日期格式中选择一个: *MDY (mm/dd/yy) *DMY (dd/mm/yy)

*YMD (yy/mm/dd) *JUL (yy/ddd) *ISO (yyyy-mm-dd) *USA (mm/dd/yyyy)

RPG Ⅳ基础

*EUR (dd.mm.yyyy) *JIS (yyyy-mm-dd) 分隔符是任选的。若指定 & 作为 分隔符 ,则使用空白作为分隔符字符。 DLOANDATE S D DATFMT(*EUR) INZ(D'12 31 92') DDUEDATE S D DATFMT(*ISO)

如果日期类型字段没有指定DATFMT关键字,那么日期类型字段将按H表中DATFMT

关键字所指定的格式和分隔符,如果H表中DATFMT没有被指定,默认为*ISO格式。 DIM (数字常数) 指定数组或表的元素的数目。 DTAARA{( 数据区名 )} 指定与字段、数据结构、数据结构子字段或数据区数据结构相关的外部数据区 的名称。 EXPORT{( 外部名 )}

指示在此模块中分配用于字段的存储量,同时任选地指定调出变量的外部名称。 EXTFMT (数据类型) 选择下列其中一个外部数据类型值: B 二进制 F 浮点 I 整数 L 数字符号在左边 P 压缩的十进制 R 数字符号在右边 S 区位数字 U 无符号 EXTPGM (名称) 在原型定义上输入此关键字,以指示动态约束程序的外部名称。 EXTPROC (名称) 在原型定义上输入此关键字,以指示静态约束过程的外部名称。 FROMFILE (文件名) 指定要从中读取运行时间之前数组或表的文件名。 IMPORT{( 外部名 )}

指示在另一模块中分配用于字段的存储量,同时任选地指定调入变量的外部名称。 LIKE ( like 名称) 指定项目的属性是由 'like_name' 派生的。 D Name S 20

D Long_name S LIKE(Name) D Name1 S 20 D Long_name1 S +5 LIKE(Name1)

D Name2 S 10 0 INZ D Long_name2 S -5 LIKE(Name2)

Long_name为20位, Long_name1为25位, Long_name3为5位,

NOOPT 使用此关键字,以确保字段或结构的内容包含最新指定的值。 OPDESC

RPG Ⅳ基础

在原型定义上输入此关键字,以指示与参数一起传送的运算描述符。 OPTIONS(*NOPASS *OMIT *VARSIZE *STRING) 在参数定义上输入此关键字。 *NOPASS 指示不必传送该参数。 *OMIT 意指可传送特殊值 *OMIT 。可对同一参数指定 *OMIT 和 *NOPASS 。 *VARSIZE 指示程序可通过引用接收传送的字符、图形或数组参数,它们小于 对参数定义的长度。 *STRING 意指您可在期待基指针的地方传送字符串。当指针参数是具有 OPTIONS(*STRING) 的原型时,则指针或字符表达式可指定为传送的参数。若 指定字符表达式,则编译器将表达式的值复制成临时指针,并且在结尾处添加 空结束符。然后它将传送此临时指针的地址到调用的过程。 PACKEVEN 输入此关键字以指示压缩字段或压缩数组的元素有偶数个数字。 PACKEVEN 关键字只对程序描述数据结构子字段有效,其中 FROM/TO 位置用于定义该 字段。 PERRCD (数字常数) 为编译时间或运行时间之前数组或表指定每个记录的元素数目。 PROCPTR 定义指针为过程指针。 STATIC 在子过程的 D 说明中输入此关键字,以指示有独立字段或数据结构存储在静 态存储器中。 TIMFMT (格式 { 分隔符 } ) 为时间类型字段指定时间格式。 从下列时间格式中选择一个: *HMS (hh:mm:ss) *ISO (hh.mm.ss) *USA (hh:mm AM 或 hh:mm PM) *EUR (hh.mm.ss) *JIS (hh:mm:ss)

分隔符是任选的。若指定 & 作为 分隔符 ,则使用空白作为分隔符字符。 VALUE 在参数定义上输入此关键字,以指示参数由值传送。 TOFILE (文件名) 为向其写入数据的运行时间之前或编译时间数组或表指定文件。 VARYING 在任何字符或图形字段定义上指定此关键字,指示该字段可同时具有最大长度 和当前长度。

例:

D*Local data area

D LDAREA UDS 1024 D LDFRM1 1 10 D LDFRM2 11 20

RPG Ⅳ基础

D LDTO 21 30 D LDEND 31 31 D LDKEY 32 32 D LDDEP 33 34 D LRTTYNO 45 54 C*Initialize

C *DTAARA DEFINE *LDA LDAREA C IN *DTAARA

C MOVEL LDDEP DEPNO C :

C MOVEL '0' LDEND C OUT *DTAARA

---------------------------------------------------------------------- D SDS SDS

D PGM *PROC

D MSGTXT 91 170 D USER 254 263

---------------------------------------------------------------------- D WKDATE DS 10 D WKDAY 1 2 0 D WKMON 4 5 0 D WKYEAR 7 10 0

基本数据结构

******数据结构定义时用真实的位置和长度****** 真实的位置标号: D FRED DS

D Field1 1 700 DIM(70) D Field2 701 730 D Field3 701 715 D Field5 701 704 2 D Field4 716 730 长度标号:

D FRED DS

D Field1 10 DIM(70) D Field2 30

D Field3 15 OVERLAY(Field2) D Field5 4 2 OVERLAY(Field3) D Field4 15 OVERLAY(Field2:16) 功能相同,后者可读性好。

------------------------------------------------------- ******重命名和初始化外部描述数据结构******

D Fred E DS EXTNAME(EXTDS)

D CUSTNAME E EXTFLD(CUST) INZ('GEORGE')

RPG Ⅳ基础

D PRICE E INZ(1234.89) D ITMARR E DIM(10) 用内部名FRED定义一个外部描述数据结构EXTDS。

-------------------------------------------------------

数据区域:

CRTDTAARA DTAARA(TOTDTA) TYPE (*DEC) LEN(28 0) 数据区域TOTDTA在RPG程序中使用之前要预先创建;

DTAARA{( 数据区名 )}

指定与字段、数据结构、数据结构子字段或数据区数据结构相关的外部数据区的名称。 D LDAREA UDS

如果不指定,则默认为*LDA, (U: 若这是数据区数据结构,则输入 U) 。

方法一:

DTOTALS DS DTAARA(TOTDTA) D TOT_AMOUNT 8 2 D TOT_GROSS 10 2 D TOT_NET 10 2 方法二:

C *DTAARA DEFINE TOTDTA TOTALS *DTAARA DEFINE和关键字DTAARA有相同的功能.

当*DTAARA DEFINE或关键字DTAARA被指定,才能对数据区使用IN,OUT,UNLOCK命令. IN (检索数据区): OUT (写入数据区):

UNLOCK (解除锁定数据区或释放记录):

当IN,OUT或UNLOCK中Factor 2为*DTAARA时,表示程序中定义的数据区被检索或写出或解锁.

------------------------------------------------------------------------ C *LOCK IN *DTAARA

C ADD AMOUNT TOTAMT C ADD GROSS TOTGRS C ADD NET TOTNET ......

C OUT *DTAARA C UNLOCK *DTAARA

C *DTAARA DEFINE TOTAMT 8 2 C *DTAARA DEFINE TOTGRS 10 2 C *DTAARA DEFINE TOTNET 10 2

------------------------------------------------------------------------

*LDA:由系统自动为每个作业创建和删除的数据区,1024个字符. D*Local data area

D LDAREA UDS 1024 D LDFRM1 1 10

RPG Ⅳ基础

D LDFRM2 11 20 D LDTO 21 30 D LDEND 31 31 D LDKEY 32 32 D LDDEP 33 34 D LRTTYNO 45 54 C*Initialize

C *DTAARA DEFINE *LDA LDAREA C IN *DTAARA

C MOVEL LDDEP DEPNO C :

C MOVEL '0' LDEND C OUT *DTAARA

----------------------------------------------------------------------

*LIKE DEFINE 的用法

*LIKE DEFINE 被参考字段 需定义字段 定义一个字段基于另一个字段的属性(长度和小数点位置). 可以在64到68位(field length)处输入一个值: ’+’号代表result field比factor 2 长度increase ’-’号代表result field比factor 2 长度decrease.

如果64到68位为空,则代表result field比factor 2 长度相同.

------------------------------------------------------------------------------------------------ FLDA:7位字符 FLDB: (5 2)

C *LIKE DEFINE FLDA FLDP

C *LIKE DEFINE FLDA FLDQ +2 C *LIKE DEFINE FLDA FLDR - 1 C *LIKE DEFINE FLDB FLDS

C *LIKE DEFINE FLDB FLDT +1 C *LIKE DEFINE FLDB FLDU - 2 C *LIKE DEFINE FLDU FLDX ( FLDP:7 FLDQ:9 FLDR:6

FLDS: (5 2) FLDT: (6 2) FLDU: (3 2) FLDX: (3 2)

Unit 4. Manipulating Data in Calculations

EVAL的用法 FIELD1 = 10 FIELD2 = 9 FIELD3 = 8 FIELD4 = 7

RPG Ⅳ基础

*IN01 = *ON

A = 'abcdefghijklmno' (15位) CHARFIELD1 = 'There' (5位) ARR is defined with DIM(10)

C EVAL RESULT=FIELD1 + FIELD2+(FIELD3-FIELD4) RESULT=20

C EVAL *IN03 = *IN01 OR (FIELD2 > FIELD3) *IN03= *ON

C EVAL A = 'Hello ' + CHARFIELD1 A = 'Hello There ' (左对齐赋值,再填补空格)

C EVAL %SUBST(A:3:4) = '****' A = 'ab****ghijklmno'

C EVAL ARR(*) = FIELD2 * FIELD3 ARR数组的每个元素的值为72

操作扩充符

C 123.456 MULT(H) 10 RESULT3 在操作码之后的括号中指定操作扩充符。扩充符可立即跟在操作码之后或可由一个或多个空格分隔。括号之间可能指定多个 opcode 扩展器。

选择下列其中一个扩充符值:

空白: 若不执行舍入、不带锁定读取或结果字段填充或若不支持扩充符,则将字段留空。 (D): 输入 (D) 以发送 CALLB 上字符类型字段的操作描述符给接收过程。对于应用 于日期的其它操作输入 D 。 (E): 输入 (E) 表示发生错误处理。若指定了 E 扩充符,则不允许错误指示符。 (H): 若要执行舍入,则输入 (H) 。

(M): 若将应用位数规则的最大数,则输入 (M) 。

(N): 若不带锁定读取该记录,则输入 (N) 。对于其他操作,若 DEALLOC 操作将结果字段

设置为空,则输入 (N) 。

(P): 若结果字段以空白填充,则输入 (P) 。

(R): 若要应用结果小数位规则,则输入 (R) :将计算小数中间值的精度,以便小数位数的

减少不超过分配结果的小数位数。

(T): 若该操作应用于时间,则输入 (T) 。 (Z): 若该操作应用于时间戳记,则输入 (Z) 。

MULT的用法

D RESULT1 S 5P 1 D RESULT2 S 5P 1 D RESULT3 S 5P 2 D RESULT4 S 7P 2

C 123.456 MULT 10 RESULT1 ( EVAL RESULT1 = 123.456 *10) RESULT1=1234.5 小数点左边满足,右边第二位被截去

C 123.456 MULT(H) 10 RESULT2

( EVAL(H) RESULT1 = 123.456 *10)

RPG Ⅳ基础

RESULT2=1234.6 小数点左边满足,右边第二位被四舍五入 C 123.456 MULT(H) 10 RESULT3

RESULT3=234.56 小数点左边不满足, 被截去最左边一位,右边满足(数字溢出) C 1234.56789 MULT 100 RESULT4 如果编译时指定TRUNCNBR(*YES)

RESULT4=23456.78 小数点左边不满足, 被截去最左边一位, 右边第三位被截去(数字溢出). 截段数字 (TRUNCNBR) 指定在运行程序时出现数字上溢的情况下,截断值是否移至结果字段,或者是否产生错误。 注: TRUNCNBR 任选项不应用于表达式中执行的计算。(在扩充因子2 字段中寻找表达式。)若这些计算出现上溢,则将总是出现错误。 *YES:忽略数字上溢,并将截断值移至结果字段。 *NO:当检测到数字溢出时,生成运行期错误。

CAT(并置两个字符串)

Code Factor 1 Factor 2 Result Field CAT (P) 字符串1 字符串2:空格数 目标字符串 C MOVE 'RPG ' NAME 5 C MOVE 'IV ' LAST 5 C Z-ADD 0 NUM 1 0 C NAME CAT(P) LAST:NUM TEMP 10 TEMP:‘RPGIV ’(NUM为0,截去字符串1后的空格)

SCAN(扫描字符串)

Code Factor 1 Factor 2 Result Field Indicators SCAN (E) 字符串:长度 字符串:开始位置 最左边的位置 标志位 扫描Factor 2中字符串是否包含有Factor 1中的字符串.

------------------------------------------------------------------------------- C 'ABC' SCAN 'XCABCD' RESULT - - - - 90 RESULT中为3,因为字符串找到,所以*IN90=*ON .

C MOVE 'YARRYY' FIELD1 6 C MOVE 'Y' FIELD2 1

C FIELD2 SCAN FIELD1:3 ARRAY 90 数组ARRAY的1,2元素为5,6, *IN90=*ON.

C MOVE 'TESTING' FIELD1 7 C Z-ADD 2 X 1 0 C MOVEL 'TOOL' FIELD2 5

C FIELD2:4 SCAN FIELD1:X INT90 20 90 FIELD2:4取4位,为'TOOL', 因为字符串没找到,所以*IN90=*OFF . C SrchName SCAN Line C IF %FOUND C EXSR HandleLine C ENDIF

如果在Line中扫描到SrchName, %FOUND返回’1’,继续执行HandleLine.

RPG Ⅳ基础

-------------------------------------------------------------------------------------

%SCAN (扫描字符位置)

%SCAN(搜索字符:源字符:开始位置)

-------------------------------------------------------------------------------------

D source S 15A inz('Dr. Doolittle') D pos S 5U 0

C EVAL pos = %scan('oo' : source) POS=6 C EVAL pos = %scan('D' : source : 2) POS=5 C EVAL pos = %scan('abc' : source) POS=0 C EVAL pos = %scan('Dr.' : source : 2) POS=0

-------------------------------------------------------------------------------------

CHECK(检查字符) (由左到右检查)

Code Factor 1 Factor 2 Result Field Indicators

CHECK (E) 比较字符串 被比较字符串:开始位置 左起位置 - - ER FD

CHECKR(检查反向) (由右到左检查)

Code Factor 1 Factor 2 Result Field Indicators

CHECK (E) 比较字符串 被比较字符串:开始位置 右起位置 - - ER FD

SUBST(子字符串)

Code Factor 1 Factor 2 Result Field Indicators SUBST 截取的长度 源字符串:开始位置 目标字符串 标志位(ER) C Z-ADD 3 T 2 0 C MOVEL 'ABCDEF' String 10

C 2 SUBST String:T Target - - 90 - - TARGET=‘CD’,*IN90 = *OFF(没有错误发生)

------------------------------------------------------------------------------ C MOVE 'ABCDEF' String 6 C Z-ADD 4 T 1 0 C 5 SUBST String:T Result 90 Result没变化,*IN90 = *ON

------------------------------------------------------------------------------ C ' ' SCAN City C C ADD 1 C

C SUBST City:C TCntre

CITY='Toronto, Ontario',C=9,Tcntre= 'Ontario' (Factor 1为空,将截取Tcntre的长

RPG Ⅳ基础

度)

------------------------------------------------------------------------------ C ' ' CHECK STRING ST 10 C 10 SUBST(P) STRING:ST RESULT

STRING=' HELLO ',如果不为‘ ’的字符存在,则*IN10= *ON,RESULT='HELLO '

%SUBST(获取字符串)

%SUBST(字符串:开始位置:长度)

%TRIM(清理字符串两边空格) %TRIML(清理字符串打头空格) %TRIMR(清理字符串跟随空格)

C MOVE(P) 'Chris' FIRSTNAME 10 C MOVE(P) 'Smith' LASTNAME 10 C EVAL NAME =

C %TRIM(FIRSTNAME) +' '+ %TRIM(LASTNAME) NAME='Chris Smith',(以上一句也可写为: C EVAL NAME =

C %TRIMR(FIRSTNAME) +' '+ %TRIMR(LASTNAME))

Unit 5. Printing From an RPG IV Program

PRTF-DDS打印文件关键字(主要)

0001.02 A PTTMNU 8S 0O 17 数据类型/键盘换档 对打印机文件而言,选择下列其中一项 : A 输入 A 以指示“字符”数据类型。 S 输入 S 以指示“区化十进制”数据类型。 F 输入 F 以指示“浮点”数据类型。 O 输入 O 以指示“开放式 DBCS ”数据类型。 G 输入 G 以指示“图形 DBCS ”数据。 使用

对于打印机文件而言,输入 O 或保存字段空白以指示仅供输出使用的字段。 位置定位 对非 AFPDS 打印机文件而言,请输入一个介于 1 至255 之间的值,以指示该页上字段的开始位置。对AFPDS 打印机文件而言,请输入一个介于 0.00 至57.79 之间的值,以指示

RPG Ⅳ基础

该页上的位置。

ALIAS:提供字段的替代名称。

00070A FIELDA 25A 1 2ALIAS(CUSTOMERNAME)

CHRID:指示使用替代字符集打印该字段。

CHRSIZ:扩展记录或字段中字符的宽度或高度。

CHRSIZ仅对IPDS打印机和 printer files with device type 为*IPDS或*AFPDS的有效. A TIT002 40A O 14

A SPACEB(002) * CHRSIZ(2.0 2.0)

CPI: 指定每英寸字符数。 00010A R RECORD1

00020A 02 CPI(15) 00030A FLD1 20 3 1 00040A FLD2 5 0 +2

00050A R RECORD2 SPACEB(1) 00060A FLD3 1 如果*IN02 = *ON ,每英寸15个字符;

如果*IN02 = *OFF,由CRTPRTF, CHGPRTF, 或OVRPRTF中指定的CPI参数决定。

DATE(*SYS):显示当前系统日期。 A R REC01

A 1 56

A DATE A 21 2 56

A DATE(*JOB *Y) A 22 2 56

A DATE EDTCDE(Y) A 23 2 56

A DATE(*JOB) EDTCDE(Y) A 24 2 56

A DATE(*SYS) A 25 2 56

A DATE(*SYS *YY) EDTCDE(Y) *JOB:显示当前作业日期 *Y:两位年,*YY:四位年

EDTCDE(Y):加入分隔符(mm/dd/yy)

DFT:打印常数字符或十六进制值。

00050A 7 9DFT('ON') 00060A 8 9'ON'

RPG Ⅳ基础

上两行意义相同

EDTCDE:指定编辑码以编辑数字字段。

00010A QWR 6 0 5 2EDTCDE(Y) QWE=111795,打印为11/17/95。

00010A ERT 8 2 5 2EDTCDE(1 $) ERT=00150000,打印为$1,500.00。

00010A YHN 7 2 5 2EDTCDE(J *) YHN=PACKED ‘0000250D’,打印为***25.00-。 (Y):在月、日之间加‘/’,并禁止最右边的0; (Z):去掉+、-号,且禁止前导0;

(X):转换有符号变量为无符号变量,不禁止前导0。

EDTWRD:提供编辑字以编辑数字字段。

00010A CRY 11 8 5 2EDTWRD(' 0 . %') CRY=12.34567891%(打印值) ('B0B.BBBBBBBB%')

00010A DER 13 2 5 2EDTWRD(' , , , 0 , -') DER=12,345,678,912.34-(打印值) ('BB,BBB,BBB,B0B.BB-') 00010A WDE 8 0 5 2EDTWRD('0 ') WDE=567,打印为00000567(补齐左边的0)

00010A OKM 9 0 5 2EDTWRD('0 - - ') OKM=123456789,打印值为123-45-6789

A FMDATE 8Y 0O 1 70EDTWRD('0 / / ') FMDATE= 1031999, 打印值为01/03/1999

FONT:指定用来打印记录或字段的字体。

00100A FLD4 6S 20 01FONT(4919) 00080A FLD3 6A 16 01

如果没有指定FONT,由CRTPRTF, CHGPRTF, 或OVRPRTF中指定的FONT参数决定。

HIGHLIGHT:以粗体字母打印字段。

A 4 01'AAAAAAAAAAA' A 02N90 HIGHLIGHT

LINE:打印水平行或垂直行。 LINE((纸边)向下位置 (纸边)向内位置 线长 线的方向 线宽 线PAD) 线的方向:*HRZ(水平)、*VRT(垂直)

line-pad:*HRZ(水平)方向:*TOP 、*BOT *VRT(垂直)方向:*LEFT 、*RIGHT

A R REC1 LINE(1.5 3.0 4.25 *HRZ 0.2 *TOP)

LPI:指定每英寸行数。 LPI( 4 | 6 | 8 | 9 | 12)

如果知道页的长度,就可确定行数;

RPG Ⅳ基础

如果没有指定LPI,由CRTPRTF, CHGPRTF, 或OVRPRTF中指定的LPI参数决定。

MSGCON:从指定的信息中复制常数字段之值。

MSGCON(长度 message-ID 库名/ message-file名) 00010A R RECORD1

00020A 2 1MSGCON(10 MSG0001 MESSAGES/MSGF)

OVERLAY:打印覆盖。

OVERLAY(库名/覆盖字段 (纸边)向下位置 (纸边)向内位置) A R REC1 OVERLAY(MYLIB/OVL04 1.234 14.62)

PAGNBR:打印页号。

00100A R RECORD

00110A 1 60'PAGE:' 00120A +1PAGNBR

POSITION:定义该页上命名字段的位置。

POSITION((纸边)向下位置 (纸边)向内位置)(英寸) A R REC1

A FLD1 6S 2 POSITION(2.0 1.983)

REF:提供包含引用字段的文件名称。

00010A REF(LIB1/FILE1 RECORD2) 00020A R RECORD

00030A FLD1 R 2 2

REFFLD:自引用字段复制字段说明。

00060A ITEM4 R 32REFFLD(ITEM LIBY/FILEX)

SKIPA:打印之后,请跳至指定的行号。

00011A FIELDA 132A 1SKIPA(12) 打印之后跳至12行

SKIPB:打印之前,请跳至指定的行号。 A R HEADER

A SKIPB(002) 打印之前跳至(下一页)第一行.(一般定义在表头)

SPACEA:打印之后,请空出指定的行数。

SPACEB:打印之前,请空出指定的行数。

TEXT:指供记录或字段之说明。

00010A R CUSMST TEXT('Customer Master Record'

RPG Ⅳ基础

00020A FLD1 3 0 TEXT('ORDER NUMBER FIELD')

TIME:打印当前的系统时间。

UNDERLINE:指示在该字段底下画线。

00100A ALLOC R 17 11

00101A 03 04 UNDERLINE

Edit Code No CR -Sign -Sign Description Sign Sign (R) (L) Commas and zero balances 1 A J N Commas 2 B K O Zero balances 3 C L P No commas or zero balances 4 D M Q User-defined edit codes 5-9 Date edit (4 digits) W Date edit Y

Suppress leading zeros Z

编辑代码描述 无符号 CR 符号 - 符号 (R) - 符号 (L)

逗号和零平衡 1 A J(I) N 逗号 2 B K O 零平衡 3 C L P 没有逗号或零平衡 4 D M Q 用户定义编辑代码 5-9 日期字段编辑 W

日期编辑 Y(在月,日之间加入/,抑制最左边的零) 抑制前导零 Z

Unit 6. Using the Debugger

调试命令:

ATTR:显示变量的属性(attribute):包括类型(TYPE)和长度(LENGTH) > ATTR VAL

TYPE = ZONED(3,2), LENGTH = 3 BYTES (TYPE可为INTEGER,BINARY, CARDINAL, ARRAY, FIXED LENGTH STRING, RECORD, PTR, CHAR,ZONED)

BREAK:设置断点 (或用F13 (Work with module breakpoints)). > BREAK 40

RPG Ⅳ基础

> BREAK 40 WHEN *IN02=1 > BREAK 40 WHEN DATA1=100

CLEAR:清除断点 > CLEAR 40

> CLEAR PGM (清除程序断点)

EQUATE:分配给表达式、变量、调试命令一个短的命名。 > EQUATE EP EVAL (Itemprice*qtyord) (表达式) 键入EP(相当于EVAL (Itemprice*qtyord)),将返回Itemprice*qtyord的值。 > EQUATE EP(Itemprice*qtyord)

键入 EVAL EP,将返回Itemprice*qtyord的值。

DISPLAY EQUATE:显示使用了EQUATE的缩写。

EVAL:显示或修改变量的值。(evaluate)(变量、表达式、记录、数据结果或数组) 用EVAL修改变量的值,要注意被修改变量本身的定义。 > EVAL String (6 characters) STRING = '123456'

> EVAL TableA (3 characters) TABLEA = 'aaa' > EVAL String=TableA

STRING=TABLEA = 'aaa ' > EVAL LastName='Williamson'

LASTNAME='Williamson' = 'Williamson' > EVAL String = %SUBSTR(Lastname 1 8)

STRING = %SUBSTR(LASTNAME 1 8) = 'Willia' (STRING定义为6位) Displaying the Contents of an Array

> EVAL Arry 3S 2 DIM(2) INZ(1.23) ARRY(1) = 1.23 ARRY(2) = 1.23 > EVAL Arry(2) ARRY(2) = 1.23 > EVAL Arry(1..2) ARRY(1) = 1.23 ARRY(2) = 1.23

Displaying Data Structures > EVAL DS3

SET:修改调试选项,例如:the ability to update production files、指定FIND操作是否区分大小写等。

STEP:在调试期间执行一句或多句程序。

RPG Ⅳ基础

FIND:查找指定的行号、字符串或文本。

UPx、DOWNx:上移或下移x行。

LEFTn、RIGHTn:左移或右移n列。

TOP、BOTTOM:移到头部或尾部。

NEXT、PREVIOUS:移到下一处或上一处断点。

HELP:获得调试命令的帮助信息。

跟踪被当前程序调用的程序

在DEBUG 过程中,有时我们希望当前程序在CALL 另一个程序时,还可以跟踪被CALL的程序,比如说当前跟踪的程序是DEBUG#1,DEBUG#1 中CALL 了DEBUG#2,我们跟踪到DEBUG#1 中,运行了一部分代码,现在想看看DEBUG#2 被调用时,是如何运行,这时我们可以通过如下操作来增加跟踪调试的程序:

一、SHIFT+F2(F14),出现如下画面:

Opt Program/module Library Type *LIBL *PGM DEBUG#1 AS06V3LIB *PGM DEBUG#1 *MODULE Selected

二、增加程序

在光标所指向的第一行,OPT 项输入1(即表示增加跟踪的模块),Program/module 项 输入DEBUG#2,然后确认,画面将会变成:

Opt Program/module Library Type DEBUG#2 AS06V3LIB *PGM DEBUG#2 AS06V3LIB *PGM DEBUG#2 *MODULE DEBUG#1 AS06V3LIB *PGM DEBUG#1 *MODULE Selected

三、进入增加的程序

在第三行,也就是DEBUG#2 MODULE这一行,选择“5”,就进入了程序DEBUG#2 中。

四、跟踪调试程序DEBUG#2

进入程序DEBUG#2 之后,仍然是设置断点

接下来按F10,或F12,系统执行到程序DEBUG#1 中的“CALL ‘DEBUG#2’”的语句时,就会进行我们设置的程序DEBUG#2 的断点处。

当程序DEBUG#2 执行完毕之后,程序还会退回到最开始我们DEBUG 的程序中,也即是

RPG Ⅳ基础

DEBUG#1 中。

补充说明:

以上的跟踪被当前程序所调用的程序,仅限于两个程序都是RPGLE 程序。 一定要退出DEBUG 模式

当我们结束DEBUG 调试之后,必须输入“ENDDBG”用来结束DEBUG 调试模式。否则无法进行下次DEBUG 操作,而且可能会带来一些不可预知的错误。

跟踪批处理程序

1。以HOLD(*YES)参数提交JOB到QBATCH JOB中,让JOB暂时挂起; 2。使用WRKSBMJOB查看所提交的JOB的以下3个参数值: *Job id 、*User Name 、*Job Number

3。执行STRSRVJOB,填入第2步骤获得的3个参数进行QBATCH JOB服务过程; 4。执行STRDBG开始DEBUG;

5。利用F21键切换到命令行,在命令行执行WRKSBMJOB,使用6=Release释放挂起的第1步骤提交的JOB,然后系统允许你按F10输入DEBUG命令(注意:不要键入执行,否则在设立断点之前键入执行,程序就会运行,因而无法进行debug断点设置);

6。在OS/400命令行窗口;执行DSPMODSRC后,可通过F6设置断点;然后按F3退出,再按F12退出命令行; 7。键入执行释放挂起的JOB;程序将在断点中停留;可以使用交互式DEBUG使用DEBUG命令进行处理;

8。一旦程序或者JOB结束,使用ENDDBG和ENDSRVJOB结束操作。 补充:

如果在批处理作业的RPGIV 程序中出现交互语句,如:DSPLY;显示文件输入输出语句程序的调用,如:EXFMT,作业将会被挂起处于MESSAGE WAIT 状态,这是因为批处理作业无法处理显示信息而引起的。

常见的出错信息

1 编译程序时的出错信息

一、进入编译后的脱机文件中

在编译程序时如果出错,在命令行执行“WRKSPLF”,然后用SHIFT+F6(F18)去到最末尾,可以看到名称为“程序名”的脱机文件(SPOOL FILE),用5 进入,查看出错信息。 File . . . . . : DEBUG#2 Page/Line 1/1 Control . . . . . Columns 1 - 75 Find . . . . . .

二、了解当前编译的错误信息的类型、数量

如上例,即假设程序DEBUG#2编译时出错,进入到编译后的脱机文件中,先在“Control”处,填“B”,确认,到最末尾,可看到类似于这样的信息: F i n a l S u m m a r y Message Totals:

RPG Ⅳ基础

Information (00) . . . . . . . : 1 Warning (10) . . . . . . . : 0 Error (20) . . . . . . . : 0

Severe Error (30+) . . . . . . : 2

--------------------------------- ------- Total . . . . . . . . . . . . . : 3

这就表示当前程序编译之后,有2 个30 级的错误,1 个00 级的错误,总共有3 个错误。 00 级的错误仅是信息级别(Information),可以不理会; 10 级的错误是警告,也可以不理会;

20、30 级别的错误就是正式的错误,也就是不解决它们,程序就无法编译通过

除此之外,还有40 级,以及传说中50 级的错误。40 级的错误通常是程序中声明的文件不存在;50 级的我没见过,只是有人吹嘘他曾经写出过,表示他的RP 与众不同。 总之,级别越大,就表示错误的问题越严重,所以排错的顺序,是先大后小。即先排除40 级错误,再来查30 级错误,然后才是20 级。

举个例子,如果在写代码时,将声明的文件名写错,那么30 级错误可能会有上百个,凡是涉及到与该文件中字段有关的语句,肯定都会报错;此时排除40 级错误(文件名声明错误)之后,会发现30 级错误将会大减少。 所以说,排错顺序是先大后小。

三、查找出错信息对应的代码行

脱机文件的最后一页,是错误的汇总信息,向上翻页,查看具体错误信息,仍是上例: M e s s a g e S u m m a r y Msg id Sv Number Message text

*RNF7086 00 1 RPG handles blocking for the file. INFDS is updated only blocks of data are transferred.

*RNF7030 30 1 The name or indicator is not defined.

*RNF7515 30 1 The move operation has operands that are not compatible. * * * * * E N D O F M E S S A G E S U M M A R Y * * * * * 5722WDS V5R1M0 010525 RN IBM ILE RPG FHSLIB/FHS02R 注意看,这里有两个30 级错误,RNF7030,RNF7515。

以7030 为例,在“Find”处,输入7030,然后SHIFT+F4(F16)查找(也就是在脱机文件中查找7030),多找几下,就可以看到具体的错误信息: Msg id Sv Number Seq Message text

*RNF7030 30 12 000009 The name or indicator FHS20 is not defined. 可以很清楚地看到,就是说代码第12 行,字段“FHS20”没有定义。

这里,Number 项的值,就表示代码行数。当然,这个代码并不是我们源代码中的行数, 而是指编译之后的执行代码中的行数。可以从脱机文件中的程序代码处从头开始看起,如: 12 C MOVE ‘ABCD’ FHS20

这个最左边的12,就表示这是代码执行的第12 行。

当我们查看到是错误行的语句之后,就可以回到源代码中,按图索骥地找到错误的代码,然后修正它。

系统对于错误的提示很准,不用怀疑。(与C 不同,C 编译后,只是说疑似某行出错) 再一次提起要注意,系统提示的,是系统编译时的代码行行数,不是我们自已写的源代码的行数,要注意比对。Number 项标识错误的代码行行数

RPG Ⅳ基础

四、常见编译出错信息: RNF2120:声明的文件不存在

RNF7030:变量未定义,通常随着如果变量未定义,那么与该变量有关的每一句话,都会报错,并且除了7030 之外,还会有诸如类型不匹配这些的错误,所以排错时,一般都是先修改7030 的错误。

RNF5177:使用了DO、FOR、DOW、IF、SELECT 语句时,漏写了相应的END 语句

运行时的出错信息

CPF4328:对声明的文件使用了COMMIT 关键字,但该文件未加入到日志文件中 CPF4131:文件重新编译过,但之后未重新编译该程序

CPF128:这个比较麻烦,好像是说PF 文件damage(被破坏)。似乎只能恢复PF 文件,或者是重新编译。

Decimal Error:通常是给数值型变量赋值时,超长溢出

Attempt to write a duplicate record to file:试图向文件中写入重复键值

Unit 8. Accessing the DB2 Database Using RPG IV

物理文件和逻辑文件的DDS格式: 列 顺序号 格式类型 注释标记 不使用 位置 1-5 6 7 8-16 注释 A或空白 * 表示本行为注释行 以下对PF有效: R:“记录格式名称” 空白字符:保存字段空白以指示“字段名称” K:“关键字段名称” Note: 物理文件只能指定一个记录格式 以下对LF有效: 空白字符:保存字段空白指示“字段名称”或为AND 的条件 R:“记录格式名称” K:“关键字段名称” J:以指示连接说明(LF) S:“选择字段名称” O:“略去字段名称” 记录格式名 字段名 键标字段名 选择/忽略字段名(LF) R表示引用前面定义过的字段属性(PF) 内容 名称类型 17 (Type of Name or Specification) 不使用 名称 18 19-28 引用 29

RPG Ⅳ基础

长度 30-34 字符字段:字符的最大个数 数字字段:最大数字个数(包括小数位) 指定这个字段以替代PF中相应字段长度(LF) P 输入 P 以指示“压缩十进制”数据 S 输入 S 以指示“区化十进制”数据 B 输入 B 以指示“二进制”数据 F 输入 F 以指示“浮点”数据 A 输入 A 以指示“字符”数据 L 输入 L 以指明“日期”数据 T 输入 T 以指明“时间”数据 Z 输入 Z 以指明“时间戳记” H 输入 H 以指示“十六进制”数据 J 输入 J 以指示“仅容许 DBCS ”数据 E 输入 E 以指示“择一式 DBCS ”数据 O 输入 O 以指示“开放式 DBCS ”数据 ( -> <- ) G 输入 G 以指示“图形 DBCS ”数据 注:如果数据类型为空则表示: 1. 当37位(小数点)为空时,表示A; 2. 当37位(小数点)不为空时,表示P; 在LF中指定这个字段以替代PF中相应字段的数据类型(LF) 字符字段:空 数字字段:0-31的整数 对于PF:空白和B均表示输入和输出总有效 对于LF: 空白:对非连接LF,缺省值为B,对连接LF,缺省值为I B表示输入和输出总有效 I表示该字段为只读字段 数据类型 (Data Type) 35 小数位 用途 36-37 38 不使用 函数 39-44 45-80 Example:

|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 00020A REF(INVENCTL/INVENTORY) 00030A UNIQUE

00040A R ORDFMT TEXT('Format for Purchase Orders') 00050A ORDNBR 7 0 COLHDG('Order' 'Number') 00060A ITMNBR R 10

00070A SUPNBR R +2 REFFLD(SUPID SUPLIB/SUPMST) 00080A QTYORD 5B 00090A K ORDNBR

00100A K ITMNBR ABSVAL Example:

A R ARARR PFILE(ARAR) A K ARDTE3 A K ARACCO

RPG Ⅳ基础

A S ARDTE3 CMP(NE 0) A ARRPTN CMP(EQ ' ') A ARNUMB CMP(EQ 0) A ARDRCR CMP(EQ 'D') 以上为AND的关系

A S ARDTE3 CMP(NE 0) A S ARRPTN CMP(EQ ' ') 以上为OR的关系

PF 的DDS关键字:

文件级:

ALTSEQ: 使用替代的整理顺序表来排列记录。

FCFO: 以先更改先输出之次序来排列复制键值。

允许键值相同的前提下, 相同键值的记录First-Changed First-Out.

(指当从数据库中恢复(retrieve)具有duplicate key的记录时,记录的键值先被改变的记录先被恢复。)

00010A FCFO

00020A R CUSREC TEXT('CUSTOMER RECORD') 00030A CUSNAMEF 10A 00040A CUSNAMEM 1A 00050A CUSNAMEL 10A

00060A K CUSNAMEL

FIFO: 以先进先出之次序来排列复制键值。

允许键值相同的前提下, 相同键值的记录First-In First-Out.

LIFO: 以后进先出之次序来排列复制键值。

允许键值相同的前提下, 相同键值的记录Last-In First-Out.

REF: 指定包含引用字段的文件名称。 字段定义参照的文件.

00010A REF(FILE1) 00020A R RECORD

00030A FLD1 R

UNIQUE: 指示不容许复制键值。(不允许键值相同的记录.)

CCSID: 指定字符字段的编码字符集标识符。

记录级:

FORMAT: 与现存的记录格式共享字段说明

00020A R CSTMBJSR FORMAT(CSTM)

RPG Ⅳ基础

定义CSTMBJS文件的记录格式与CSTM相同.

TEXT: 提供记录或字段之说明。(对记录格式的文本说明.) Example:

TEXT(‘CUSTOMER’ ’S NAME’) = CUSTOMER’S NAME

如果在一个字符串中需要一个撇号,用两个相邻的单引号编码. TEXT(‘This is a long +

String continued + Across 3 lines’)

表示:This is a long String continued Across 3 lines 连接符号: ? 加号(+):从函数中下一行的第一个非空字符列(45-80)开始连接; ? 减号(-):从函数中下一行的第45列开始连接。 函数下一行必须写在45-80列上。 在DDS中,所有名字、关键字和其他未引用的项都必须大写。 DB2/400中:1.名称可为10个字符; 2.必须以A到Z、@、$、#开始; 3.后面可跟A到Z、0到9、@、_、$、#; 4.RPG/400不允许标识符中使用下划线(_). 字段级:

ALIAS:提供字段的替代名称

00010A FIELDA 25A ALIAS(CUSTOMERNAME) ALIAS支持30个字符,必须大写,不能与其他字段名重.

COLHDG (Column Heading): 提供字段的列标题。

字段的标题(text management, the query utility, the data file utility (DFU), and the screen design aid (SDA))

00150A ORDDAT 5 0 COLHDG('Order' 'Date') 00160A NAME 20 COLHDG('Customer''s Name')

00170A CITY 20 COLHDG('Customer' 'City' 'Field') COLHDG('Order' 'Date') = TEXT('Order Date').

0009.00 A SRAGTN R TEXT('AGT NUMBER') 0010.00 A COLHDG(' 代理人号 ') 无论在STRSQL、RUNQRY、UPDDTA(DFU)中都有以下规则:

先按COLHDG(' 代理人号 ')显示,如没有,则按TEXT('AGT NUMBER')显示。 COLHDG('Order' 'Date'):指定一个两行列标题,但最多不能超过三行。

CHECK: 提供有效性检查 ( 仅供引用功能 ) 。

DFT: 提供字段之缺省值。 00010A R RECORD1

00020A CHARFLD1 20A DFT('Sample field')

RPG Ⅳ基础

00070A NUMFLD2 5S 2 DFT(999.99) 00090A NUMFLD4 5S 2 DFT(*NULL) 00100A ALWNULL

00130A DATFLD1 L DATFMT(*MDY) DATSEP('-') 00140A DFT('12-31-91') 00150A TIMFLD1 T DFT('11.15.00') L 输入 L 以指明“日期”数据。 T 输入 T 以指明“时间”数据。

REFFLD: 自引用字段复制字段说明。

00010A REF(FILE1) 1 00020A R RECORD1

00030A FIELD1 R 1 00040A FIELD2 R 1 00050A FIELD3 R REFFLD(FLD3) 2 00060A FIELD4 R REFFLD(FLD4 FILE2) 3 00070A FIELD5 R REFFLD(FLD5 LIB1/FILE3) 4 00080A FIELD6 R REFFLD(RECORDB/FLD6 LIB1/FILE4) 5 00090A FIELD7 R REFFLD(FIELD6 *SRC) 6 00100A FIELD8 R REFFLD(FLD6) 7 00110A R RECORD2

00120A FIELD1 20 8 00130A

00140A R RECORD3

00150A FIELD1 R REFFLD(RECORD2/FIELD1 *SRC) 9 00160A

00170A R RECORD4

00180A FIELD1 R REFFLD(FIELD1 *SRC) 10 1 FIELD1 和 FIELD2 与FILE1中的 FIELD1 和 FIELD2. 2 FIELD3 has the same attributes as FLD3 in FILE1. 3 FIELD4 has the same attributes as FLD4 in FILE2. 4 FIELD5 has the same attributes as FLD5 in FILE3 in LIB1. 5 FIELD6 has the same attributes as FLD6 in record format RECORDB in FILE4 in LIB1. 6 FIELD7 has the same attributes as FIELD6 (在这个文件前一行定义的FIELD6。) (*SRC指在这个程序中已经被定义过的字段). 7 FIELD8 has the same attributes as FLD6 in FILE1. 8 FIELD1 in RECORD2 has unique field attributes. (他没有使用参考功能; 第29列没有指定R) 9 FIELD1 in RECORD3 has the same attributes as FIELD1 in RECORD2. 10 FIELD1 in RECORD4 has the same attributes as FIELD1 in RECORD1.

VALUES: 提供有效值之列表 ( 只供引用功能 ) 。

00010A R RECORD1 PFILE(PF1)

00020A FIELDA 1 0 VALUES(1 6 9) 1

RPG Ⅳ基础

00030A FIELDB 1 VALUES('A' 'B' 'C') 2 00040A K FIELDA

00050A S FIELDB VALUES('A' 'B') 3 00060A S FIELDA VALUES(1 6) 4 1. FIELDA的值仅为:1、6、9;

2. FIELDB仅当值为:A或B时被选择。

VARLEN (Variable-Length Field):定义该字段为可变长度字段。 00010A R RECORD1

00020A FIELD1 100A VARLEN 00030A FIELD2 100A VARLEN(30) 00040A FIELD3 100A

FIELD1: 最大长度100.(当字段长度小于100时,按字段长度存储) FIELD2: 最大长度100,固定分配长度30.

(当字段长度小于30时,按30存储, 当字段长度小于100且大于30时,按字段长度存储) FIELD3: 固定长度100

用于:当数据大部分在某个长度之内,但偶尔会超出时.(最大长度32740,且只用于字符型) 与固定长度相比在存储时有区别:节省存储空间.

关键字段级:

ABSVAL:使用键值之绝对值来排列记录。 00010A ORDAMT 5 0

00020A K ORDAMT ABSVAL

DESCEND:以最高到最低的键字段值来排列记录。

SIGNED:使用键值的符号部份来排列记录。排序时考虑符号。例如: 排序前:

Numeric Key Field Hexadecimal Record (Zoned Decimal) Representation 1 2 3 4 5 6 3 2 5 4 1 6 98 00 98- 97 20 99 98- 00 20 97 98 99 F9F8 F0F0 F9D8 F9F7 F2F0 F9F9 F9D8 F0F0 F2F0 F9F7 F9F8 F9F9 指定SIGNED后: 00010A R RECORD

RPG Ⅳ基础

00020A FLDA 7S 2 00030A FLDB

00040A K FLDA SIGNED

UNSIGNED:不使用键值之符号部份来排列记录。

ZONE:只使用键值之区化部分来排列记录。

LF中的SELECT/OMIT关键字

00010A R RECORD1 PFILE(PARTS) 00020A PNO 00030A DSC 00040A UPR 00050A QOH 00060A K PNO

00070A O DSC COMP(EQ 'HAMMER') 00080A S UPR COMP(GT 5.00) 00090A QOH COMP(LT 10) 00100A O ALL 1. DSC 不等于‘HAMMER’; 2. UPR > 5.00 且QOH < 10;

下面的例子为:选择条件为:1978年前,销售代表姓名为JSMITH,地点为New York。 00010A S ST COMP(EQ 'NY')

00020A REP COMP(EQ 'JSMITH') 1 00030A YEAR COMP(LT 78) 00040A O ALL A

00050A O YEAR COMP(GE 78)

00060A S ST COMP(EQ 'NY') 2 00070A REP COMP(EQ 'JSMITH') 00080A O ALL A

00090A O REP COMP(NE 'JSMITH') 00100A O ST COMP(NE 'NY') 3 00110A S YEAR COMP(LT 78) 00120A O ALL

1. 所有记录在被选择前必须和ST, REP和 YEAR条件比较;

2. 1978年后的记录被忽略,只有1978年以前的记录比较ST, REP条件,比方法一有效; 3. 记录只用比较YEAR,比方法一、方法二均有效;

CMP:相当于 COMP 关键字。提供字段比较值 ( 只供引用功能 ) ,或以此值作为选择或省略记录的标准。

RPG Ⅳ基础

ALL:指示在完成其他的选择或省略处理之后将要采取的动作。 00010A S ACT COMP(EQ 3000) 00020A S ACT COMP(GT 3100) 00030A O AMT COMP(LT 0) 00040A O ALL

(17列指定O和关键字指定ALL表示:忽略掉所有不符合select/omit条件的记录。)

VALUES: 提供字段的有效值列表 ( 只供引用功能 ),或以此列表作为选择或省略记录之标准。

RANGE:提供字段有效值的范围 ( 只供引用功能 ),或以此范围作为选择或省略记录之标准。 00010A R RECORD PFILE(PF1)

00020A FIELDA 1 0 RANGE(2 5) 1 00030A FIELDB 1 RANGE('2' '5') 00040A FIELDC 00050A K FIELDD

00060A S FIELDA RANGE(1 4) 2 1. 在显示文件中,RANGE要求FIELDA的值为2、3、4、5。 2. FIELDA的值为1、2、3、4的记录被选择。

PFILE: 指定由逻辑文件所使用的物理文件。

连接LF

JFILE: 指定由联结逻辑文件所使用的物理文件。

00010A R JREC JFILE(PF1 PF2) 00020A J JOIN(PF1 PF2) 00030A JFLD(NAME1 NAME2)

00010A R JREC JFILE(MYLIBA/PHYSICAL1 +

00020A MYLIBB/PHYSICAL2 MYLIBC/PHYSICAL3) 00030A J JOIN(1 2)

00040A JFLD(FIELD1 FIELD2) 00050A J JOIN(1 3)

00060A JFLD(FIELD1 FIELD2)

JFLD: 指定“联结说明”中的联结字段。

00010A R JREC JFILE(PF1 PF2) 00020A J JOIN(PF1 PF2) 00030A JFLD(NAME1 NAME2)

00010A R JREC JFILE(PF1 PF2) 00020A J JOIN(PF1 PF2) 00030A JFLD(NAME1 NAME2)

RPG Ⅳ基础

00040A JFLD(ADDR1 ADDR2)

JOIN: 指定由“联结说明”所联结的成对文件。

00010A R RECORD1 JFILE(PFA PFB PFC) 00020A J JOIN(PFA PFB) 00030A JFLD(NAME1 NAME2) 00040A J JOIN(PFA PFC) 00050A JFLD(NAME1 NAME3) 00060A NAME1

00010A R RECORD1 JFILE(PFA PFB PFC) 00020A J JOIN(1 2)

00030A JFLD(NAME1 NAME2) 00040A J JOIN(1 3)

00050A JFLD(NAME1 NAME3)

JREF: 指定包含该字段的物理文件。

00010A R JOINREC JFILE(PFA PFB PFC) 00020A : 00030A : 00040A :

00050A NAME JREF(PFB)

文件存取和记录控制

OPEN: 打开文件以便处理

CLOSE:关闭文件

FEXCEPTN O E DISK USROPN FFILEX IF E DISK F

C IF *in97 and not *in98 C OPEN(E) EXCEPTN

C IF not %ERROR C WRITE ERREC C ENDIF C ENDIF

1. USROPN:指定此关键字以指示不应执行隐式 OPEN 。该文件必须用 OPEN 操作码显式打

开;

2. (E):输入 (E) 表示发生错误处理。若指定了 E 扩充符,则不允许错误指示符(标志

位),当出错时%ERROR=‘1’(*0N) 。 C CLOSE FILEX C CALL 'RTNX' C CLOSE FILEX

RPG Ⅳ基础

C :

C EVAL *INLR = *ON C RETUEN

1. FILEX没有指定USROPN关键字,所以在程序初始化时文件自动打开; 2. 关闭FILEX文件,目的为'RTNX'程序可以使用FILEX文件。 3. 使用*INLR = *ON,自动关闭程序中所以文件。 C CLOSE (E) *ALL

关闭程序中所以文件,要再使用必须重新OPEN。

使用显式打开和关闭文件的优点: 1. 在进行OPEN操作之后,你可以检查错误指示器或文件状态值以便在进行其他操作前确认已成功打开文件; 2. 可以在不需要某文件时,关闭它,避免自己对同一个库进行其他操作或其他人对该库进行操作时发生锁住对象的冲突。 3. 节省程序初始化时间。 当读出文件时,DB2/400保留一个文件指针,指针总指向某一记录位置或两记录位置之间。 当READ操作时,记录内容被移动到编译器生成的记录结构中的字段上,而文件指针指到下一个记录之前。 READ:读取记录

Factor 2:文件名或记录格式(如果为记录格式,则它对应的文件应为在F表中的外部文件(文件格式为E))

C DOW '1' C READ FILEA C IF %EOF C LEAVE C ENDIF %EOF:是否到文件结束。(EQ位) C READ(N) REC1 64 C 64 LEAVE EQ C ENDDO

(N):若不带锁定读取该记录,则输入 (N) 。 如果已读到文件尾,则*IN64 = *ON

C READ(N) REC1 -- 55 56 *IN55=‘1’:READ操作出错,*IN56=‘1’:遇到文件结束 READ语句中Factor 2为: 1. 文件名 2. 记录格式名(必须为一外部描述文件,即文件格式为E)

READE:读取相等关键字

C KEYFLD READE REC1 56(EQ) 如果KEYFLD不等于读进的记录的关键字或已到文件尾,则*IN56 = *ON KEYFLD在KLIST中指定。

RPG Ⅳ基础

如果Factor 1处为空,则表示比较下一个记录的关键字和当前记录的关键字是否相等(既用当前记录的关键字作为Factor 1去READE下一个记录), 不等时则EQ标志位置 *ON。 READE和CHAIN的Factor 1不一定和文件的关键字完全相同 CHAIN相当与SETLL+READE

READP:读取前一记录

C READP FILEA C IF %EOF C GOTO BOF C ENDIF C BOF TAG

%EOF代替了%BOF,是否到文件开始。

C READP PREC1 72(EQ) C 72 GOTO BOF C BOF TAG

如果已读到文件开始,则*IN72 = *ON

C READP PREC1 72(EQ) C IF *IN72 = *ON (C *IN72 IFEQ *ON) C GOTO BOF C ENDIF C BOF TAG

READPE:读取前一相等记录

C FieldA READPE FileA 99 如果读进的记录的关键字不等于FieldA,则*IN99 = *ON

C FieldB READPE FileB Ds1 99 1.读进的记录被放到Ds1中;

2.如果读进的记录的关键字不等于FieldB,则*IN99 = *ON;

C READPE FileA 99

如果如果Factor 1处为空,则表示读进的记录的关键字和当前记录的关键字不等时则*IN99 = *ON。

WRITE:建立新记录

UPDATE:修改已存在的记录

DELETE:删除记录

SETLL:设置较低极限

定位到下一条记录,记录的关键字或RRN(关系记录号)大于或等于Factor 1上指定的检索变量(关键字或RRN)。

71-72(NR):说明一个指示器,当Factor 1上的检索自变量大于文件中最高的键字或相对记

RPG Ⅳ基础

录号时,它置为ON;也可用%FOUND表示,如果没有记录被找到,返回‘0’, 有记录被找到,返回‘1’;

75-76(EQ):说明一个指示器,当目前记录的那些键字或相对记录号等于Factor 1上的检索自变量时,它置为ON;也可用%EQUAL表示,如果相等记录被找到,返回‘1’。 ORDFIL文件 ORDER 100 100 100 101 101 101 101 102 ORDER=101

---------------------------------------------------------- C ORDER SETLL ORDFIL C IF %EQUAL C DOU %EOF C ORDER READE ORDFIL C IF NOT %EOF (C DOU *IN40=ON

C ORDER READE ORDFIL - - - - 40 C *IN40 IFEQ *OFF ) C : C ENDIF C ENDDO C ENDIF

%EQUAL:判断相关操作是否找到一个与之相匹配的记录.(‘1’: 找到一个与之相匹配的记录)

%EOF: 判断读写操作是否结束.(‘1’:结束) *LOVAL 和*HIVAL:

SETGT:设置大于

定位到下一条记录,记录的关键字或RRN(关系记录号)大于Factor 1上指定的检索变量(关键字或RRN)。

SETGT与READP的配合使用.

71-72(NR):说明一个指示器,当没有找到键字或相对记录号比Factor 1上的检索自变量大的记录时,它置为ON;也可用%FOUND表示,如果没有记录被找到,返回‘0’, 有记录被找到,返回‘1’;

CHAIN:从文件中随机检索

C KEY CHAIN FI

C IF NOT %FOUND C EXSR Not_Found

RPG Ⅳ基础

C ENDIF

%FOUND:如果记录没找到为 *OFF, 找到了为 *ON

C KEY CHAIN REC1 72(HI) C IF NOT *IN72 C UPDATE REC1 C ENDIF

记录没找到 *IN72 = *ON , 找到了 *IN72 = *OFF

C Rec_No CHAIN(N) INPUT 99 在SUBFILE中用RRN去CHAIN.

C KEY CHAIN REC1 54 55 – *IN54=‘1’:没有找到与KEY相匹配的记录,*IN55=‘1’:出错

KFLD:定义关键字的一部分

KLIST:定义组合关键字

UNLOCK:解除锁定数据区或释放记录

FUPDATA UF E DISK

C READ VENDOR 12 C :

C *IN50 IFEQ *ON C UPDATE VENDOR C ELSE

C UNLOCK UPDATA 99(LO) C ENDIF 释放最近读出记录上的记录锁

释放记录锁: 1. 从同一文件中读出不同记录时; 2. 关闭文件; 3. UNLOCK 4. 更新记录时。

EXCEPT:计算时间输出

RPG中使用RRN

对没有键值的文件就可以根据相对记录号RRN,来连续或随机处理。RRN号也可以在SETLL、SETGT、CHAIN操作码中使用。要在RPG程序中使用RRN,必须在文件定义中指定RECNO关键词。RECNO关键词就表示DISK类文件是按照相对记录号(RRN)来处理的。RECNO可以在INPUT/UPDATE类文件上指定,提取的相对记录号会放在RECNO关键词括号内定义的一个字段内,该字段名可以自己定义,类型必须定义成数字类型,定义的长度应该足够放下提取的记录号长度。关键值RECNO和BLOCK(*YES)不能同时在同一个文件上定义。而且文件定义的34位必须为空,通常有键值的文件该位会被填K。使用了RECNO关键词,ILE RPG编译器不

RPG Ⅳ基础

允许记录块读写(RECORD BLOCKING),但如果文件仅仅是输入文件,而且设置快速顺序访问(用OVRDBF指定SEQONLY(*YES)),那么块读写仍然被允许。

比如文件定义:

FTESTPF IF E DISK RECNO(RRNO) DRRNO 9P 0 INZ(0)

定义了相对记录号存放的RRNO字段后,就可以在RPG程序中使用相对记录号了。在读写每条记录时,都会返回该记录的RRN号。

我们在文件中定义使用相对记录号处理文件,在一定的条件下,比如按顺序处理文件,存取速度很快。使用相对记录号文件应该在文件定义的第34列留空白。 下面再举2个例子解读CHAIN、使用相对记录号写文件的用法。

例1、从文件头至尾利用相对记录号对其进行CHAIN操作,最后显示文件记录总数: 0003.00 FTEST_PF IF E DISK RECNO(RRN) ← 在关键字文件定义RECNO(RRN),RRN是相对记录号.

0005.00 D RRN S 9B 0 INZ(1) ← D类定义一个变量RRN为9位16进制格式.

0007.00 C RRN CHAIN TEST_PF ← 相对记录号索引文件TEST_PF(这里

是升序)

0008.00 C DOW %FOUND(TEST_PF) 0009.00 C EVAL RRN=RRN+1 0010.00 C RRN CHAIN TEST_PF 0011.00 C ENDDO

0012.00 C** ← 循环定义每读到一个记录将相对记录号+1,直到读到文件结束.

0013.00 C EVAL RRN=RRN-1 ← 将RRN-1,因为RRN最后的记数为记录数+1.

0014.00 C RRN DSPLY ← DSPLY语句是将RRN显示在屏幕上,本语句在调试程序很有用。当语句执行DSPLY时,程序显示变量值,按执行键程序继续运行. 0016.00 C EVAL *INLR=*ON

例2、使用相对记录号写文件:

0001.00 ** Create by qingzhou 2004.11.30 0002.00 **

0003.00 FTEST_PF O E DISK RECNO(RRN) 0004.00 **

0005.00 D RRN S 9B 0 INZ(1) 0006.00 ** ......

0009.00 C EVAL RRN=RRN+1

0010.00 C WRITE(E) EMFMT ← TEST_PF的记录格式名EMFMT 0011.00 C IF *ERROR

0012.00 ** Error processing 0013.00 C ENDIF

RPG Ⅳ基础

......

备注:本例使用相对记录号将记录写入指定的位置上。

注意:只能将写入的记录放在原先已经删除的文件记录位置上(可以用SQL看RRN,确认那些RRN号还没有用),或者放置在使用INZPFM命令做过初始化操作的文件成员上(INZPFM的记录数有默认值)。对于一个活动的文件记录,本操作无效。WRITE(E)的‘E’表示使用错误检验,%ERROR是错误检验内置函数。如果不使用相对记录号,记录将被写入文件尾部。

Unit 9. Coding Inquiry Programs

AAN01N02N03T.Name++++++RLen++TDpBLinPosFunctions++++++++++++++++++ A TIT002 40A O 2 20TEXT('Program Description') A CSRRRN 5S 0H A INSNUM 5S 0B 12 42

数据类型/键盘换档 (Data Type/ Keyboard Shift) 对显示文件而言:

A: 输入 A 指示“字母数字”的键盘换档;其字段之数据类型为“字符”。

D: 输入 D 以指示“仅容许数字”之键盘换档;若“小数位数”指定为空白,则其字段之数

据类型为“字符”,或若指定“小数位数”为零,则其字段之数据类型为“区化十进制”。 F: 输入 F 以指示“浮点”数据类型。

I: 输入 I 以指示“禁止键盘输入”之键盘换档;若“小数位数”指定为空白,则其字段之

数据类型为“字符”,或若指定“小数位数”,则其字段之数据类型为“区化十进制”。 M: 输入 M 以指示“仅数字字符”之键换档;其字段之数据类型为“字符”。

N: 输入 N 以指示“数字”之键盘换档;若“小数位数”指定为空白,则其字段之数据类型

为“字符”,或若指定了“小数位数”,则其字段之数据类型为“区化十进制”。 S: 输入 S 以指示“含正负号之数字”之键盘换档;其字段之数据类型为“区化十进制”。 W: 输入 W 以指示“日文片假名”之键盘换档;其字段之数据类型为“字符”。 X: 输入 X 以指示“仅容许字母”之键盘换档;其字段之数据类型为“字符”。 Y: 输入 Y 以指示“仅容许数字”之键盘换档;其字段之数据类型为“区化十进制”。 E: 输入 E 以指示“择一式 DBCS ”数据类型。 J: 输入 J 以指示“仅容许 DBCS ”数据类型。 O: 输入 O 以指示“开放式 DBCS ”数据类型。 G: 输入 G 以指示“图形 DBCS ”数据。

AAN01N02N03T.Name++++++RLen++TDpBLinPosFunctions++++++++++++++++++ A TIT002 40A O 2 20TEXT('Program Description') A CSRRRN 5S 0H

A INSNUM 5S 0B 12 42

使用 (Usage)

对显示文件而言: O 或空白: 输入 O 或保存字段空白,以指示仅供输出使用的字段。

RPG Ⅳ基础

I: 输入 I 以指示仅供输入使用的字段。

B: 输入 B 以指示供输入和输出两者使用的字段。

H: 输入 H 以指示隐藏式字段(供输入及输出两者使用,但不显示出来)。 M: 输入 M 以指示一信息字段(仅供输出使用)。 P: 输入 P 以指示程序至系统的字段。 对于打印机文件而言,输入 O 或保存字段空白以指示仅供输出使用的字段。

有关有效性检查的关键字: CHECK(XX)

CHECK(AB) 容许空白字符以符合有效性检查规则。 CHECK(ER) 在字段的最后一个位置上处理项目,就像按了“执行”键一样 CHECK(FE) 请用户按“字段退出”键以离开字段。 CHECK(LC) 容许在该字段输入小写字体。 CHECK(ME) 请求用户在该字段输入数据。 CHECK(MF) 请求用户将数据输入字段的每一个位置上。 CHECK(M10) 在输入数据上运行模数 (10) 之有检查。 CHECK(M11) 输入数据上运行模数 (11) 之有效性检查。 CHECK(RB) 将字段向右调整并填之以空白。 CHECK(RL) 在字符字段中将光标由右至左移动。 CHECK(RLTB)将光标由右至左且由顶部至底部移动。 CHECK(RZ) 将字段向右调整且填之以零。 CHECK(VN) 确认输入的是有效的简称。 CHECK(VNE) 确记输入的是有效扩展名称。

显示属性

下划线 . . . . . . . . . . . . . . . UL 闪烁 . . . . . . . . . . . . . . . . BL 列分隔符 . . . . . . . . . . . . . . CS 高亮度 . . . . . . . . . . . . . . . HI 非显示 . . . . . . . . . . . . . . . ND 反转图像 . . . . . . . . . . . . . . RI 设置修改数据标记 . . . . . . . . . . MDT 字位光标 . . . . . . . . . . . . . . PC 保护字段 . . . . . . . . . . . . . . PR

Unit 10. Using Arrays

数组:

是一组具有相同长度和数据类型的相关数据.每个元素被指定一个编号,叫下标(INDEX). 注:1.下标应为数字字段或数字常量,必须大于0且小数点位置为0(例如:8 0);

2.在程序运行时,如果下标的值为0、负数或大于数组的元素的数字,将会出现错误。

本文来源:https://www.bwwdw.com/article/4ctp.html

Top