[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    EXTPGM-Parameterliste

    Hätte gerne meinen Code ganz in free geschrieben, bin aber da auf ein Problem gestossen.

    Ich habe eine Parameterliste(CHK03R) die 50 lang ist.
    Im aufgerufenen Programm ist aber die *entry-Parameter 51 lang.

    Kann ich in free den Parameter RC „dazuhängen“, falls ja bitte wie?

    Habe es so versucht ging aber leider nicht:
    CheckCode(CHK03R:RC);

    Kann ich beim Aufruf einen EXTPGM auf fehlerhafte Beendigung abfragen,
    oder muss ich es in einen MONITOR-Anweisung schreiben.


    Code:
    D CheckCode       PR                  EXTPGM('CHKCD01R')
    D CHK03R          DS            50    INZ            
    D  PaSL3                  1      2  0                
    D  PaCD3                  3      5                   
    D  PaBZ3                  6     30                   
    D  PaKB3                 31     35                   
    
    C                   CALL      'CHKCD01R'                
    C                   PARM                    CHK03R      
    C                   PARM                    RC

    Aufgerufenes Programm hat in der *entry-Anweisung:

    Code:
    *ENTRY        PLIST                                     
                  PARM     PARAMS       	50     
                  PARM     RC			 1
    Dank im Voraus

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    (1) Nach "CheckCode PR ..." fehlen noch die einzelnen Parameter des Programms. Siehe hier Abbildung 232. Die Datenstruktur "CHK03R DS ..." ist eigenständig und gehört nicht dazu.

    (2) callp(e) CheckCode(CHK03R:RC) und danach Abfrage der Variable %error.

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Meiner Meinung nach musst die Datenstruktur im Prototyp mit "likeds" definieren. Dann kannst du weitere Parameter anhängen.

    Gruß,
    Dieter

  4. #4
    Registriert seit
    Apr 2012
    Beiträge
    360
    Ich habe versucht den Parameter anzuhänger, bekomme aber da einen Fehler.

    Muss ich da qualified angeben?
    Mir ist nur nicht klar wo.

    Code:
    D CheckCode       PR                  EXTPGM('CHKCD01R')
    D CHK03R          DS            50    INZ            
    D  PaSL3                  1      2  0                
    D  PaCD3                  3      5                   
    D  PaBZ3                  6     30                   
    D  PaKB3                 31     35                   
    
    D ParCHK03R 	   DS                  likeds(CHK03R)
    D redturnCode                    1a
    
    *RNF3703 20 a      013200  Unterfeld- oder Parameterdefinition nicht in einer Gruppe
                               angegeben.

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Probiers mal so (ohne Gewähr):

    Code:
    D CheckCode       PR                  EXTPGM('CHKCD01R')
    D P1                                  LIKE(CHK03R) CONST
    D P2                                  LIKE(RC)
    D
    D CHK03R          DS            50    INZ            
    D  PaSL3                  1      2  0                
    D  PaCD3                  3      5                   
    D  PaBZ3                  6     30                   
    D  PaKB3                 31     35                   
    
    D RC              S              1
    
     /free                          
      callp(e) CheckCode(CHK03R:RC);
      eval *inlr = *on;
     /end-free

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Hallo,
    ich glaube eher, dass man die Struktur nicht direkt im Prototyp definieren darf. Man muss sie unabhängig vom Prototyp deklarieren und dann im Prototyp mit likeds darauf verweisen.

    Hier der Code:

    D CHK03R_Templ DS 50 Template
    D PaSL3 1 2 0
    D PaCD3 3 5
    D PaBZ3 6 30
    D PaKB3 31 35
    *
    D CheckCode PR EXTPGM('CHKCD01R')
    D CHK03R LIKEDS(CHK03R_Templ)
    D RC 1A

    /free
    callp(e) CheckCode(CHK03R:RC);
    eval *inlr = *on;
    /end-free

    Bei diesem Code ist die Struktur im Prototyp einfach ein einzelner Parameter, der mit LIKEDS auf eine Strukturdefinition verweist.

    Möglicherweise kannst du die Struktur auch nicht mit CONST deklarieren. Das geht nur, wenn dein Programm CHKCD01R das auch als CONST empfängt.

    Gruß,
    Dieter

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Const dient für den Compiler nur als Definition, dass der Inhalt nicht verändert wird.
    Übergeben wird trotzdem nur eine Adresse.
    Der Empfänger benötigt kein Const.
    Const hat noch dann den Vorteil, wenn ich Ausdrücke an eine Funktion übergeben will und nicht immer erst eine Variable füllen muss.
    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Const dient für den Compiler nur als Definition, dass der Inhalt nicht verändert wird.
    Übergeben wird trotzdem nur eine Adresse.
    Der Empfänger benötigt kein Const.
    Const hat noch dann den Vorteil, wenn ich Ausdrücke an eine Funktion übergeben will und nicht immer erst eine Variable füllen muss.
    ... die Hoffnung stirbt zuletzt. RPG stellt vielleicht sicher, dass die Variable nicht verändert wird, wenn sie durchgereicht wird, ist dem Compiler das völlig egal. Der Versuch wird bereits mit einem Programm belohnt, wie so oft, bei der Huddel Programmiersprache RPG.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Apr 2012
    Beiträge
    360
    Zitat Zitat von dschroeder Beitrag anzeigen
    Hallo,
    ich glaube eher, dass man die Struktur nicht direkt im Prototyp definieren darf. Man muss sie unabhängig vom Prototyp deklarieren und dann im Prototyp mit likeds darauf verweisen.

    Hier der Code:

    D CHK03R_Templ DS 50 Template
    D PaSL3 1 2 0
    D PaCD3 3 5
    D PaBZ3 6 30
    D PaKB3 31 35
    *
    D CheckCode PR EXTPGM('CHKCD01R')
    D CHK03R LIKEDS(CHK03R_Templ)
    D RC 1A

    /free
    callp(e) CheckCode(CHK03R:RC);
    eval *inlr = *on;
    /end-free

    Bei diesem Code ist die Struktur im Prototyp einfach ein einzelner Parameter, der mit LIKEDS auf eine Strukturdefinition verweist.

    Möglicherweise kannst du die Struktur auch nicht mit CONST deklarieren. Das geht nur, wenn dein Programm CHKCD01R das auch als CONST empfängt.

    Gruß,
    Dieter

    Hallo,

    habe es mit Likeds versucht, aber ich kenne den Ausdruck Template nicht bzw. habe auch mit dem noch nicht gearbeitet.

    gehört beim Callp(e) CheckCode(CHK03R:RtnCode); nicht das RtnCode entfernt?

    Was habe ich da vermurkst?

    Code:
    D CHK03R_Templ    DS            50    Template                                                
    D  PASL3                  1      2  0                                                         
    D  PACD3                  3      5                                                            
    D  PABZ3                  6     30                                                            
    D  PAKB3                 31     35                                                            
    D*                                                                                            
    D CheckCode       PR                  EXTPGM(' CHKCD01R')                                      
    d                                                                                             
    d CHK03R          DS                  likeds(CHK03R_Templ)                                    
    d  RtnCode                       1a                                                           
    ======>                  aa
    *RNF3703 20 a      013300  Unterfeld- oder Parameterdefinition nicht in einer Gruppe          
                               angegeben.                                                         
    /FREE                                                                                        
            PACD3 = 'TEST';                                                                        
            PASL3 = *ZEROS;    
    ======>                  aa
    *RNF0655 30      2 Der mit dem Schlüsselwort TEMPLATE definierte Eintrag kann in
    
            Callp(e) CheckCode(CHK03R:RtnCode);                                                    
                      *RNF5407 20      2 Mehr Parameter im Prototypaufruf übergeben als zulässig. 
                                                                                                 
           IF RtnCode = '0';                                                                      
             // Error in ...                                                                      
           EndIf;                                                                                 
     /END-FREE

  10. #10
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Template bedeutet, dass die Struktur nur eine "leere" Vorlage ist. Für eine Template-Struktur werden nur 16 Bytes Speicher belegt. Du brauchst die Struktur ja nicht wirklich für den Prototyp. Du benötigt an der Stelle ja nur die Strukturdefinition (ohne Daten). Deshalb habe ich da Template hingeschrieben. Das geht natürlich auch ohne "Template". Dann musst du aber einen andere Namen für die Struktur verwenden (du kannst dich bei likeds ja schließlich nicht auf dich selbst beziehen).

    Dein Problem mit der Fehlermeldung ist das "DS". Da die Struktur nicht selbständig ist, sondern nur ein Parameter des Prototyps, darf da kein DS stehen:
    D CheckCode PR EXTPGM(' CHKCD01R')
    d
    d CHK03R likeds(CHK03R_Templ)
    d RtnCode 1a

    Gruß,
    Dieter

  11. #11
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo Dieter,

    das hätte ich schon mal weggelassen, aber da kommt die Fehlermeldung

    *RNF7030 30 1780 103000 Der Name oder die Bezugszahl/der Anzeiger CHK03R ist nicht
    definiert.

    In dem Template wären ja schon Deklarationen für PACD3 und PASL3 angegeben. Wieso kommt dann aber die Fehlermeldung:
    ======> aa
    *RNF0655 30 2 Der mit dem Schlüsselwort TEMPLATE definierte Eintrag kann in
    diesem Kontext nicht verwendet werden.

  12. #12
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Du musst natürlich auch noch eine richtige Struktur (ohne Template) deklarieren. Du willst die Felder ja schließlich nutzen.

    Folgender Code funktioniert bei mir:
    D CHK03R_Templ DS 50 Template
    D PASL3 1 2 0
    D PACD3 3 5
    D PABZ3 6 30
    D PAKB3 31 35
    *
    D CheckCode PR EXTPGM('CHKCD01R')
    d CHK03R likeds(CHK03R_Templ)
    d RtnCode 1a
    *
    d CHK03R DS likeds(CHK03R_Templ)
    d RtnCode S 1a

    /FREE
    CHK03R.PACD3 = 'TEST';
    CHK03R.PASL3 = *ZEROS;
    Callp(e) CheckCode(CHK03R:RtnCode);
    IF RtnCode = '0';
    // Error in ...
    EndIf;
    *inlr = *on;
    /END-FREE

Similar Threads

  1. Parameterliste im ILE
    By muadeep in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 04-07-06, 14:57
  2. [Java]: RPGCall mit Rückgabe über Parameterliste
    By LoCal in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 25-01-05, 14:58
  3. ILE Parameterliste
    By two in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 04-12-02, 15:10

Berechtigungen

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