PDA

View Full Version : SQLRPGLE ResultSet in großes Feld



Seiten : [1] 2 3

Malte
18-06-13, 10:01
Hallo alle Zusammen,

ich habe lange gesucht aber nix gefunden.

Darum hoffe ich das mir jemand hier helfen kann.

Ich möchte das ergebnis eines SQL-Befehls den ich Variabel zusammen gebastelt habe in ein großes Text Feld Schieben allerdings krieg ich immer den SQLCODE 30 weil es ja natürlich mehr Felder sind als die eine Hostvariable in die vom PLatz aber alles rein passt.

Nun möchte ich wissen ob das irgentwie
geht das ich das Ergebnis einfach in das
Große 1000A Feld schiebe.

Schonmal danke schön

Mit freundlichen Grüßen,

Malte

Fuerchau
18-06-13, 10:21
SQL ist da halt sehr restriktiv.
Wenn das Ergebnis mehrere Felder hat so sind diese auch einzeln im Fetch anzugeben.
Du kannst dann halt nur per SQL die Felder "zusammenstrippen":

select
F1 concat F2 concat ...
from ...
where

Für numerische Felder musst du diese in Char umwandeln:
a) char(fx) = linksbündig ohne Vornull mit Vorzeichen und Komma
b) digits(fx) = mit vornullen, ohne Vorzeichen und ohne Komma

Für das "auseinandernehmen" der Inhalte bist du dann im RPGLE selber verantwortlich.

B.Hauser
18-06-13, 10:24
Du willst also z.B. die Bestell-Nr., den Liefer-Termin, die Kunden-Nr. und den Kunden-Namen aus der Auftragskopf-Datei ermitteltn, aber anstatt für jede dieser Spalten eine eigene Hostvariable anzulegen, willst Du alles zusammengeknotet als einen langen Satz haben?

Wenn ja muss diese Verknüpfung im SELECT-Statement erfolgen. Numerische Werte und Datums-Felder müssen entsprechend konvertiert werden, z.B. so:


Select Char(BestNr) concat Char(LiefTerm, ISO) concat Char(KndNr) concat KndName concat ....
From ...

Birgitta

Malte
18-06-13, 10:31
danke schon mal für die schnelle antwort

aber das mit dem im SQL schon auswählen geht nicht das Programm macht den Befehl sehr variable die schlüssel felder sind zwar immer gleich aber die Datei wecheselt und es können auch x felder in irgenteiner Länge hintenm drann hängen

das feld soll dann später so aussehen als wenn man in eine Datenstrucktur rein guckt. So das ich es in eine extern Diffiniert Datenstrucktur rein schieben kann.

andreaspr@aon.at
18-06-13, 10:50
Die Spaltenattribute (Datentyp, Länge) könntest du auch dynamisch aus den Systemtabellen einlesen.
Ansonsten kannst du auch mit einem descriptor arbeiten.

lg Andreas

Malte
18-06-13, 11:32
Das mit aus Systemtabelle auslesen klingt ja sehr gut. Aber wie meinst du das mit einem CL-Befehl ? und wenn ja wie krieg ich das Ergebnis in eine DS DIM(XXX)

Gruß Malte

andreaspr@aon.at
18-06-13, 11:45
Aber wie meinst du das mit einem CL-Befehl ?
Wer hat was von CL gesagt?
Oder meinst du das mit dem descriptor?

lg Andreas

Fuerchau
18-06-13, 11:57
Wenn du den SQL selber zusammen baust, also die Felder kennst, kannst du alle per CHAR(xxx) umwandeln und per Concat verküpfen.

Ansonsten gibt es immer noch die Möglichkeit mittels "using SQLDA" zu arbeiten.
Per "Describe Statement" erhältst du eine SQLDA in der jedes Feld des Selects mit Typ und Ausprägung definiert sind.
Nun kannst du in die SQLDA entsprechende Pointer auf deine DS berechnen und den Fetch mit einer SQLDA ausführen.
:):):):):):):)

Malte
18-06-13, 12:17
Ich baue zwar den SQL-Befhel selber zusammen kenn aber nicht alle Felder da es verschiedene PF´s sein können auf die der select geht. Nur die Schlüsselfelder sind immer gleich.

Fuerchau
18-06-13, 12:26
D.h., dass der Benutzer oder wer auch immer die Feldliste selber bestimmt?
Dann ändere die Schnittstelle so, dass dir die Felder in z.B. einem Array übergeben werden, so dass du den SQL mittels "char(xxx) concat ..." zusammenbauen kannst.

Ansonsten bleibt dir nichts anderes übrig als dich mit SQLDA zu beschäftigen oder auf die C-API's SQL-CLI umzusteigen (was auch nicht ohne ist).