Anmelden

View Full Version : SQL hat mehrere Sätze als Ergebnis, in der IFS-Zieldatei landet aber nur einer.



Seiten : [1] 2

msost
12-06-17, 14:52
Ich habe eine Routine, die aus einer IFS-Datei ein SQL Statement liest. Dies ist ein Select, der mit XMLDOCUMENT und XMLROW eine XML-Struktur aufbaut. Das Ergebnis sind mehrere Rows. Diese sollen in eine IFS-Datei weggeschrieben werden. Funktioniert im Grundsatz auch, es kommt aber nur ein Satz in der Datei an. Baue ich keine Schleife um den Fetch, dann ist es der erste, mit Do-Schleife der letzte. Ich seh also zwar was passiert, aber meinen Fehler nicht...

Tips welcome!



// RunSQL Subroutine
// -----------------
begsr RunSQL;

// Prepare SQL from SQL-String
EXEC SQL
PREPARE selectstm FROM :sqlstring;

// Declare Cursor for prepared SQL
EXEC SQL
DECLARE INXML CURSOR FOR selectstm;

// Open Cursor
EXEC SQL
OPEN INXML;

dow sqlcod = 0;
// Fetch SQL Data into XML-Clob Locator
EXEC SQL
FETCH NEXT FROM INXML
INTO :IXMLLoc;
if sqlcod <> 0;
leave;
endif;

// Store Data in Host-Variable
EXEC SQL
SET :IXMLDta = :IXMLLoc;

// Store Data in IFS-File
EXEC SQL
SET :IXMLDoc = :IXMLLoc;
enddo;

// Close SQL-Cursor
EXEC SQL
CLOSE INXML;

// Free Clob-Locator Space
EXEC SQL
FREE LOCATOR :IXMLLoc;
endsr;

Fuerchau
12-06-17, 14:58
Das erklärt sich doch von selber:

// Store Data in IFS-File
EXEC SQL
SET :IXMLDoc = :IXMLLoc;
Dies hängt doch nicht an die IFS-Datei an sondern überschreibt sie.

mk
12-06-17, 15:03
Hi,

jedes SQL setzt einen SQLCOD
Mal mit dem Debugger prüfen

Fuerchau
12-06-17, 15:30
Nun, schau dir die Schleife mal an:
Je Fetch wird der LOB-Locator in eine Datei (IXMLDoc wird wohl eine IFS-Datei sein) ausgegeben. Da dies nie Daten anhängt, wird eben die letzte Zeile in der IFS-Datei stehen.
Man muss den SQL bereits so aufbauen, dass genau 1 Zeile zurückgegeben wird, so dass auch nur 1 XML-Document erstellt wird und nicht je Zeile ein eigenes Dokument.

msost
12-06-17, 16:32
Jupp, korrekt. Danke!
Hatte zwischenzeitlich mal in der CLOB-Definition aus dem SQFOVR einen SQFAPP gemacht, der dann ja fleißig hinten dran hängt. Aber natürlich pro Zeile ein Dokument. Das ist natürlich etwas viel des Guten.

Aber jetzt ist man ja nur noch halbblind... der Rest sollte sich finden...

msost
13-06-17, 14:40
Hallo, ich hab da doch noch mal 'ne Frage dazu.

Ich erhalte derzeit noch die Angaben von XMLDOCUMENT vor jeder XMLROW. Habe gedacht, ich muß nur in dem auszuführenden SQL ein XMLAGG einbauen, damit der FETCH im RPG dann alles als eine Zeile zusammen bekommt.

Baue ich aber XMLAGG ein, bekommen ich einen Conversion Error.

Hat jemand Erfahrung mit XMLAGG und ggf. ein Beispiel?

msost
13-06-17, 15:22
Kommando zurück, hab ihn gerade selbst gefunden.
SELECT
XMLELEMENT( Name "Range"
XMLAGG(
XMLROW( Feld1 as "Fld 1")... OPTION ROW "Rowfields") ) )
FROM FILE1

Rainer Ross
13-06-17, 16:27
Hallo Forum,

anbei ein cleveres SQL-Statement, das ich bei Birgitta Hauser - an dieser Stelle vielen Dank an Dich - gelernt habe. Es lohnt sich wirklich, bei ihr in den Kurs zu gehen.



select XMLSERIALIZE(
XMLELEMENT(NAME "data",
XMLAGG(
XMLROW(
trim(kndnr) as "nummer",
trim(name) as "name",
trim(land) as "land",
trim(plz) as "plz",
trim(ort) as "ort",
trim(str) as "strasse",
umsatz as "umsatz"
option row "item")
)
) as CLOB(2G)
INCLUDING XMLDECLARATION)
AS XML_DOCUMENT
FROM (
select * from myapp.kndstap
where kndnr = 1
) x;

Herzliche Grüße
Rainer

Fuerchau
13-06-17, 16:38
Und wie gestalte ich ein geschachteltes XML-Dokument, dass Kopf- und Positionsdaten enthält?
Und zu den Positionsdaten ggf. Preis- und Rabattinformationen?
Das gibt das Handbuch leider auch nicht her.
Die Beispiele behandeln immer nur 1-stufige Hierarchien.
Hat jemand dazu mal ein Beispiel?

ORDER
- KUNDE NAME = "ABCD"
- - ARTIKEL NAME = "TEIL 1"
- - - PREIS WERT = "10,00"
- - - PREIS RABATT = "-5%"
- - ARTIKEL NAME = "TEIL 2"
- - - PREIS WERT = "9,95"
- - ARTIKEL NAME = "TEIL 3"
- - - PREIS WERT = "12,50"
- - - PREIS NACHLASS = "2,45"

B.Hauser
13-06-17, 18:08
Und wie gestalte ich ein geschachteltes XML-Dokument, dass Kopf- und Positionsdaten enthält?
Und zu den Positionsdaten ggf. Preis- und Rabattinformationen?
Das gibt das Handbuch leider auch nicht her.
Die Beispiele behandeln immer nur 1-stufige Hierarchien.
Hat jemand dazu mal ein Beispiel?


Die Kunst ist die Übersetzung von der relationalen Form der Datenbank in die hierarchische Form des XML-Dokuments und umgekehrt.
Man kann ein XML-Dokument durchaus mit mehreren Common Table Expressions, deren Ergebnisse man wieder miteinander verknüpft, sortiert und weiter aggregiert aufbauen.
Wenn man es richtig macht bleiben auch komplexe SQL-Statements zur Aufbereitung von XML-Dokumenten immer noch lesbar.

Das kann man übrigens bei mir in der Schulung lernen.

Birgitta