-
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
Code:
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
 Zitat von ILEMax
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
Code:
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.
Code:
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.
Code:
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:
Code:
/Free
For Index = 1 to %Elem(MyArrDS)
MyFG(Index) = MyArrDS(Index).MyFld;
EndFor;
/End-Free
Birgitta
-
Code:
D MASN DS DIM(30) QUALIFIED
D MA 4S 0
D DS
D M 4S 0 DIM(%ELEM(MASN))
oder
Code:
D MASN DS DIM(30) QUALIFIED
D MA 4S 0
D mm DS
D M 4S 0 DIM(%ELEM(MASN))
Beides versucht.
sowohl die schleife als auch dein 1. vorschlag bringen
Code:
*RNF5343 30 505 019600 Feldgruppe hat zu viele übergangene Indizes; die Bestimmung
wird ignoriert.
Wuste gar nicht,das ILERPG so schwer ist.
HILFE
Max
-
Also ... das folgende Beispiel kann problemlos umgewandelt werden (Release V5R4).
Code:
D MyArrDS DS Qualified Dim(10) inz
D MyFld 4S 0
D MyFGDS DS Inz
D MyFg 4S 0 Dim(%Elem(MyArrDS))
D Index S 3U 0
***********************************************
/Free
*InLR = *On;
MyArrDS(1).MyFld = 111;
MyArrDS(2).MyFld = 222;
MyArrDS(3).MyFld = 333;
Clear MyFg;
For Index = 1 To %Elem(MyArrDS);
MyFg(Index) = MyArrDS(Index).MyFld;
EndFor;
Return;
/End-Free
Birgitta
Similar Threads
-
By homue in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 18-07-07, 16:47
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By FNeurieser in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 11-10-06, 14:53
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-06, 14:11
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks