View Full Version : 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!
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.
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?)
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,
könntest Du mir syntaktisch ein wenig auf die Sprünge helfen?
Mit SQL habe ich noch nicht so viel gearbeitet.
Danke.
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:
C/EXEC SQL
C+ Declare SQLC1 Cursor For
C+ Select a.Feld1, a.Feld2, b.Feld1, b.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.Feld1, b.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
C* Verarbeitung
C enddo
C/EXEC SQL
C+ close SQLC1
C/END-EXEC
Weitere Informationen findest Du unter:
SQL Programming with Host Languages (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/info/rzajp/rzajpmst.pdf)
Birgitta
Hallo Birgitta,
herzlichen Dank für die ausführliche Hilfe!
Das hat mir sehr geholfen!!!
Grüße
Marchfeld