AS400程序使用手册(3)

2019-08-31 12:10

D FHS02 3 4 D FHS03 5 6

是等价的,都是定义一个结构变量MYDS(名字可以自行定义),这个结构变量是由三个字符型变量FHS01,FHS02,FHS03拼成的。

第一种定义方法,就是引用外部文件“PFFHS”作为数据结构的定义,注意使用到了“EXTNAME”关键字,而且“E”项的值为“E”。

而第二种定义方法,就是直接定义一个结构“MYDS”。注意没有使用外部文件时,“E”项的值为空。 S/U: 不知道,一般都填空。 Declaration Type: 定义变量的类型,允许的值如下: 不填: 非以下内容:数据结构、常量、独立变量、数组、表。此项为空时,好象只能用来表示当前定义的变量是属于结构的一个变量。在下面会举例 DS: 数据结构,即定义一个结构变量,这个之前已讲过 C: 常量

常量只能使用字符,不需要定义常量的长度、类型。常量的内容写在“Keywords”处,并使用CONST关键字,在程序段中,不能对常量进行赋值操作。

D MYNUM C CONST('abcdefghijklmn')

就是定义一个叫做MYNUM的常量,这个常量包含字母a--n。

PI: 不知道,没有用过 PR: 不知道,没用过 S: 定义以下内容:独立变量、数组、表 定义一个叫MYFIELD1的变量,变量为1位长的字符型 D MYFIELD1 S 1 //1在“To/length”项 定义一个叫MYARRAY的数组,共含3条记录,每条记录为1位字符型 D MYARRAY S 1 DIM(3) //DIM在“Keywords”项 表的定义没有用过 总之,这一项,最常用的,就是“DS”、“S”与空。即结构体与独立变量,其它选项较少用到。 From: 当“Declaration Type”项为“S”时,表示独立变量、数组,此项不填 当“Declaration Type”项为“DS”时,表示结构,此项仍然不填

当“Declaration Type”项为空时,表示当前定义的变量,属于上面定义的结构,此时,此项可以填写,也可以不填写。

当填写时,“From”项表示变量在结构中的起始位置,右对齐;“To/length”表示变量在结构中的结束位置,也是右对齐。

当不填写时,“To/length”表示直接定义为变量长度。 举例: D MYDS DS D DSFLD01 1 2 //1在“From”项,2在“To/length”项 D DSFLD02 3 4 与

D MYDS DS

D DSFLD01 2 //2在“To/length”项 D DSFLD02 2

其实是等价的,都是定义一个结构变量MYDS,这个结构变量中,包含了两个变量DSFLD01,DSFLD02,这两个变量都是两位长字符。所不同的是,第一种定义方法,是指定了变量在结构中的位置;而第二种方法,是直接指定变量的长度和类型

注意到上面的定义中,DSFLD01、DSFLD02的Declaration Type为空,也就是表示这两个字段是属于上面定义的结构MYDS。如果此项为“S”,即表示这个变量与结构无关

D MYDS DS

D DSFLD01 2 //2在“To/length”项 D DSFLD02 S 2

在这个定义中,变量DSFLD02就是一个独立的变量,与结构MYDS无关。

Length: 上面已讲述在定义结构时的使用方法。 在定义非结构时,此项的内容即为定义变量的长度。右对齐 Internal Data Type: 定义变量的类型,允许的值有: 空:变量定义为字符型、压缩型数字 A: 变量定义为字符型 B: 二进制?不知道 D: 变量定义为日期型 F: 变量定义为浮点型? G: 变量定义为图型?(非英文?汉字?) I: 变量定义为带符号的整数 N: 变量定义为指示器变量?(没用过) P: 变量定义为压缩型数字 S: 变量定义为普通的数型 T: 变量定义为时间型 U: 变量定义为无符号的整数 Z: 变量定义为日期+时间型(格式:年-月-日-时.分.秒.微秒) *: 变量定义为指针型 其实我最常用,就是不填,因为一般的程序,有字符和数字这两种类型变量,就足够了。 Decimal Positions: 当变量定义为数字型时,用来标志小数的位数。 当“To/Length”项为3,“Internal Data Type”项为空时 此项为空,表示定义的变量为3位长的字符型 D MYFLD01 S 3 //定义为3位字符型 此项不为空(右对齐),表示定义的变量为数字型 D MYFLD01 S 3 2 //定义数字型变量,1位整数,2位小数(总长为3位) Keywords: 关键字,可以不填,常用的值如下:(同样,这里我也只列出几个常用的,这里先不做详细说明,仅供参考,在后面的例子,看看就知道用法了) CONST: 定义常量的值

DIM: 定义数组

EXTNAME:引用外部文件作为数据结构变量

EXTFLD: 对引用了外部文件作为数据结构的某个变量,进行重命名 LIKE: 定义变量时,参照已存在的变量定义

OCCURS: 定义结构体变量时,指定的结构体变量的记录条数 INZ: 定义变量时,赋值初始值

DATFMT: 定义日期变量时,指定日期格式 *MDY (mm/dd/yy)

*DMY (dd/mm/yy) *YMD (yy/mm/dd) *JUL (yy/ddd) *ISO (yyyy-mm-dd) *USA (mm/dd/yyyy) *EUR (dd.mm.yyyy) *JIS (yyyy-mm-dd)

Comment

注释项,源自RPG,不用填,因为填了也没用。

2.6.2 常用例子

定义一个10位长的字符型变量:

D MYFLD S 10

