分类:
2006-05-29 14:53:23
第七章 定义信息
在AS/400系统中,过程和程序之间、作业之间、用户之间以及用户和过程和程序之间是通过信息通讯的。信息可预先定义,也可立即生成。
预先定义的信息在使用它的程序外生成和存在,它放在信息文件中,且有一个信
息号,系统预先定义的信息是:
CPF0006 Errors occurred in command
立即信息是由发送者在发送时建立的,它不放在信息文件中,下面是立即信息的
例子:
From . . . : QSYSOPR
System going down at
系统中有一组预先定义的信息,它在系统程序之间及系统和用户之间通讯,每个特许程序都有一个信息文件存在与特许程序所在的同一库中。例如:系统信息存在QSYS库中的QCPFMSG文件中。
信息文件中的每个预先定义的信息都由7个字符做唯一标识,且由信息描述来定义。信息描述包括,信息正文和帮助正文、严重级别、有效及缺省的回答值和几个其它属性。
在系统中所有发送和接收信息都是通过信息队列传送的。
发出给请求者的响应信息自动显示在请求者的显示屏上,所有其它信息,用户、程序或过程必须从队列中接收信息或显示它。系统中有几个IBM支技的信息队列,详情请见7.4。
系统也写一些信息发给日志,作业日志包括作业进入的有关的信息,历史日志包括作业、子系统和设备状态信息。详情请看8.7。
可生成自己的信息队列和信息描述,由生成预先定义的信息,可以使用几个过程和程序中的相同信息,但只能定义一次,也可以修改且把预先定义的信息转换成非英语的其它语言,这不影响它们的使用。如果在过程和程序中定义了信息,在修改这些信息后,要重编译模块或程序。
可生成自己的信息和信息文件,系统信息处理功能允许你做:
生成和修改信息队列(CRTMSGQ,CHGMSGQ)
处理信息队列(WRKMSGQ)
生成和修改信息文件(CRTMSGF,CHGMSGF)
增加信息描述(ADDMSGD)
修改信息描述(CHGMSGD)
去掉信息描述(RMVMSGD)
发送立即信息(SNDMSG)
发送中断信息(SNDBRKMSG)
发送程序信息(SNDPGMMSG)
发送用户信息(SNDUSRMSG)
显示信息和信息描述(DSPMSG,DSPMSGD)
处理信息(WRKMSG)
处理信息描述(WRKMSGD)
使用CL过程和程序来做:
— 把信息发送给工作站用户或系统操作员(SNDUSRMSG)
— 从信息队列接收信息(RCVMSG)
— 往信息队列发送信息回答(SNDRPY)
— 从信息文件取得信息(RTVMSG)
— 从信息队列去掉信息(RMVMSG)
— 监控送往调用信息队列的逃逸、注意、状态信息(MONMSG)
使用系统回答列表来规定对作业发送的预先定义的查询信息的回答(ADDRPYLE),
修改回答列表(CHGRPYLE),去掉回答列表(RMVRPYLE),处理(WRKRPYLE)。
在发送信息时,定义为下列类型之一:
信息(*INFO):传送有关功能的条件信息
查询(*INQ):传送有关请求回答的信息
通知(*NOTIFY):要过程和程序采取更正动作的条件说明或从调用过程和程序
给出的回答。一个过程和程序可以监控它调用的过程和程序的
通知信息。
回答(*RPY):对接收到的查询或通知信息的响应
发送拷贝(*COPY):由发送者复制的查询或通知信息
请求(*ROS):来自接收过程和程序的功能请求
完成(*COMP):传送工作的完成状态
诊断(*DIAG):在应用程序或输入数据中处理系统功能时的错误信息
状态(*STATUS):说明由过程和程序所做工作的状态。过程和程序可把监控来
自它调用的过程和程序的状态信息显示在屏幕上,也能通知用
户采取相应的处理操作
逃逸(*ESCAPE):说明过程和程序必须异常结束的信息。过程和程序可以监控
来自它调用的过程和程序或机器的逃逸信息,在送出此信息
后,控制并不转给发送它的程序
这章介绍:
如何生成自己的信息文件
如何往信息文件加一个信息描述
信息队列的类型
如何生成信息队列
7.1 生成信息文件
要生成自己预先定义的信息,必须首先生成放信息的文件。用CRTMSGF命令来生成信息文件,然后用ADDMSGD来描述信息且把它们放到信息文件中。
在CRTMSGF命令中,用SIZE参数规定以K 字节为单位的最大尺寸,下列公式是计算所用最大尺寸的:
S+(I×N),
其中: S=初始存储空间
I=每次增加的存储空间
N=要增加的存储空间的次数
S、I、N的缺省值为10,2和*NOMAX。
例如,S=5、I=1、N=2,在文件到了初值5K时,系统自动地加1K,最多能到7K。如果规定N=*NOMAX,信息文件的最大尺寸为16M。
在对信息文件规定了最大尺寸而文件满时,你不能修改信息文件的尺寸,要生成另外的信息文件然后在新文件中生成信息,可用MRGMSGF命令从一个信息文件往另一个中复制信息描述。要避免这样做,在生成信息文件时要认真计算最大尺寸,或就规定N=*NOMAX。
7.1.1 确定信息文件的大小
可用下列公式确定信息文件的大小(括号中给出的是ADDMSGD的参数):
信息索引=42字节+信息长度
联机帮助信息(SECLVL)=16字节+帮助信息长度
格式(FMT)=14字节+(3×FMTS的个数)
类型和长度(TYPE和LEN)=48字节
特别值(SPCVAL)=2+(64×SPCVAL的个数)
范围(RANGE)=64字节
关系(REL):关系的长度
缺省(DFT):缺省回答的长度
缺省程序,日志问题和转储表(DFTPBM,LOGPRB,DMPLST)
=35+(2×DMPLST的个数)
ALROPT=12字节
信息文件中的最小项是59字节,最大项是5764字节,下表给出可能的最大项:
信息索引 42字节 |
类型和长度 48字节 |
信息正文 148字节 |
20个特别值 1282字节 |
信息帮助正文 3016字节 |
20个值 640字节 |
99个格式 311字节 |
缺省回答值 32字节 |
缺省程序和转储列表 233字节 |
警告选项 12字节 |
在下例中,用CRTMSGF命令生成信息文件USRMSG:
CRTMSGF MSGF(QGPL/USRMSG) +
TEXT('Message file for user-created messages')
如果生成用RPG写的DSPLY操作码中的信息文件,文件名必须是QUSERMSG。
7.2 往文件中加信息
可用ADDMSGD命令描述预先定义的信息且加到生成的信息文件中。在命令中,可以规定信息标识,信息文件的名字,及信息描述。在信息描述中可以规定:
信息正文(必须的)及可选的替换变量
信息帮助正文及可选的替换变量
严重码
替换变量所用信息数据的格式说明
回答值的有效性检查
回答的缺省值
逃逸信息的缺省信息处理动作
生成级别
报警选项
编码字符集ID(CCSID)
放在信息描述的每项将在下面详细说明。
下列命令也用来处理信息描述:
CHGMSGD:修改信息描述
DSPMSGD:显示信息描述
RMVMSGD:取消信息描述
RTVMSGD:取得信息描述
MRGMSGF:把一个信息文件合并到另一个信息文件中。
WRKMSGD:显示信息文件中的信息列表且允许加、改或删除信息描述。
7.2.1 分配信息标识
在ADDMSGD命令中规定的信息标识用来引用一个信息,也做为这个信息描述的名字,它必须是7个字符。PPPmmnn
PPP是产品或应用代码,mm是组号,nn是字类型号,mmnn也可进一步分组,它由0—9数字和A—F字母组成。例如:
CPF1234 是CPF的的信息1234
在生成自己的信息时,建议用U做第一个字符。例如:
USR3564
码的第一个字符必须是字母,第二、三个字符可以是字母数字,组码必须是0—9或A—F,此时A—F做字符对待。
在信息标识中用nn=00时要特别小心,如果要监控这类信息它表示要监控这组所有的信息。详细请看8.3的内容。
7.2.2 定义信息和信息帮助
可用ADDMSGD命令定义二级信息。信息正文是必须的,也要标识发生CL信息的条件。信息帮助是可选的,它进一步解释这个条件或解释要采取的改正动作。要得到信息帮助,工作站用户要在信息显示时,把光标移到信息上接按帮助键。帮助信息可用三个格式控制符来为工作站格式化,这些字符使用户更容易读帮助信息。
这三个控制字符必须用空格与信息上下文分开。
&NЪ(此时Ъ为空格):正文在新行开始显示(第2列)。如果正文多于一行,那么
下一行从第4列开始直到结束,或遇到另外一个控制符。
&PЪ:从新行开始正文,从第6列开始。如果正文多于一行,下行从第4列开始直到
结束或遇到另一控制符。
&BЪ:从新行第4列开始,如果正文多于一行,下行从第6列开始直到结束或遇到另
一控制符。
7.2.3 分配一个严重码
在ADDMSGD命令中分配给信息的严重码指出信息的重要程序,严重码越高情况越严重。下面给出使用的严重码及其说明(它们的分配与IBM预先定义信息是一致的)。
00:信息,仅用于信息类。没发现错误,也不要回答,它指出功能正在处理或已完成。
10:警告,存在潜在的错误条件。过程和程序可取缺省值,例如提供丢失的输出,操
作结果假定为成功。
20:错误,检查到一个错误,但可能提供自动恢复,继续处理。可能用缺省来代替遇
到的输入,操作结果可能不对,或仅完成部分功能。例如,处理列表中的某些项因为其它项失败而导致错误。
30:严重错误,其错误程度不能做自动恢复,也没有可处理的缺省值。如果错误发生
在源数据中,则跳过整个输入记录。如果在过程和程序处理期间发生错误,它导致过程和程序异常结束,操作结果是不正确的。
40:过程或功能异常结束。由于过程和程序不能处理无效数据,或用户取消过程,故
操作结束。
50:作业异常结束,作业结束或没起动,过程步异常结束或启动失败,作业级请求不
能按要求完成或取消作业。
60:系统状态。仅由系统操作员发布,它给出设备、子系统或系统的状态或警告信息。
70:设备完整性。仅由系统操作员发布。它指出正在管理设备或某些设备不可操作,
用户可以从失败中恢复,也可请求服务人员帮助。
80:系统警告。它发布的是立即信息,它虽然不致于立即停止系统,这个警告条件如
果不处理会使情况更严重。
90:系统完整性。仅由系统操作员发布,它给出一个子系统或系统不可操作的条件。
99:动作。需要人为干预。例如要回答信息,改打印格式或换软盘等。
对SEV参数的详细介绍,请看CL参考手册。
7.2.4 定义替换变量
在ADDMSGD命令中的FMT参数,可对第一或第二级信息规定替换变量。例如:
File &1 not found
其中&1是替换变量,当显示或取得信息时,&1要用没有找到的文件来代替,这个名字是由信息发送者提供的。例如:
File DRDHDRP not fonud
它与File not found比较,替换变量使信息更多,规定更多含义。
替换变量必须以&开头后跟n,n是从1—99的数字。例如:File &1 not found中的替换变量定义为FMT((*CHAR 10))。在为替换变量分配替换变量时,必须从1开始连续分配,但也不一定要用所有的替换变量。例如:
File &3 not available
也是有效的。虽然在此信息中没有用&1和&2,但此时必须在ADDMSGD中的FMT参数中定义&1、&2和&3。FMT可以是:
FMT((*CHAR 10)(*CHAR 2)(*CHAR 10))
此时,第一个值为&1,第二个为&2,第三个为&3。&1和&2必须在&3前面。另外,在发送信息时,在SNDPGMMSG命令的MSGDTA参数要包括在FMT参数中说明的所有数据,要发送上面给出的信息,MSGDTA参数必须至少22个字符长。
对前面的信息,也可如下规定FMT参数:
FMT((*CHAR 0)(*CHAR 0)(*CHAR 10))
由于在信息中没有用&1和&2,可以把它们的长度规定为零,然后不发送信息。(这时,SNDPGMMSG命令的MSGDTA参数仅要10个字符长)。
这种情况,也可用DMPLST参数来规定,它规定在往该监控它的程序发送逃逸信息时,DMPLST参数规定的数据可以是空的。
替换变量在信息中规定的顺序不必须与FMT中规定的相同。例如,在FMT中规定3个值:
FMT((*CHAR 10)(*CHAR 10)(*CHAR 7))
在信息中使用的替换变量可以是:
object &1 of type &3 in labrary &2 is not available
如果是用CL过程和程序发送信息,可用下列的信息数据连接这些值:
SNDPGMMSG .....MSGDTA(&OBJ *CAT &LIB *CAT &OBJTYPE)
必须在ADDMSGD命令中规定替换变量的信息数据字段的格式,即数据类型和长度,其中长度可选。信息数据字段的有效数据类型为:
*QTDCHAR:引号内的字符串。字符串要放在单引号内,不删除前导和末尾空白。如
果在信息描述中没有规定长度,发送者确定字段的长度。
*CHAR:字符串。不用放在引号中,删去末尾空白。如果在信息描述中没规定长度,
则发送者确定字段长。
*CCHAR:可转换为字符串。不用放在引号中,删去末尾空白,长度由发送者确定。
如果这类数据送往CCSID而标志不是65535或 65534的信息队列时,数据要从CCSID信息数据转换成CCSID信息队列。对这类数据在用接收或显示功能从信息队列得到数据时,也发生这种转换。处理CCSID的详细信息,请看应用开发的有关资料。
*HEX:十六进制。字符串前用X,字符串放在单引号中。串中的每个字节都要转换成
二个十六进制数。(0—9、A—F)。如果在信息描述中没有规定长度,则由发送
者确定长度。
*BIN:二进制。格式为有符号的十进整数的一个二进整数(2或4字节长)。如果没规
定长度,则用2字节。
*DEC:十进制。格式为有符号有小数位和十进制的压缩十进制数。必须规定长度,小
数位的缺省值为零。
*SYP:系统指针。系统目标的16字节指针,在一个信息或信息帮助中,10个字符的
目标名格式化为CHAR类型。
*SPP:空间指针。程序目标的16字节指针,在转储中,目标中的数据格式化为相同
的十六进制类型数据。SPP不能用作信息的转换变量,它仅能用做ADDMSGD
中DMPLST参数的一部分。
下列数据类型仅用在IBM支持的信息描述中不能用作其它信息:
*ITV:时间间隔。8字节,它包括等待超时条件的最接近的整秒数。
*DTS:日期和时间标志,8字节的系统日期和时间标志,日期格式化成系统值QDTAFMT
和QDTASEP规定的样子,时间的格式为hh:mm:ss。
7.2.5 规定对回答的有效性检查
在ADDMSGD命令中,可对查询和通知信息规定对回答类型做有效性检查,可规定:
回答类型(TYPE):
— 十进制(*DEC)
— 字符(*CHAR)
— 名字(*NAME)
回答的最大长度(LEN):
— 对十进制,15个数字(9位小数)
— 对字符和字母,32个字符
— 对名字,10个字符
注:如果没规定任何有效性检查(VALUES,RANGE,REL,SPCVAL,DFT)对类
型*CHAR和*ALPHA回答的最大长度为132个字符。
回答所能用的值:
— 值列表(VALNES)
— 特殊值(SPCVAL)
— 值的范围(RANGE)
— 回答值必须符合的一个简单关系(REL)
注:特别值是能接收的但不是其它有效性检查值能符合的值。
当显示工作站用户回答信息时,键盘在下档,这时进入的是小写字母。如果程序要求用大写字母,可做下面之一:
用SNDUSR MSG命令,要支持一个转换表能把小写转为大写
在VALUES参数中规定大写字符,它要求工作站用户只能输入大写字符
用VALUES规定大写字符且用SPCVAL把小写转换成大写
如果输入的是所有字母(A—Z),可规定TYPE(*NAME),它在检查时把字符转换成大写
7.2.6 发送立即信息和处理回答
用此例完成下列功能:
往QSYSOPR发送立即查询信息
要求回答Y或N
保证有效的回答能输入进来
如果操作员在120秒之内没回答,做超时处理
PGM
DCL &MSGKEY *CHAR LEN(4)
DCL &MSGRPY *CHAR LEN(1)
SNDMSG: SNDPGMMSG MSG('.... Reply Y or N') TOMSGQ(QSYSOPR) +
MSGTYPE(*INQ) KEYVAR(&MSGKEY)
RCVMSG MSGTYPE(*RPY) MSGKEY(&MSGKEY) WAIT(120) +
MSG(&MSGRPY)
IF ((&MSGRPY *EQ 'Y') *OR (&MSGRPY *EQ 'y')) DO
.
.
GOTO END
ENDDO /* Reply of Y */
IF ((&MSGRPY *EQ 'N') *OR (&MSGRPY *EQ 'n')) DO
.
.
GOTO END
ENDDO /* Reply of N */
IF (&MSGRPY *NE ' ') DO
SNDPGMMSG MSG('Reply was not Y or N, try again') +
TOMSGQ(QSYSOPR)
GOTO SNDMSG
ENDDO /* Reply not valid */
/* Timeout occurred */
SNDPGMMSG MSG('No reply from the previous message +
was received in 120 seconds and a 'Y'' +
value was assumed') TOMSGQ(QSYSOPR)
.
.
END: ENDPGM
在此例中,不能用SNDUSRMSG来代替SNDPGMMSG,因为它不支持超时处理。(它要等待回答或取消作业)。
SNDPGMMSG命令发送信息且规定KEYVAR参数,它返回一个信息引用键,它唯一标识这个信息,因此正确的回答能与RCVMSG命令匹配。KEYVAR必须定义为长度为4的字符字段。
RCVMSG命令规定从SNDPGMMSG的MSGKEY参数来的信息引用键,用来接收特别的信息,回答传给MSG参数,WAIT规定等待多长时间回答才超时。
在接收回答时,过程检查回答的Y和N。通常由操作员输入下个小写的y和n。如果输入的是Y、N以外的非空白值,过程会发出不同信息然后重复要求查询信息。如果操作员输入的是空格,没有回答送给过程,返给过程空白,则发生超时,(按操作员不回答处理)。过程会给操作员发送信息,指出没收到回答,因此用缺省值Y,由于这个缺省回答没显示,就不能确定什么时候看信息队列来确定信息回答与否及是否超时,信息一旦送出,过程不从信息队列取消它,第二个信息将缩减这种关系,且给出这种情况下的跟踪报告。
如果发生超时且操作员回答了信息,则忽略此回答,操作员接收不到忽略回答的指示。
7.2.6.1 发送DBCS立即信息
要发送DBCS正文的立即信息,正文限制在37个双字节字符再加上转换控制符,它保证能适当的显示信息。
7.2.7 定义回答的缺省值
ADDMSGD命令允许对回答规定缺省,缺省回答必须符合有效性检查的值或规定为特殊值,在告诉用户(用CHGMSGQ命令)对所有送往用户信息队列的查询信息要用缺省回答时,用此缺省值,在删除没有回答的查询信息时也用缺省的回答。例如,用户用DSPMSG命令显示信息,用F13键取消没回答的查询信息来删除所有信息或用F11键来删除某个信息。
在把作业属性的INQMSGRPY设为*DFT时用缺省回答,在设置*SYSRPYL选项时也用缺省回答,可用系统回答列表来修改回答的缺省值。
7.2.8 对逃逸信息规定缺省的信息处理
对每个生成的做为逃逸信息发送的信息,可以设置一个缺省信息来处理在发送此信息且没有其它方式处理时采取的动作。
缺省信息处理动作可由下列内容组成:
缺省程序名:可调用它来采取缺省动作。下列参数可传送给缺省程序:
— 调用信息队列名,这个参数由多个字段组成,标识信息发送到哪去,
有关内容请看系统API参考一书。
— 信息引用键(4个字符),逃逸信息的引用键是在调用信息队列中。
转储清单:信息数据字段号的清单(与替换变量同样号码)。它指出转储了哪些目标,
另外,可以转储下列内容:
— 作业的数据区
— 作业内部机器数据结构
— 作业
作业的转储清单用DSPJOB规定JOB(*) QUTPUT(*PRINT)来产生的。
如果在信息描述中没规定缺省动作,将收到一个作业转储清单。(假定规定了DSPJOB JOB(*) QUTPUT(*PRINT))。
仅在完成信息过滤后没处理逃逸信息时才使用规定的缺省动作。详细内容请看8.3.1。
7.2.8.1 缺省程序例子
下面的程序是缺省程序的例子,用在发送给这个信息后跟一个逃逸信息,它可以是OPM CL程序,也可以是ILE程序。
PGM PARM(&MSGQ &MRK)
DCL VAR(&MRK) TYPE(*CHAR) LEN(4)
DCL VAR(&MSGQ) TYPE(*CHAR) LEN(6381)
DCL VAR(&QNAME) TYPE(*CHAR) LEN(4096)
DCL VAR(&MODNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&BPGMNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&BLANKMRK) TYPE(*CHAR) LEN(4) VALUE(' ')
DCL VAR(&DIAGMRK) TYPE(*CHAR) LEN(4) VALUE(' ')
DCL VAR(&SAVEMRK) TYPE(*CHAR) LEN(4)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(100)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&OFFSET) TYPE(*DEC)
DCL VAR(&LENGTH) TYPE(*DEC)
/* 检查 OPM 程序类型 */
IF (%SST(&MSGQ 277 1) *EQ '0') THEN(DO)
CHGVAR VAR(&QNAME) VALUE(%SST(&MSGQ 1 10))
CHGVAR VAR(&MODNAME) VALUE('*NONE')
CHGVAR VAR(&BPGMNAME) VALUE('*NONE')
ENDDO
ELSE DO
/* 不是 OPM 程序,允许使用长过程名 */
CHGVAR VAR(&OFFSET) VALUE(%BIN(&MSGQ 278 4))
CHGVAR VAR(&LENGTH) VALUE(%BIN(&MSGQ 282 4))
CHGVAR VAR(&QNAME) VALUE(%SST(&MSGQ &OFFSET &LENGTH))
CHGVAR VAR(&MODNAME) VALUE(%SST(&MSGQ 11 10))
CHGVAR VAR(&BPGMNAME) VALUE(%SST(&MSGQ 1 10))
ENDDO
GETNEXTMSG: CHGVAR VAR(&SAVEMRK) VALUE(&DIAGMRK)
RCVMSG PGMQ(*SAME (&QNAME &MODNAME &BPGMNAME)) +
MSGTYPE(*DIAG) RMV(*NO) KEYVAR(&DIAGMRK)
IF (&DIAGMRK *NE &BLANKMRK) THEN(GOTO GETNEXTMSG)
ELSE DO
RCVMSG PGMQ(*SAME (&QNAME &MODNAME &BPGMNAME)) +
MSGKEY(&SAVEMRK) RMV(*NO) MSGDTA(&MSGDTA) +
MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGLIB)
SNDPGMMSG MSGID(&MSGID) MSGF(&MSGLIB/&MSGF) +
MSGDTA(&MSGDTA) TOPGMQ(*PRV (&QNAME +
&MODNAME &BPGMNAME))
ENDDO
ENDPGM
程序用FILO顺序接收所有的诊断信息,然后它发送最后一个诊断信息作为逃逸信息,允许前面的程序监控它。
7.2.8.2 规定报警选项
在ADDMSGD命令中,可规定报警选项,它允许信息生成报警,这个信息能生成SNA报警并发送问题管理焦点,生成的信息报警可用ADDALRD来定义。详细内容请看DSNX支持一书。
7.2.9 信息描述的例子
下例中,ADDMSGD生成一个信息用在定货输入的应用程序中。在输入的客户号没有找到时发出此信息,信息为:
customer number &1 not found
所用的ADDMSGD命令为:
ADDMSGD MSGID(USR4310) +
MSGF(QGPL/USRMSG) +
MSG('Customer number &1 not found') +
SECLVL('Change customer number') +
SEV(40) +
FMT((*CHAR 8))
此信息加到QGPL库中的USRMSG文件中。
可用DSPMSGD或WRKMSGD命令打印或显示信息描述。
SECLVL参数给出很简单的正文,要使它出现在附加的信息显示上,可以规定SECLVL(‘message text’)。在把光标放在信息下按帮助键时,会出现这里规定的正文。
7.2.10 定义DBCS信息
要定义正文为DBCS字符的信息,用ADDMSGD命令写一段CL过程和程序,把定义的信息放在信息文件中然后正常发送。在写程序 时,按下列步骤做:
1、源文件要能处理DBCS字符,在CRTSRCPF命令中规定IGCDTA(*YES)。
2、用SEU输入源程序,有DBCS的CL命令只能通过SEU 输入。由于这个原因,双
字节信息必须在CL程序中生成。
3、 DBCS信息限制长度为37个字符。这样才能显示或打印完整的信息。在使用MONMS
命令时,CMPDATA参数限制为6个双字节字符。
4、如果双字节信息文件代替一个字母数字信息文件(这样转换的信息文件只能送往双
字节工作站),要用类似下面的命令来替换字母数字信息文件。
OVRMSGF MSGF(QCPFMSG) TOMSGF(DBCSLIB/QCPFMSG)
双字节信息只能在双字节显示工作站上显示。
7.3 系统信息文件的检索
在从信息文件取得一个信息时,系统用下列两步来检索:
1、系统完成有效的信息文件名替换。
2、如果没有替换信息文件名,在使用信息时,用信息文件名和库名来检索。
7.3.1 检索信息文件
当没有替换信息文件时,用规定的信息文件名和库名(在发送信息文件时)来从信息描述中检索信息文件。
在替换了信息文件名但在替换文件中没有信息标识时,也用规定的信息名和库名来检索信息文件。
系统根据是否规定了库名(*USRLIB或*LIBL)来检索,下面说明对*CURLIB和*LIBL检索的路径:
规定*CURLIB或规定一个库名:系统规定库中的信息文件名或作业的当前库。
规定*LIBL:在作业的库列表中检索信息文件名,在找到第一个信息文件后停止
检索。
如果找到了信息文件,但对信息标识没有描述,则用QCPFMSG中的CPF2457的属性和正文来做为信息描述。
如果没找到信息文件,系统试图从此时发送的信息文件中取得信息。
注:可以找到一个信息文件,但由于损坏或权限方面的问题不能访问。
7.3.2 替换信息文件
可在过程和程序中替换信息文件,生成、删除、显示信息文件的替换与其它类型的替换很类似,区别仅是替换信息文件的名字,而不是属性,而替换的原则有明显的区别。
要替换一个信息文件,用OVRMSGF命令,被替换文件在MSGF参数中规定,替换文件在TOMSGF参数中规定。
例如,要用USRMSGF替换QCPFMSG,使用下列命令:
OVRMSGF MSGF(QCPFMSG) TOMSGF(USRMSGF)
在替换或显示预先定义的信息时,检索替换文件的信息描述。如果在文件中找不到信息描述,则检索被替换的文件。
下面是替换信息文件的基本原因:
给回答或转储清单提供缺省值,由于原信息描述不合适,故可以生成一个信息文
件带有修改缺省回答和转储清单的信息描述,可以建立几个操作环境,每个有不同的
缺省回答。
修改信息的严重级别
提供缺省程序
修改信息正文。如果正文为空,对用户来说即无发送信息。例如,不能用CPYF
命令指出发送给用户的信息。
为把信息传送给不同语言,用英文写的信息文件能用其它语言写的信息文件替换。
(如果修改了所有信息,可用在库列表中修改其位置,而不用替换文件)。
选择信息文件取得信息的另一个方法是修改文件所在库在库列表中的位置。如果用这种方法,在找到第一个匹配文件后就停止检索。如果信息没在文件中,检索停止。
例如:假定信息文件USRMSG在库USRLIB1中,另一个信息文件USRMSG在USRLIB2中,要用在USRLIB1中的信息文件,那么在库列表中USRLIB1要放在USRLIB2前。系统检索正确名字的第一个信息文件,如果文件不包含信息,停止检索,如果用OVRMSGF命令,系统检索替换文件。如果没信息,它检索被替换的文件。
7.3.2.1 替换信息文件的例子
假定要修改一个作业中所用的IBM支持的信息,比如把信息CPC2191
Object XXX in YYY type *ZZZ deleted
改为:
Object XXX in YYY deleted
在显示CPF2191的详细描述中可看到FMT参数是如何规定的。
首先要生成一个信息文件:
CRTMSGF MSGF(USRMSG/OVRCPF)
然后用CPC2191做为基本信息,把它加到信息文件中:
ADDMSGD MSGID(CPC2191) MSGF(USRMSG/OVRCPF) +
MSG('Object &1 in &2 deleted') +
SEV(00) FMT((*CHAR 10) (*CHAR 10))
在运行作业时,用OVRSMGF命令替换信息文件:
OVRMSGF MSGF(QCPFMSG) TOMSGF(USRMSG/OVRCPF)
如果要修改此信息让它可用在所有作业中,可用CHGMSGD命令,而不用替换系统信息文件。如果用此命令修改了IBM提供的信息,那么在安装新版本系统时要重新修改。要再修改信息,可把修改放在输入流中或放在可在任何时候都能运行的程序中,也可替换信息文件,可在作业运行时使用下列命令:
OVRMSGF MSGF(MSGFILE1) TOMSGF(MSGFILE2)
OVRMSGF MSGF(MSGFILE2) TOMSGF(MSGFILE3)
首先,MSGFILE1被MSGFILE2代替,其次,MSGFILE2被MSGFILE3代替。当发送信息时,文件出现的顺序是:
1、MSGFILE3
2、MSGFILE2
3、MSGFILE1
可保护信息文件不被替换,即在OVRMSGF命令中规定SECURE参数。
7.4 信息队列的类型
系统中的信息都是送往信息队列中,与这个信息队列相关的系统用过程或程序从信息队列接收信息。同样,对信息的回答送回到请求回答的用户或程序的信息队列中。
下图给出IBM支持的信息队列。每个显示工作站(DSP01和DSP02)和每个用户配置文件(BOB和RAY)都有信息队列:
BOB RAY …… JOE
每个在系统中运行的作业都有作业信息队列,对每个作业分配一个外部信息队列(*EXT),在作业中每个OPM程序或ILE过程调用都有自已的调用信息队列。
作业1 作业2 作业X
PROC-1 PROGB PROC-Y
PROC-2 PROGC PROG2
外部信息队列调用信息队列。
系统历史日志(QHST)和系统操作员(QSYSOPR)也有信息队列:
QHST QSYSOPR
这些信息队列的用途:
工作站信息队列用来在工作站用户之间及工作站与系统操作员之间接收和发送信息,队列的各字与工作站同名。在工作站介绍给系统时系统自动建立这些队列。
用户配置文件信息队列用在用户之间通讯。在生成用户配置文件时自动在QUSRSYS库中生成。
作业信息队列用来接收处理的请求,发送处理请求的结果信息,信息送往作业的请求者。每个作业都有信息队列,且仅对作业的文件存在。它由外部信息队列和一组调用堆栈项组成。
QSYSOPR用来接收和回答系统信息,显示工作站用户和应用程序的信息。
历史日志用来发送系统中作业的历史日志信息。
除这些信息队列以外,你也可以生成自已的信息队列来给系统用户及应用程序之间发送信息。
7.4.1 生成或修改信息队列
要生成自已的信息队列,用CRTMSGQ命令,也可用CHGMSGQ修改你自已信息队列的以下属性:
对信息队列的修改是否立即存盘,立即存盘保证在系统失败时不丢失信息,但这样会降低系统性能。
信息交付信息队列的方式,在生成信息队列时,到达方式定义为保持。在显示工作站注册时,用户信息队列设为在用户配置文件中规定的方式。在CHGMSGQ命令中可以规定的交付类型为:
—中断:作业中断、调用一个程序来交付信息。如果用户程序没在CHGMSGD命令中
请求中断或规定为*SAME,则DSPMSG自动显示此信息,作业的中断信息可由CHGJOB命令中的BRKMSG参数控制。
—通知:用引起注意灯或报警方式通知用户在队列中有信息用户,然后可用DSPMSG
命令看信息。
—保持:信息放在队列中,直到用户用DSPMSG命令显示。
—缺省交付:所有信息都被忽略,需要回答的信息用缺省值回答。
对中断信息的处理:
—自动运行DSPMSG命令,对交互作业,如果严重码足够高则显示在屏幕上。对批作
业,如果严重码足够高,则列在打印机的假脱机文件中。
—调用中断处理程序,必须用CHGMSGD命令规定要调用的程序,且把交付方式定为
中断。
中断和通知信息过滤器的严重码:严重码等于或大于规定的最小值的信息都要显示。在生成队列时,最小严重码为00,要修改它可用CHGMSGQ命令。
在用DSPMSG显示信息队列中的信息时,SEV参数(严重码过滤器)用来过滤要给出的信息。用的过滤器不是在生成信息队列时规定的严重码过滤器,要用这个过滤器应规定DSPMSG SEV(*MSGQ)。可用DSPMSG命令来确定用于中断和通知信息的当前严重码,它在显示的标题行给出。
与信息队列有关的CCSID(编码字符集标识):送往队列的信息转换为这个CCSID。如果信息队列的CCSID是65534或65535就不做转换。如果信息队列CCSID是65534,每个信息包含由发送者建立的自已的CCSID。
标准信息队列的允许报警:允许报警规定在往生成时允许报警的队列发送报警信息时是否产生报警结果。
注:在生成工作站设备描述时,系统会为它建立信息队列来接收所有与设备有关的信息。对工作站打印机、带设备及APPC设备,在生成设备描述时,用MSGQ参数来规定信息队列。如果对这些设备没有规定信息队列,用缺省值QSYSOPR,所有其它设备在生成时都分配QSYSOPR。
在用户配置文件中定义的信息队列,做为用户信息队列。在用这个用户配置文件注册系统时,用户信息队列设为在用户配置文件中规定的交付方式。如在某个工作站注册时交付方式是中断或通知,然后又注册了另一个工作站,那么并不改变新注册的交付方式,用户信息队列(以及工作站信息队列和QSYSOPR)也不必对不同作业来修改中断或通知的方式。在注销或作业非正常结束时,如果此作业的方式为中断或通知,则用户信息队列的方式改为保持。
在转换为替换作业时做这种改变。可用TFRSECJOB命令或系统请求功能来切换替换作业。在切换到替换作业后,用你的用户配置文件注册,信息队列的方式为在用户配置文件中规定的方式,这就允许用户信息队列转换到替换作业,然后可在两个作业之间做切换,且有自已的信息队列。
假如切换到替换作业后,用另外的用户配置文件注册,原作业的用户信息队列变为保持方式,现注册的方式为用户配置文件中规定的方式。这样,你的用户信息队列可由另外的用户放在中断或通知方式。如果另外的用户在你切换到第一个作业时仍旧有你的用户信息队列交付方式,那么你的用户信息队列的方式不能改回原有的交付方式。
QSYSOPR是系统操作员信息队列,上面讲述的情况也能在此信息队列上发生。
7.4.1.1 中断处理程序
在一个信息到达信息队列时且它的严重码大于或等于队列的严重码,而队列是在中断方式时,调用中断处理程序。要请求一个中断处理程序,必须在同一个CHGMSGD命令中规定程序名和中断方式。信息管理程序必须用RCVMSG命令接收信息,这样才能标识处理的信息,以便不再调用程序,详细内容请看第八章。
注:如果中断程序等待从显示设备上的输入数据,则此程序不能打开显示文件。
可用系统回答列表来规定系统对预告定义的查询给出回答。这样,就不用显示工作站用户回答,详细内容请看8.6。
7.4.1.2 修改交付方式的例子
在启动系统时,当控制子系统启动时,会把QSYSOPR队列设为中断方式,但系统操作员注销,方式会改为保持,再注册系统操作员时,方式为在QSYSOPR用户配置文件中规定的方式。
下面是在CL初始化程序中的过程,用来把QSYSOPR信息队列设为中断方式。初始程序能用类似的过程来监控不是在用户配置文件规定的那个信息队列。
PGM /* 把信息队列设为中断方式的过程 */
CHGMSGQ QSYSOPR DLVRY(*BREAK) SEV(50)
MONMSG MSGID(CPF0000) EXEC(SNDPGMMSG MSG('Unable to put QSYSOPR +
message queue in *BREAK mode') TOPGMQ(*EXT))
ENDPGM
它把QSYSOPR信息队列设为中断方式且严重级别为50。如果不成功,有信息送往外部作业信息队列(*EXT)。当包含这个过程的程序结束时,显示初始菜单。严重级别50用来减少中断用户作业的信息数量,失败的一般原因是另外用户已经把QSYSOPR设成了中断方式。
7.4.2 作业信息队列
系统中的每个作业都有作业信息队列来处理作业需要的所有信息。一个作业的信息队列由一个外部信息队列(*EXT)和一组调用信息队列组成。一个调用信息队列分配给作业中被调用的每个ILE过程或OPM程序。另外,对每个作业都生成一个作业日志,作业日志是一个逻辑队列,它按年月顺序管理作业中发送的所有信息。你可往外部信息队列和调用信息队列发送信息,但不能往作业日志中发送信息,送往外部信息队列或调用信息队列的信息可由系统逻辑地加到作业日志中。
外部信息队列用来与作业外部的请求者(例如工作给用户)通讯,送往外部信息队列的信息(除状态信息外)也放在作业日志中。(详细内容请看8.7.1)。
如果一个消息查询或通知信息送往交互作业的外部信息队列,信息在显示程序信息屏上显示,且过程等待显示工作站用户回答或通知。如果用户没有回答或用F3或执行键,则用缺省回答返给发送者。如果没有缺省回答,则发送*N。如果查询或通知信息送往批作业的外部信息队列,则把缺省回答送给发送者,如果没有缺省信息,则用*N,系统的回答列表可以替换查询显示或对*EXT的缺省回答。
如果一个状态信息发送给交互作业的外部信息队列,信息显示在工作站的信息行上。可用这样的状态信息来指示用户长时间运行。例如在用CPYF把n个成员复制成一个文件时,系统会发送状态信息。
注:在应用程序完成长时间运行操作时,必须发送另外的信息来清除显示中的信息行。可用信息CPI9801来做这件事。
例如:
PGM
.
.
.
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Status 1') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
.
.
.
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Status 2') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
.
.
.
SNDPGMMSG MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) +
MSGTYPE(*STATUS)
.
.
.
ENDPGM
一个调用信息队列用来在程序或过程之间发送信息,只要一个过程和文件在调用堆栈中(还没有返回),那么它的调用信息队列就是活动的,且信息能发送给过程和文件。一旦过程和文件返回,它的调用信息队列就不再存在,即不能往它那里发送信息。能往调用信息队列发送的信息类型包括消息、查询、完成、诊断、状态、逃逸和通知。
在过程和文件被调用时建立调用信息队列,它仅与过程和文件运行的调用堆栈入口有关。调用信息队列与调用堆栈入口标识一致。一个调用堆栈入口是由在其运行的过程和文件名来标识的。
在OPM程序情况下,相关的调用堆栈入口是由最多10个字符的程序名标识的。在ILE过程情况下,入口是由三部分组成的,即256个字符的过程名,10个字符的模块名和10个字符的程序名,模块名是组成编译过程的模块名字,ILE程序名是连接模块的ILE程序名。
在标识ILE过程的调用堆栈入口时,仅规定过程名就足够了。如果过程名不能唯一地标识入口,也可规定模块名或程序名。如果在发送信息时,过程和文件是不只一次的在调用堆栈中,规定的名字将标识最近一次调用的过程和文件。
也有其它方法来标识调用堆栈入口,详细内容请看8.2.3。
假如编译了的OPM或ILE在调用堆栈中被代替了,在用程序名来引用一个调用堆栈入口时要特别小心,对所有先在堆栈中的调用堆栈入口而不是指向所做替换操作的那些入口,名字引用将分解为在QRPLOBJ库中的被替换目标。这名字引用是合法的,直到被替换目标继续留在QRPLOBJ库中。对堆栈中较新的入口,它指向所做的替换操作,名字的引用是对程序的新版本,由于使用的方法是确定的,所以不要把程序直接放在QRPLOBJ库中,这个库严格做程序版本的替换操作,对直接放进去的程序做名字引用会失败。
如果程序正在调用堆栈中发生移出程序或改名,那么任何用老名字做的引用都会失败,对ILE过程,假如仅用过程名和模块名做引用,对程序改名不会影响名字引用,如果也用ILE程序名,则名字引用会失败。
过程和程序的调用堆栈入口信息队列在过程和程序结束时就不能使用了,在相应的调用信息队列中的信息仅能用信息引用键来引用。例如,在下图中,假定过程A调用过程B,过程B调用过程C,过程C发送给过程B一个信息后结束。信息对过程B是可用的,但在B结束时,它的调用信息队列不再可用,且不能访问它,即使在作业日志中给出的信息也是如此,A不能访问送给B的信息,除非A对此信息有信息引用键。
过程A |
|
| |
外部信息队列 过程A调用信息队列 过程B调用信息队列 过程C调用信息队列 | |
|
|
RETURN |
假如A要某个信息,必须按下列方法做:
C向A发送某个信息
B向A再发送这个信息
程序堆栈 作业信息队列
外部信息队列 过程A调用信息队列 过程B调用信息队列 过程D调用信息队列 过程B调用信息队列 | |
| |
| |
| |
| |
过程 C |
如上图,过程B有两个调用堆栈入口队列,过程C没有信息队列。因为没有信息发送给C,当C往B送信息时,信息到达最后一个对B调用的堆栈入口队列。
注:在使用命令入口显示时,可用F10键显示送往作业信息队列的所有信息。一旦显示了信息,可用翻页键上、下翻,也可用DSPJOBLOG命令显示作业信息。