[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2007
    Beiträge
    295

    ERRSFL + QMHSNDPM + **FREE

    Schoenen Nachmittag.

    Jetzt braeuchte ich eure Hilfe mal denn ich sehe den Wald vor lauter Baeume nicht mehr.

    Ich bin gerade dabei mein ersten Programm in **FREE zu schrieben. Es soll ein Dialogprogramm werden welches die Fehler per QMHSNDPM an das Messagesubfile schicken soll. In meinen vorherigen pseudo-free Programmen hat dies immer wunderbar geklappt.
    Daher habe ich die Prozeduren einfach aus den "alten" pseudo-free ile rpg uebernommen bzw ins free uebersetzt. Genau so den CallStackEntry 0 sowie PgmQueue 'MAIN' (wie bei mir halt immer). Ich habs aber auch schon mit '*' statt 'MAIN' probiert. Leider wird im Subfile nichts angezeigt sondern nur im Joblog.

    Im Dsplayfile wie gehabt:
    Code:
                                                 DSPSIZ(24 80 *DS4) PRINT
                                                 ALTHELP(CA01) HELP
                                                 MSGLOC(24)    ERRSFL
    
                    R AUFAU7ZS                   SFL
                                                 SFLMSGRCD(24)
                      MESSAGEKEY                 SFLMSGKEY
                      PGMQUEUE                   SFLPGMQ
    
                    R AUFAU7ZC                   SFLCTL(AUFAU7ZS)
                                                 CF01
                                                 KEEP
                                                 OVERLAY
                                                 PUTRETAIN
                                                 SFLDSP
                                                 SFLDSPCTL
                                                 SFLINZ
           N88                                   SFLEND
                                                 SFLSIZ(2)
                                                 SFLPAG(1)
                      PGMQUEUE                   SFLPGMQ
    Das Displayfile ist folgendermaßen definiert:
    Code:
    DCL-F AUFAU7DF WORKSTN INFDS(WSDS) ALIAS USROPN;
    Die beiden Felder fuer den Stack sowie PgmQ:
    Code:
    DCL-C MESSAGEFILE 'XXMSGF    *LIBL';
    DCL-S PgmQueue        CHAR(10) INZ('MAIN');
    DCL-S CallStack       INT(10)  INZ(0);
    Der Prozeduraufruf für das API
    Code:
    DCL-PR API_QMHSNDPM EXTPGM('QMHSNDPM');
      MessageID         CHAR(7)   CONST;
      MessageFile       CHAR(20)  CONST;
      MessageData       CHAR(128) CONST;
      MessageDataLenght INT(10)   CONST;
      MessageType       CHAR(10)  CONST;
      CallStackEntry    CHAR(10)  CONST;
      CallStackLevel    INT(10)   CONST;
      MessageKey        CHAR(4)   CONST;
      ErrorDS           LIKEDS(API_ErrorDS);
    END-PR;
    Dieses wird eben aus folgender Prozedur aufgerufen:
    Code:
    DCL-PROC SndPgmMsgPrc;
     DCL-PI SndPgmMsgPrc;
       pMessageID           CHAR(7)   CONST;
       pMessageFile         CHAR(20)  CONST;
       pMessageData         CHAR(128) CONST;
       pMessageProgramQueue CHAR(10)  CONST;
       pMessageCallStack    INT(10)   CONST;
     END-PI;
    
     /INCLUDE GHP3MOD/QRPGLECPY,QMHSNDPM
    
     DCL-S MessageKey CHAR(4) INZ;
     //------------------------------------------------------------------------
    
     API_QMHSNDPM ( pMessageID           :
                    pMessageFile         :
                    pMessageData         :
                    %Size(pMessageData)  :
                    '*INFO'              :
                    pMessageProgramQueue :
                    pMessageCallStack    :
                    MessageKey           :
                    API_ErrorDS          );
    
    END-PROC;
    Das DSPF wird in einer eigenen Prozedur ausgegeben:
    Code:
    DCL-PROC LoopFM_A;
    
     Clear AUFAU7A0;
     InitFM_A();
    
     DoW ( PictureControl = FM_A );
    
       Write AUFAU7A0;
       Write AUFAU7ZC;
       ExFmt AUFAU7A0;
       ClrMsgPrc(PgmQueue :CallStack);
    
       Select;
         When ( WSDS.KeyPressed = KeyF03 );
           PictureControl = FM_End;
         When ( WSDS.KeyPressed = KeyF04 );
           PromptFM_A();
         When ( WSDS.KeyPressed = KeyEnter );
           If CheckFM_A();
           EndIf;
       EndSl;
    
     EndDo;
    
    END-PROC;
    Und folgendermaßen wird dann die Nachricht in der Prozedur CheckFM_A gesendet:
    Code:
    SndPgmMsgPrc('F000033' :MESSAGEFILE :Feld :PgmQueue :CallStack);

    Lt. Joblog wird die Nachricht brav an die MAIN geschickt (wie bei den vorherigen ebenfalls)
    Code:
    Von Programm . . . . . . . . . :   AUFAU7RG      
      Von Bibliothek . . . . . . . :     TESTLIB
      Von Modul  . . . . . . . . . :     AUFAU7RG
      Von Prozedur . . . . . . . . :     SNDPGMMSGPRC
      Von Anweisung  . . . . . . . :     550         
                                                     
    An Programm  . . . . . . . . . :   AUFAU7RG      
      An Bibliothek  . . . . . . . :     TESTLIB
      An Modul . . . . . . . . . . :     AUFAU7RG    
      An Prozedur  . . . . . . . . :     MAIN        
      An Anweisung . . . . . . . . :     248
    Wie gesagt, ich habs mittlerweile schon mit MAIN und * sowie CallStackEntry 0 sowie 1 (wo dann die Nachricht an die PEP geschickt wird) probiert. Weiters hab ich das Feld PGMQUEUE geteilt. Einmal im Subfile PGMQNAME mit 'MAIN' und die Nachricht hab ich an '*' geschickt. Gleicher "Erfolg".
    Wie oben erwähnt, ich sehe den Wald vor lauter Bäume nicht mehr denn das Prinzip hat bei meinen vorherigen Programme (ohne totally free aber sonst gleichem Aufbau) tadellos funktioniert.

    Und natürlich habe ich ein altes DSPF mit dem jetzigen verglichen sowie die Felder im Programm selbst. Vielleicht hat hier jemand eine Idee woran ich hier jetzt soooo gigantisch scheitere :-)

    Dankeschön und Lg
    Greets
    Christian
    Anwendungsentwickler und ein bissal Systemoperator
    https://github.com/prsbrc
    LinkedIn

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Du kannst nur Nachrichten senden an Einträge, die zum Zeitpunkt des Sendens aktiv im Callstack sind.
    Wenn du mal im Debugger schaust, auf welcher Ebene sich die Prozedur SndPgmMsgPrc zum Zeitpunkt des Sendens befindet, so musst du dann sicherstellen, dass die Prozedur LoopFM_A sich oberhalb deiner SndPgmMsgPrc befindet. Nun musst du nur noch den Stack durchzählen, wobei 0 deine eigene Prozedur ist, 1 die nächste darüber usw. (QMHSNDPM muss nicht mitgezählt werden), Callstackentry muss "*" sein.
    Dann sollte es auch funktionieren.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    May 2007
    Beiträge
    295
    Danke für die Info.
    Sprich sollte lt. Stack das ganze die Nummer 2 bekommen.
    Click image for larger version. 