定义一个10位长,其中含2位小数的字符型变量,并使其初始值为1 D MYFLD S 10 2 INZ(1)

定义一个每条记录为5位长字符型变量,共10条记录的数组 D MYFLD S 5 DIM(10)

定义一个10位长的字符型变量,再定义一个变量,参照前一变量定义 D MYFLD01 S 10 D MYFLD02 S LIKE(MYFLD01)

定义一个结构,由一个3位长的字符变量,和一个10位长,其中2位小数的数字变量组成 D MYDS DS D MYDS01 3 D MYDS02 10 2

定义一个结构变量,结构内容参照外部文件PFFHS D MYDS E DS EXTNAME(PFFHS)

定义一个结构变量,结构内容参照外部文件PFFHS,并且将第二个字段重命名为FHS999 D MYDS E DS EXTNAME(PFFHS) D FHS999 E DS EXTFLD(FHS02) 定义一个日期型变量,格式为yyyy-mm-dd D MYDATE S D DATFMT(*ISO)

2.6.3 补充说明

变量的定义,除了在D行定义之外,还可以在C行通过赋值语句直接定义 如

D FLD01 S 2 INZ(‘01’) 与 C MOVE ‘01’ FLD01 2 //2在length处,右对齐 是等价的

定义结构之后,可以将结构变量视为一个普通的变量进行赋值来改变结构变量的值,也可以通过对组成结构变量的变量进行赋值,来达到修改结构变量的值的目的。

如: D MYDS DS D MYFLD01 2 D MYFLD02 2 在C行中,这两句是等价的 C EVAL %SUBST(MYDS:3:2)=’01’ C EVAL MYFLD02=’01’ 第一句是直接改结构变量MYDS的后两位的值(当然,此时MYFLD02的值也变化了) 第二句是对MYFLD02进行赋值,同样,赋完值之后,MYDS的后两位也变为’01’

在需要频繁进行数字与字符之间转换时,偷懒的人会通过定义这样的结构来达到目的: D MYDS DS D MYFLD01 1 8 D MYFLD02 1 8 0

比如说,给MYFLD01赋值为’20070208’之后,MYFLD02也就自动等于20070208;然后给MYFLD02加1之后,MYFLD02等于20070209,MYFLD01的值也自动等于’20070209’。可以认为结构变量MYDS是字符型(即一直等于MYFLD01的值)

这种方法,当需要字符型变量时,就使用MYFLD01;当需要数字变量时,就使用MYFLD02,不过我总觉得有点类似于作弊,一般没用。

关于数组、结构体的内容,因为要说起来内容还颇多,而也属于略为高级一些的用法,所以将在后面专设章节讲述。

2.7 入口参数

程序可以通过“*ENTRY”定义入口参数,或称之为接口参数,来传递数据。 假设有程序FHS01ILE,其中入口参数的定义如下: C *ENTRY PLIST C PARM FLD01 3 C PARM FLD02 4 其中:

*ENTRY在“Factor 1”项;

PLIST在“Operation”项; PARM在“Operation”项;

FLD01、FLD02都在“Result”项

上述定义,表示这个程序通过两个字段与其它外部程序沟通。那么别的程序(如FHS02ILE)在调用程序FHS01ILE时,就要带上两个字符型变量,如

C CALL ‘FHS01ILE’ C PARM FHSFLD01 3 C PARM FHSFLD02 4

在两个程序里,这两个变量名可以不同(比如说一边叫FHSFLD01,FHSFLD02;一边叫FLD01,FLD02),但长度,类型必须匹配。

如果在FHS02ILE中,FHSFLD01等于’123’,FHSFLD02等于’abcd’,那么系统在运行CALL语句,执行程序FHS01ILE时,将会对字段FLD01初始化赋值,使其一开始就等于’123’,字段FLD02等于’abcd’。

如果FHS01ILE程序中,对FLD01、FLD02进行了改动,比如FLD01最后等于’789’,FLD02最后等于’efgh’,那么程序FHS02ILE在调用完FHS01ILE之后,FHSFLD01、FHSFLD02这两个字段也同样会改变,成为’789’,和’efgh’

也就是入口参数的变化是可以传递的,其实应该很好理解吧。

入口参数的定义,可以写在程序的任何一处,而程序的执行,始终是从C行的顺序第一行开始执行,与入口参数所在的位置无关。

FHS02ILE也可以使用一个大变量来调用FHS01ILE,只要总长相等即可(这种方法仅限于被调用的程序FHS01ILE的入口参数全部为字符型才可使用,仅仅只是不会错,不建议这样使用。

C CALL ‘FHS01ILE’ PARM FHSFLD01 7

其实从上面的例子可以看出,入口参数可以使用结构的形式来表达,所以下面这种写法也不会有错。(如果被调用程序有数字型变量,只要在定义结构时也定义为数字型即可)

D MYDS DS D DS01 3 D DS02 4 C CALl ‘FHS01ILE’ C PARM MYDS

不过要注意,如果RPG程序调用C程序,那么入口参数必须严格按照C程序中的来,比如C程序中带了两个字符型参数,那么RPG程序中也必须是两个字段入口参数,不能使用由两个字符变量组成的结构。原理可以自行想想。

既然可以使用结构做为入口参数,当然,也可以参照外部文件来定义结构做为入口参数

D MYDS E DS EXTNAME(PFFHS) C CALL ‘FHS01ILE’


AS400程序使用手册(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:L1-U811.1客开培训文档--UAP

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: