PDA

View Full Version : Feldgruppe mit einem SQL Stmt füllen



Seiten : [1] 2

ILEMax
03-02-11, 12:54
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

BenderD
03-02-11, 13:07
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

ILEMax
03-02-11, 13:13
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

B.Hauser
03-02-11, 13:14
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

BenderD
03-02-11, 13:27
@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

ILEMax
03-02-11, 13:57
@Birgitta
Doch doch, das hätt ich so definiert

@BenderD
Prima, danke! das hilft !!

ILEMax
23-02-11, 16:18
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

B.Hauser
23-02-11, 16:35
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

ILEMax
23-02-11, 16:56
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

B.Hauser
23-02-11, 17:10
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