Нет, вы не можете. Вместо использования MSGID, ERRMSGID и т. Д. Я предпочитаю подфайл сообщения. Это выглядит так:
A* ========================================================================
A* Message Subfile
A* ------------------------------------------------------------------------
A R MSGSFL SFL
A SFLMSGRCD(24)
A MSGKEY SFLMSGKEY
A PGMQ SFLPGMQ
A* ------------------------------------------------------------------------
A* Message Subfile - Control forrmat
A* ------------------------------------------------------------------------
A R MSGCTL SFLCTL(MSGSFL)
A OVERLAY
A SFLINZ
A SFLPAG(1)
A SFLSIZ(2)
A SFLDSP SFLDSPCTL
A 52
AON52 SFLEND(*PLUS)
A PGMQ SFLPGMQ
Чтобы использовать его, вы отправляете сообщения в очередь программных сообщений, а затем пишете MSGCTL как часть вашей экранной транзакции. Поэтому, если у вас обычно есть один формат записи на экране с именем RECORD, вы должны сделать это:
pgmq = <Program Name>;
write msgctl;
exfmt record;
Любые сообщения, находящиеся в очереди программных сообщений, будут отображаться в подфайл в одну строку в строке 24 на вашем дисплее. Этот субфайл прокручивается.
Вам понадобятся две подпроцедуры, чтобы упростить эту работу: одна для написания сообщения, а другая для очистки очереди сообщений. Я называю мои ClearDspfMsg(pgmq)
и SendDspfMsg(pgmq: msgid: msgdata)
.
Вот процедуры:
// ------------------------------------
// Clear Display File Messages
// Clears the messages in the display file message subfile
//
// Parameters:
// pgmq - Program message queue. This must be the same as the pgmq
// specified in the display file.
// ------------------------------------
dcl-proc ClearDspfMsg Export;
dcl-pi *n;
pgmq Char(10) const;
end-pi;
dcl-ds ec LikeDs(errCode_t) Inz(*LikeDs);
qmhrmvpm(pgmq: 0: '': '*ALL': ec);
// TODO Provide error checking here
end-proc;
// ------------------------------------
// Send Message to Display File (MSGID)
// Sends a message to the display file message subfile
//
// Parameters:
// pgmq - Program message queue. This must be the same as the pgmq
// specified in the display file.
// messageId - The message id of the message to be sent
// messageData - Message data for replacement values in the message. Format
// of the message data is defined by the message. This is
// optional, if missing, blanks are used.
// messageFile - The qualified name of the message file containing the
// message. The first 10 characters is the messafe file name,
// the second 10 characters is the library. This is optional,
// if blank, CNVMSG in *LIBL is used.
// ------------------------------------
dcl-proc SendDspfMsg Export;
dcl-pi *n;
pgmq Char(10) const;
messageId Char(7) const;
messageData Varchar(256) const options(*varsize: *nopass);
messageFile LikeDs(qualName_t) const options(*nopass);
end-pi;
dcl-ds msgf LikeDs(qualName_t) Inz(*likeds);
dcl-ds ec LikeDs(errCode_t) Inz(*likeds);
dcl-s msgData Char(256) Inz('');
if %parms() >= %parmnum(messageData);
msgData = messageData;
endif;
if %parms() >= %parmnum(messageFile);
msgf = messageFile;
else;
msgf.name = 'MSGF'; // This is your default message file
endif;
qmhsndpm(messageId: msgf: msgData: %size(msgData): '*INFO': pgmq: 0: '': ec);
// TODO Provide error checking here
end-proc;
У меня есть прототипы для qmhsndpm
и qmhrmvpm
, но вы можете найти их и формат параметра кода ошибки в документации достаточно легко.
Позвоните SendDspfgMsg()
, чтобы отправить сообщение, и ClearDspfMsg()
, чтобы очистить очередь сообщений в начале вашей транзакции. PGMQ должен иметь одинаковое значение для всех этих частей, и он будет просто работать.
ПРИМЕЧАНИЕ: Это не будет работать для RPG, поскольку у вас нет доступа к подпроцедурам. Если необходимо, преобразуйте вашу программу в RPGLE, и она будет работать нормально. Или используйте подпрограммы, а не подпроцедуры в этом случае.