[NEWSboard IBMi Forum]

Thema: QPNQRYF

  1. #1
    Registriert seit
    Jun 2003
    Beiträge
    7

    Unhappy QPNQRYF

    Hallo Leute!
    Eine "dumme" Frage: Ich habe im CLP per QPNQRYF eine "OPNID" bestimmten Namens (z.B: "JOINFILE")über 2 physische Dateien eröffnet. Wie geht es jetzt weiter?
    1) Muß ich beide Dateien vorher mit OVRDBF SHARE *YES überschreiben?
    2) Mit welchem Namen spreche ich die mit OPNQRYF erstellte Sicht im PRG-Pgm an? Wo spielt da die "OPNID-Joinfile" eine Rolle?
    3) Den CLOF mache ich auf "JOINFILE", das habe ich herausgefunden, aber im RPG...??

    Vielen Dank für alle Ratschläge im voraus und beste Grüße!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Im RPG kann ich nur auf existierende Dateien (bei Extern) zugreifen, da dies bereits bei der Erstellung des Programmes geprüft wird.
    Die andere Variante ist eine interne DISK-Datei, aber zu aufwändig.

    Normalerweise verwendet man in RPG eine existierende LF (auch ggf. Join) für die Umwandlung.

    Im CLP wird dann ein OPNQRYF verwendet um im RPG z.B. mit InputPrimary zu arbeiten. Zusätzlich muss natürlich ein OVRDBF ... SHARE(*YES) angegeben werden, da RPG sonst nicht die temporäre QRYF öffnet.

    Die andere Verwendung von OPNQRYF ist noch CPYFRMQRYF.

    Dies ist allerdings nur dann sinnvoll, wenn man weder Query/400 noch SQL mit QM installiert hat.
    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
    Jun 2003
    Beiträge
    7

    QPNQRYF

    Naja, das Problem ist aber, daß ich kein DDS habe (LF) und daher die Aufgabe mit OPNQRYF lösen möchte.
    Das Problem ist eben nur, daß ich nicht weiß, ob man das Ergebnis so eines QPNQRYF mit 2 Dateien im RPG verwenden kann. (Dateiname der 1.Datei?)

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928

    SQL?

    RPG benötigt zum Compile-Zeitpunkt eine Datei-Beschreibung.

    Hast Du kein SQL auf der Maschine?
    Mit SQL kann man solche Joins viel eleganter realisieren.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Jun 2003
    Beiträge
    7

    Thumbs up

    Birgitta,

    könntest Du mir syntaktisch ein wenig auf die Sprünge helfen?
    Mit SQL habe ich noch nicht so viel gearbeitet.

    Danke.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928

    SQL

    Die Quellenart ist SQLRPGLE (oder bei RPGIII SQLRPG)

    Ein SQL-Statement beginnt mit C/EXEC SQL
    und endet mit C/END-EXEC.
    Die dazwischenliegenden Zeilen beginnen mit C+

    Embedded SQL kann im Free-Format-RPG nicht verwendet werden, d.h. die Free-Format-Codierung muss zunächst mit /END-FREE beendet werden.

    Verwendete Variablen werden mit führendem Doppelpunkt (:MyFld) angegeben.

    Für eine Einzel-Satz-Verarbeitung in RPG benötigst Du folgendes:
    1. Declare Cursor für das SQL-Statement
    (entspricht in etwa den F-Bestimmungen)
    Der Cursorname ist frei wählbar und muss innerhalb der Quelle eindeutig sein.
    2. Open Cursor
    (entspricht in etwa Öffnen der Datei und Positionieren)
    3. Fetch
    (entspricht dem Read)
    Die Ausgabe-Felder können entweder einzeln aufgelistet werden, oder als Datenstruktur angegeben werden.
    4. Close
    (Datei schliessen)

    Um auf Datei-Ende bzw. Satz nicht gefunden abzufagen benutzt Du entweder:
    1. SQLCOD = 100 oder
    2. SQLSTT = '02000'

    SQLCOD < 0 heisst Fehler. Die zugehörige Message-Id kannst Du aus der Message-File QSQLMSG entnehmen.
    Die Message-Id ist 'SQL' + absolut-Wert des SQLCODs.
    Variable Message-Texte findest Du in SQLERM.

    Nun ein Beispiel:
    PHP-Code:
    C/EXEC SQL                                           
    C
    + Declare SQLC1 Cursor For                         
    CSelect a.Feld1,  a.Feld2,  b.Feld1b.Feld2               
    C
    From   MyFile1 a join MyFile2 b
    C
    +                on     a.KeyFld1 b.KeyFld1
    C
    +                   and a.KeyFld2 b.KeyFld2                                    
    C
    where      a.Feld1      = :MyVar1
    C
    *****  weitere Selektions-Kriterien                
    C
    order by   a.Feld1b.Feld2                   
    C
    + For Read Only                
    C
    /END-EXEC         

    C
    /EXEC SQL            
    C
    +     open SQLC1    
    C
    /END-EXEC

    C                   
    Do        *HIVAL                                          
    C
    /EXEC SQL                                                                    
    C
    Fetch SQLC1 into :Feld1,  :Feld2,  :Feld3,  :Feld4                        
    C
    /END-EXEC                                                                    
     
     
    Last Record                                            
    C                   
    If            SQLCOD  100      
    C                   Leave                            
    C                   
    Endif        

     * 
    Fehler
    C                   
    IF            SQLCOD  0        
    C
    ******  Fehlerhandling       
    C                   iter                             
    C                   
    Endif           
                     
    CVerarbeitung
    C                   enddo            

    C
    /EXEC SQL                   
    C
    +    close SQLC1           
    C
    /END-EXEC 
    Weitere Informationen findest Du unter:
    SQL Programming with Host Languages

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Jun 2003
    Beiträge
    7

    Talking

    Hallo Birgitta,

    herzlichen Dank für die ausführliche Hilfe!
    Das hat mir sehr geholfen!!!

    Grüße
    Marchfeld

Berechtigungen

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