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
位;
逻辑型为“
0
”
或“
1
”
,表示假或真。
#CL
变量的缺省初值为:字符型为空,数值型为
0
,逻辑型为“
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
变量。
5 .4 .3
程序间的通讯
程序间的通讯是指不同程序之间数据或参数的传递和交流。这种通讯可以出现在不同种类的程序中。如:
RPG
与
C
语言,也可以出现在不同机器上,如:
PC
与
AS/400
。针对
OS/400
而言,通常程序间的通讯具有三种方式:
* CALL
、
RETURN
命令
*
数据队列通讯
*
数据域通讯
5.4.3
.1 CALL
命令的使用
调用程序:
CALL PGM
(
PGMA
)
PARM
(
&A &B
)
被调用程序:
PGM PARM
(
&C &D
)
有关
CALL
命令使用的几点说明:
*
参数值可以是字符常量、数值常量、逻辑常量或
CL
常量,最多可达
40
个
。
*
参数值以
CALL
命令中出现的顺序传送,这必须与被调用程序的参数顺序相匹配,变量名不一定相同。
*
被调程序中的接收参数必须说明,但接收值不受变量说明中初值的影响。
*
接收参数值的改变会反映到调用程序中,但常量传送不会改变。
*
字符常量通常以
32
个
字节传送,数字常量以
15.5
长度压缩格式传送。
5.4.3
.2
数据队列的程序通讯
数据队列(
*DTAQ
)是系统目标中的一种类型,当建立了这种目标后,一个程序可以发送数据给它,另一个程序再从中接收数据,从而达到程序之间的数据通讯。
5.4.3
.3
数据队列的优点
*
数据队列是两个作业之间进行异步通讯的最快方法。相对数据库文件、消息队列或数据域而言,它需要较少的额外开销。
*
多个作业可以向相同的数据队列送数据和取数据,而数据队列的先进先出、后进先出或关键字顺序排列属性,能够保证数据送取的正确性。
*
在任何高级语言程序中,通过调用系统提供的程序,就可以对数据队列进行操作,而且操作方法灵活方便。数据队列的操作和使用包括两类:第一类使用
CL
命令;第二类调用系统程序。
CL
命令:
CRTDTAQ
建立数据队列
DLTDTAQ
删除数据队列
WRKDTAQ
工作数据队列
系统程序:
QSNDDTAQ
发送数据队列
QRCVDTAQ
接收数据队列
QCLRDTAQ
清除数据队列
QMHQRDQD
检索数据队列
5.4.3
.4
数据队列的发送
需要将数据发送给数据队列,只要在程序中调用
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
的字符型,它包含了传送给数据队列的关键字数据。
注:后两个参数可以自选,如果说明了一个,则必须说明另一个。
5.4.3
.5
数据队列的接收
需要从数据队列中接收数据,只要在程序中调用
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
必须同时说明。
5.4.3
.6
数据队列的清除
需要从数据队列中清除数据,只要在程序中调用
QCLRDTAQ
在
CL
程序中,调用的格式如下:
CALL PGM
(
QCLRDTAQ
)
PARMM
(
&QNAME &LIB
)
5.4.3
.7
数据队列的检索
需要检索一个数据队列的描述项,只要在程序中调用
QMHQRDQD
。在
CL
程序中,调用的格式如下:
CALL PGM
(
QMHQRDQD
)
PARM
(
&RCVR &RCVRLEN &FORMAT &DQNAME
)
&RCVR
:
是长度为
&RCVRLEN
的字符型,它标识了含有数据队列性的变量。
&RCVRLEN
:
是长度为
4
的数字型,它说明了
&RCVR
长度。
&FORMAT
:
是长度为
8
的字符型,它定义了接收模板的格式。
&DQNAME
:
是长度为
20
的字符型,它标识了数据队列和所在库,前十个字符是队列名字,后十个字符是库名。
5.4.3
.8
数据域的程序通讯
数据域(
*DTAARA
)是系统目标中的一种类型。当建立了这种目标后,可以用来存入数据,以便任何程序进行读取和修改。数据域的典型用途如下:
*
提供用于几个程序中的常数字段,易于共享和修改。如:标题、说明等。
*
在一个作业中提供一个传递信息的区域。
*
在一个作业中提供一个字段作为控制参数,以便容易地得到修改。
数据域的
CL
命令包括:
CRTDTAARA
建立数据域,长度不超过
2000
CHGDTAARA
改变数据域,改变时数据域被锁定
DSPDTAARA
显示数据域,可以以十六进制方式显示
RTVDTAARA
检索数据域,检索值需要存入
CL
变量
DLTDTAARA
删除数据域
WRKDTAARA
工作数据域
5 .4 .4
测试功能
5.4.4
.1 CL
程序的编译
CL
源程序必须经过编译,生成
*PGM
方可运行。建立程序的方法有两种:一是,使用
CL
命令
CRTCLPGM
,二是,使用
PDM
菜单选项
14
,按
F4
键即可对命令参数进行选择。
系统编译的情况全部记录在编译清单中,通过
WRKSPLF
即可看到。编译过程中的错误被列在相应命令后面,以及文件的最后,方便用户查找。下列类型的错误将停止程序的建立:
*
值错
*
句法错
*
命令内部与参数间不符
*
有效性检查有错
CL
程序可以通过反编译命令
RTVCLSRC
,重新建立
CL
源程序。使用该命令时,必须满足建立编译程序的参数
ALWRTVSRC
为
*YES
。
当源程序被反编后,任何注释信息不再重新产生,以下程序序言将被建立:
*
所有者名
*
源程序的最终修改日期
*
源程序的重建日期和时间
*
最初编译时的许可程序级
5.4.4
.2
程序的编译
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
过程中。
有了以上基础,大家可以参考下面文章作第一个CL程序了.
http://www.texas400.com/tutpdm.html