View Full Version : Feldgruppe mit einem SQL Stmt füllen
Hi,
ich möchte aus einer Datei 10 - 15 Sätze selektieren und in eine Feldgruppe schreiben.
Das ganze soll idealerweise mit SQL geschehen.
Muß ich da in Schleife fetchen
oder geht sowas wie
select wert from Datei into :Feldgruppe where Bedingung
(for all records oder etwas ähnliches)
und ist das dann ein "result set" ?
Danke Max
declare c1 cursor for select ...
open cursor c1
fetch from c1 for 10 rows into :myds
close c1
ein Blick in die SQL Reference hilft ungemein
D*B
Hi,
ich möchte aus einer Datei 10 - 15 Sätze selektieren und in eine Feldgruppe schreiben.
Das ganze soll idealerweise mit SQL geschehen.
Muß ich da in Schleife fetchen
oder geht sowas wie
select wert from Datei into :Feldgruppe where Bedingung
(for all records oder etwas ähnliches)
und ist das dann ein "result set" ?
Danke Max
Hi und danke
so ähnlich hätte ich es auch gemacht
Aber das ... for 10 rows
geht m.e. so nicht, da ich ja nicht weis ob es 10, 12 oder 15 Werte sind.
mit declare und fetch ist das schon klar (dank Sql Reference)
Wenn auch mit der Schleifenbedingung im RPG.
Hatte gehoft es ohne machen zu können
Max
Vielleicht wurde das aus Dieters Antwort nicht ganz klar:
Du kannst nicht direkt in eine Feldgruppe fetchen, wohl aber in eine Array Datenstruktur oder eine Mehrfach-Datenstruktur.
D MyDS DS Dim(100)
D MyFld 10A
Unter Result Sets versteht man i.d.R. Tabellen (mit beliebig vielen Sätzen) die aus einer Stored Procedure zurückgegeben werden.
Birgitta
@Birgitta: Feldgruppen Arrays und den Firlefanz habe ich bereits verdrängt
@ILEMax: man gibt die obere Menge an (soviele, wie DIM bei der DS) und in der SQLDA steht drin wieviele man wirklich bekommt.
Vorteil für diesen multiple row fetch ist die Geschwindigkeit. 1000 Sätze dauern ungefär solange wie einer!
Nachteil ist die etwas kompliziertere Schleifenlogik und dass kein positionierter update mehr geht; letzteres frisst den Zeitvorteil mehr als auf, wenn man alle Sätze ändern will.
D*B
@Birgitta
Doch doch, das hätt ich so definiert
@BenderD
Prima, danke! das hilft !!
Jetz muß ich doch noch mal fragen ...
D MyDS DS Dim(100)
D MyFld 10A
geht nicht, da fehlt ein qualified
Und wenn ich dann ein lookup mache geht der wiederum nicht.
*RNF5123 30 421 013900 Eintrag für Faktor 2 der Operation LOOKUP ist keine Tabelle
IleMax
OpCode LOOKUP kann nicht für Array-Datenstrukturen verwendet werden. Die Built-In-Funktionen %LOOKUPxx können (ab Release 7.1 --> %LookUp('XXX': MyArrDS(*).Subfield) ) für Array-Datenstrukturen verwendet werden.
Ansonsten hilft nur eins: Array-Datenstruktur in Feldgruppe umladen und dann den Lookup machen.
Birgitta
Sorry aber ich bin wohl zu blöd.
Mit
D Frg s 4S 0 DIM(%elem(myds))
movea Myds Fgr
kommt nur das 1. Element an. So dusselig kann man sich doch garnich anstellen oder ?
Max
Das Problem liegt daran, dass Array Datenstrukturen und Feldgruppen anders aufgebaut sind.
MoveA funktioniert auf keinen Fall.
Da in der Array-Datenstruktur nur ein Unterfeld definiert ist und angenommen das Datenstruktur-Unterfeld ist genau so definiert wie das Feldgruppen Element, könnte das Ganze wie folgt funktionieren.
D MyArrDS DS Dim(100) qualified
D MyFld 10A
D MyFGDS DS
D MyFG 10A Dim(%Elem(MyArrDS))
/Free
MyFGDS = MyArrDS;
/End-Free
Sollte dies nicht funktionieren, musst Du leider eine Schleife bauen:
/Free
For Index = 1 to %Elem(MyArrDS)
MyFG(Index) = MyArrDS(Index).MyFld;
EndFor;
/End-Free
Birgitta