Name:	Unbenannt.png 
Views:	3 
Size:	9,7 KB 
ID:	464

    Habs probiert aber leider wird meine Message auch nicht angezeigt.
    Lt. Joblog geht die Nachricht brav an die Prozedur LoopFM_A().

    Code:
    Von Programm . . . . . . . . . :   AUFAU7RG         
      Von Bibliothek . . . . . . . :     TSTLIB
      Von Modul  . . . . . . . . . :     AUFAU7RG       
      Von Prozedur . . . . . . . . :     SNDPGMMSGPRC   
      Von Anweisung  . . . . . . . :     541            
                                                        
    An Programm  . . . . . . . . . :   AUFAU7RG         
      An Bibliothek  . . . . . . . :     TSTLIB
      An Modul . . . . . . . . . . :     AUFAU7RG       
      An Prozedur  . . . . . . . . :     LOOPFM_A       
      An Anweisung . . . . . . . . :     271
    Grüße
    Christian
    Greets
    Christian
    Anwendungsentwickler und ein bissal Systemoperator
    https://github.com/prsbrc
    LinkedIn

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Kommen wir zum 2. Problem:
    SFLMSGQ
    https://www.ibm.com/support/knowledg...mstdfsfpmq.htm

    For Integrated Language Environment® (ILE) programs using the 276-byte parameter value, the format of the field data must be as follows:
    • The first 256 bytes contains the ILE call message queue name. The call message queue name is the same as the ILE procedure name. The name must be left-aligned and padded with blanks.
    • Bytes 257 through 266 will optionally contain the ILE module name. The name, when specified, must be left-aligned and padded with blanks. If no module name is provided, these bytes must be set to blanks.
    • Bytes 267 through 276 will optionally contain the name of the ILE bound program name. The name, when specified, must be left-aligned and padded with blanks. If no bound program name is provided, these bytes must be set to blanks.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    May 2007
    Beiträge
    295
    So, eine Nacht darüber geschlafen und hab den "Leger" gefunden.
    Peinlich, peinlich. Ich hatte beim Record wo ich den EXFMT mach das OVERLAY vergessen

    Jetzt funktioniert es wieder tadellos über den Stack 0 und PGMQ 'MAIN'

    Dankeschön für die Hilfe und schönen Tag!

    Lg
    Christian
    Greets
    Christian
    Anwendungsentwickler und ein bissal Systemoperator
    https://github.com/prsbrc
    LinkedIn

Similar Threads

  1. QMHSNDPM
    By roko in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 23-01-17, 08:29
  2. %dec in free-rpg ??
    By Gimli in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 11-03-03, 11:16
  3. Free RPG??
    By DEVJO in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-03-03, 08:18
  4. Free - RPG
    By Gimli in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-03-03, 10:47
  5. Free-RPG
    By Gimli in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 03-03-03, 11:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •