Наличие динамического текста с MSGID в DSPF - PullRequest
1 голос
/ 20 марта 2019

Я изменяю интерактивную программу, имея DSPF с полем Вывод:

MSGERR        80A  O 24  2MSGID(&§MSGID FILE_MSG) 

Я передаю ID в MSGID, и он отлично работает.

Теперь у меня есть такое сообщение:

VALUE CAN BE: &1, &2, &3

и мне нужно заменить & 1, & 2, & 3 на ТЕКСТ.

Возможно ли использовать текущий метод? Потому что я не могу работать напрямую с MSGERR на RPGLE, потому что он не виден.

1 Ответ

4 голосов
/ 20 марта 2019

Нет, вы не можете. Вместо использования 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, и она будет работать нормально. Или используйте подпрограммы, а не подпроцедуры в этом случае.

...