PDA

View Full Version : SQL Statement in SQLRPGLE



Seiten : [1] 2 3

Vigi
21-12-11, 08:03
Hallo,
ich habe eine Frage bezüglich embedded SQL. Ich möchte eine Datei auslesen und hinterher in eine Printerfile drucken.

Mein SQL Befehlt sieht wie folgt aus:
EXEC SQL
select * into :test
from scw_data/CXLAGPF
where cxfirm =:DDRFIRM
and cxekvk = 'S'
and cxsart = 'S'
and cxmeng <> 0
and cxstat = ' '
and cxrest <> 0;

In die Variable Test soll der Datensatz geschrieben werden. Nun zu meinem Problem.

1) Es wird nur das erste Feld in die Variable Test geschrieben, wie bekomme ich alle Felder in die Variable oder wie kann ich mehrere Variablen angeben, wo die Werte eingetragen werden?

2) Mit dieser Methode bekomme ich ja immer nur einen Datensatz in die Variable Test. Das SQL müsste aber mehrere ausgeben, wie kann ich mehrere Ergebniss-Datensätze in meine prtf schreiben?

Vielen Dank im Vorraus!!!

LG Vigi

B.Hauser
21-12-11, 08:12
1) Es wird nur das erste Feld in die Variable Test geschrieben, wie bekomme ich alle Felder in die Variable oder wie kann ich mehrere Variablen angeben, wo die Werte eingetragen werden?

2) Mit dieser Methode bekomme ich ja immer nur einen Datensatz in die Variable Test. Das SQL müsste aber mehrere ausgeben, wie kann ich mehrere Ergebniss-Datensätze in meine prtf schreiben?

Vielen Dank im Vorraus!!!

LG Vigi

@1: Definiere Test als Externe Datenstruktur für den Datensatz den Du einlesen willst.

@2: Du musst einen Cursor definieren und die einzelnen Datensätze über eine Lese-Schleife verarbeiten:

SQL Statements:
1. DECLARE
2. OPEN
3. FETCH
4. CLOSE

Nähere Informationen findet man in dem folgenden Redbook - Kapitel 7
Modernizing IBM eServer iSeries Application Data Access - A Roadmap Cornerstone (http://www.redbooks.ibm.com/abstracts/sg246393.html?Open)

Birgitta

Vigi
21-12-11, 08:52
WOW, das war mal ne schnelle Antwort.
Vielen Dank Birgitta!

Dann sieht das ganze schon besser aus:
D Ok C 0
D MyData E Ds Extname(CXLAGPF)

Exec Sql Set Option Datfmt=*Iso, Commit=*None;
EXEC SQL Declare Mycursor Cursor For
select * from scw_data/CXLAGPF
where cxfirm =:DDRFIRM
and cxekvk = 'S'
and cxsart = 'S'
and cxmeng <> 0
and cxrest <> 0
For Fetch Only;
Exec Sql Open Mycursor;

Dow Sqlcode = Ok;
Exec Sql Fetch Mycursor Into :Mydata;
If Sqlcode = Ok;
Exsr SchreibInPRTF;
Endif;
Enddo;

Soweit so klar :)
Meine Daten stehen jetzt in Mydata. Da habe ich aber leider direkt eine "Folgefrage".
Wie spreche ich die einzelnen Feldinhalte aus Mydata an, um diese in die Felder der Printerfile zu übertragen?
Sagen wir mal in der Datei CXLAGPF gibt es die Felder KFirma, KKunde, KUmsatz und in der PRTF PKunde, PFirma, PUmsatz.

Mag sein, dass meine Fragen sehr, naja, unverständlich rüber kommen. Das Problem ist nur, dass ich grad mit SQL in RPG Programmen anfange und nur wenig(eigentlich keine) Zeit zum einarbeiten habe, da der Abgabetermin recht kurzfristig ist.

Darum Danke schonmal für alle hilfreichen Antworten!

LG Vigi

KingofKning
21-12-11, 08:54
Hallo Birgitta, da ich nicht wirklich RPG kann sondern nur Cobol stellt sich mir die Frage ob es das so detailliert auch für Cobol gibt? Kennst Du da was?

GG

Fuerchau
21-12-11, 08:55
Das Problem ist wohl nicht SQL sondern RPG ?
Wie hast du denn nach einem Read/Chain Dateifelder in Druckfelder bewegt ?

Entschuldige bitte die provozierende Frage, aber als RPG-Programmierer müsstest du das ja schon mal wissen.

Ein Fetch ist ja eigentlich nichts anderes als ein READ/CHAIN auf eine Datei.
Die Inhalte stehen dann in den Feldern deiner extern definierten Struktur, so dass du die Daten ebne ganz normal wie sonst auch verarbeiten kannst.

Allrounder
21-12-11, 09:05
Hallo Vigi, aller Anfang ist schwer.
Du kannst die Felder einer Datenstruktur qualifiziert ansprechen:



PKunde = MyData.KKunde;
PFirma = MyData.KFirma;
PUmsatz = MyData.KUmsatz;

Fuerchau
21-12-11, 09:11
Du wirst lachen, aber für Cobol gibts das ganz genauso.

Einziger Unterschied:
Für SQL muss man Felder explizit zugänglich machen:

exec sql begin declare section end-exec.
01 ...
77 ...
exec sql end declare section end-exec.

Dies kann in der Quelle beliebig oft wiederholt werden.

Zusätzlich muss man einmalig die SQLCA einbinden:

exec sql
include SQLCA
end-exec.

Alle anderen SQL-Befehle werden genauso eingebunden wie in RPG/LE.

exec sql
:
:
end-exec.

Für die Fehlerbehandlung ist es am einfachsten am Anfang der Procedure Division einmalig

exec sql
whenever sqlerror continue
end-exec.

einzubinden. Dann kann man die Variable SQLCODE direkt auswerten.

Der Member-Typ ist SQLCBL bzw. SQLCBLLE.

Pikachu
21-12-11, 09:54
Das Problem ist nur, dass ich grad mit SQL in RPG Programmen anfange und nur wenig(eigentlich keine) Zeit zum einarbeiten habe, da der Abgabetermin recht kurzfristig ist.
... und getestet wird später. :rolleyes:

Vigi
21-12-11, 09:58
Top, es läuft.
Es ging mir genau darum, die Felder qualifiziert anzusprechen.

1000 Dank ;-)
Super Team hier!

BenderD
21-12-11, 11:02
... und getestet wird später. :rolleyes:
... die Bananen Strategie im Software Engineering: die Ware reift beim Kunden

D*B

PS: für COBOL und RPG gibt es noch:
http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzajp/rzajp.pdf