Сообщения не появляются в подфайле сообщений внизу экрана - PullRequest
0 голосов
/ 27 сентября 2019

Я написал основную функцию обслуживания в RPGLE, используя DDS для создания файла дисплея.У меня есть определенный подфайл сообщения, чтобы показать сообщение в строке 24. Управляющая запись подфайла сообщения имеет определенный оверлей.Сообщения записываются в pgm (проверил журналы заданий и может видеть правильные сообщения, отправляемые в правильную программу).SFLPGMQ определяется как '*' (я также попытался ввести полное имя pgm - тоже самое).Вся программа написана полностью в полностью свободной форматной RPG.У меня есть следующие форматы: HEADER (оверлей не определен) - он содержит повествование в первых 4 строках.SUBFILE (Управляющая запись имеет определенный оверлей) - Строки подфайлов 6-21 FUNCKEYS (Отображать набор разрешенных функциональных клавиш в строке 23 - Заданный оверлей) MSGSFL (Управляющая запись имеет определенный оверлей) - SFLMSGRCD (24)

Когдапостроение экрана: Запись заголовка Запись Funckeys Write MsgSflC Exfmt SUBFILEC

Странно то, что у меня есть очень похожий вид подфайлов, который использует окно.Мой метод практически идентичен этой программе - но он работает отлично!

Я уже несколько часов выдергиваю волосы и не могу понять, что происходит сейчас!Пожалуйста, пожалуйста, кто-нибудь избавит меня от моих страданий!

Это DDS для файла дисплея

A                                      DSPSIZ(24 80 *DS3)             
A                                      INDARA                         
A                                      CF03(03)                       
A                                      CF06(06)                       
A                                      CF12(12)                       

 ** Header                                                            
A          R HEADER                                                   
A                                  1  2'XXXXXXS1'                     
A                                  1 28'Maintain XXXXXXXXXXXXXXXX'  
A                                      DSPATR(HI)                     
A                                  1 63DATE                           
A                                      EDTCDE(Y)                      
A                                  1 72TIME                           
A                                  3  2'2=Edit   4=Delete'   
A                                      COLOR(BLU)                     

 ** Subfile                                                         
A          R SUBFILE                   SFL                          
A  94                                  SFLNXTCHG                    
A            S_OPT          1A  B  6  3                             
A  51                                  DSPATR(RI PC)                                     
A            S_TRANTYPE    30A  O  6  8                             
A            S_RRN          5S 0H                                   

 ** Subfile control                                                 
A          R SUBFILEC                  SFLCTL(SUBFILE)              
A                                      OVERLAY                      
A  91                                  SFLDSP                       
A  92                                  SFLDSPCTL                    
A  90                                  SFLCLR                       
A  93                                  SFLEND(*MORE)                
A                                      SFLSIZ(17)                   
A                                      SFLPAG(16)                   
A                                  5  2'Opt' 
A                                      DSPATR(HI)                        
A                                  5  8'XXXXXXXXXXXXXXX'                
A                                      DSPATR(HI)                        

 ** Function keys                                                        
A          R FUNCKEYS                                                    
A                                      OVERLAY                           
A                                 23  2'F3=Exit   F6=Add   F12=Cancel'   
A                                      COLOR(BLU)                        

 ** No xxxxxxxx available                                       
A          R NOTRANS                                                     
A                                      OVERLAY                           
A                                 10 10'*** There are no XXXXXXX defined ***'               
A                                       DSPATR(HI)                       

 ** Messages                                                             
A          R MSGSFL                    SFL                               
A                                      SFLMSGRCD(24)                     
A            MSGKEY                    SFLMSGKEY                            
A            PGMQ                      SFLPGMQ                              

A          R MSGCTL                    SFLCTL(MSGSFL)                       
A                                      OVERLAY                              
A                                      SFLDSP                               
A                                      SFLDSPCTL                            
A                                      SFLINZ                               
A N12                                  SFLEND                               
A                                      SFLSIZ(2)                            
A                                      SFLPAG(1)                            
A            PGMQ                      SFLPGMQ(10)                                                 

Ниже приведена суть построения экрана.На экране все отображается правильно, за исключением сообщений внизу!

PGMQ установлен на '*' в начале программы

dcl-proc DisplayScreen;                                   

    write HEADER;                                         
    write FUNCKEYS;                                       
    write MSGCTL;                                      
    if S_RRN <> *zero;                                    
       SflDspCtl = *on;                                   
       SflDsp = *on;                                      
       exfmt SUBFILEC;                                     
    else;                                                 
       exfmt NOTRANS;                                     
    endif;                                                

end-proc;   

Одновременно может быть выбрана только 1 запись,Если их больше одного, сообщение должно отображаться внизу вместе со всеми соответствующими записями, выделенными в поле S_OPT.Подсветка всех полей работает нормально - и сообщение появляется в журнале работ!Так что я ожидаю, что они появятся в MSGSFL!Я уверен, что я делаю что-то глупое - но не могу за всю жизнь увидеть, что !!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Это похоже на то, что я использую, за одним исключением.Я поместил имя программы (из PSDS) в очередь программ.Затем при отправке сообщений я отправляю их явно в одну и ту же очередь.Таким образом, я знаю, что все они указывают на одно и то же.Вы не показали подпрограмму, которая отправляет сообщение, но вам нужно убедиться, что вы не отправляете что-то «по цепочке», то есть вы должны отправить запись в стек, названную счетчиком 0. Я также только очищаю сообщениеочередь сразу после чтения файла дисплея.

Вот процедура, которую я использую для отправки сообщений в файл дисплея:

// ------------------------------------
// 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, QCPFMSG 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 = 'QCPFMSG';
  endif;

  qmhsndpm(messageId: msgf: msgData: %size(msgData): '*INFO': pgmq: 0: '': ec);
end-proc; 
0 голосов
/ 27 сентября 2019

Я не вижу никаких явных проблем с кодом, который вы разместили, поэтому я подозреваю, что проблема находится где-то еще в вашей основной строке или подпрограмме редактирования, для которой вы не опубликовали код.Я подозреваю, что вы очищаете очередь программных сообщений где-то между записью сообщений об ошибках и возвратом к процессу DisplayScreen, поэтому сообщения никогда не попадают в подфайл.

- Роб

...