Die dynamischen Arrays sind die Antwort auf die alte Frage: wie groß muss ich mein Array machen, damit alle Elemente hineinpassen. Zusätzlich ergeben sich weitere Vorteile, die in diesem Artikel behandelt werden.

(1) Systemvoraussetzungen

Mit 7.4 sind die dynamischen Arrays eingeführt worden, in 7.5 bereits enthalten und werden für 7.3 per Technologie Refresh ausgeliefert.

 

(2) Die Definition

Sie ist sehr einfach. Es wurden zwei neue Schlüsselworte – *VAR und *AUTO – eingeführt, die zusätzlich zu der Anzahl der maximalen Elemente angegeben werden.

dcl-s VarArray    Char(10)    Dim(*Var:1000);

dcl-s AutoArray   Char(10)    Dim(*Auto:1000);

 

Was ist der Unterschied der beiden Arrays?

Beim *VAR Array kann der Programmierer die Anzahl der Elemente mit %ELEM bestimmen. Er kann die Anzahl der Elemente vergrößern oder verkleinern. Beim *AUTO Array wird das Array automatisch über das Laden der Elemente vergrößert. Die Anfangsgröße der dynamischen Arrays ist null Elemente. Das ermitteln der Elemente geht mit %ELEM.

Für Programmierer, die mit qsort Arrays sortieren und sich mit %ADDR die Speicheradresse für das Array holen, ist zu beachten, dass sich die Adresse des Arrays ändern kann, weil die Speicherzuweisung in diesem Fall dynamisch erfolgt. In diesem Fall müssen sie sich vor dem qsort jeweils die aktuelle Adresse des Arrays mit %ADDR holen.

Betrachten wir zunächst ein normales Array:

dcl-s Array       Char(10)    Dim(1000);

 

Das Array enthält 1.000 Elemente und die Operationen SORTA, %LOOKUP und jetzt neu %CONCATARR werden mit diesen 1.000 Elementen durchgeführt. Wenn jetzt z.B. nur 5 Elemente im Array vorhanden sind, dann hat das dynamische Array Vorteile in Bezug auf Performance, Speicherbelegung und Handling.

 

(3) Operationen mit dynamischen Arrays

Wir laden zunächst zwei Elemente in ein variables dynamisches Array.

dcl-s VarArray    Char(10)    Dim(*Var:1000);

%Elem(VarArray) = 2;

VarArray(1) = ‚eins‘;

VarArray(2) = ‚zwei‘;

 

Jetzt vergrößern wir das Array um 1 und laden ein weiteres Element in das Array

%Elem(VarArray) = 3;

VarArray(3) = ‚drei‘;

Counter = %Elem(VarArray);

 

Die Variable Counter enthält jetzt die Zahl 3.

Noch einfacher lässt sich das dynamische Array mit %LIST laden.

Zunächst das variable dynamische Array:

dcl-s VarArray    Char(10)    Dim(*Var:1000);

%Elem(VarArray) = 3;

VarArray = %List(‚eins‘:’zwei‘:’drei‘);

 

Jetzt laden wir mit %LIST Daten in das automatische dynamische Array. In diesem Fall wird die Anzahl der Element automatisch ermittelt und muss nicht vorher mit %ELEM erzeugt werden.

dcl-s AutoArray   Char(10)    Dim(*Auto:1000);

AutoArray = %List(‚eins‘:’zwei‘:’drei‘);

 

Betrachten wir jetzt das Laden eines automatischen Arrays über eine Schleife. In diesem Fall lade ich fünf Jahre beginnend mit dem aktuellen Jahr in das Array.

dcl-s AutoArray   Packed(4)   Dim(*Auto:1000);

dcl-s Index       Uns(10);

For Index = 1 to 5;

AutoArray(Index) = %Subdt(%Date + %Years(Index – 1):*Years);

Endfor;

 

Mit den dynamischen Arrays wurde das neue Schlüsselwort *Next eingeführt. Mit diesem neuen Schlüsselwort sieht der Programmcode so aus:

dcl-s AutoArray   Packed(4)   Dim(*Auto:1000);

dcl-s Index       Uns(10);

For Index = 1 to 5;

AutoArray(*Next) = %Subdt(%Date + %Years(Index – 1):*Years);

Endfor;

 

Das Auslesen des Arrays ist sehr einfach:

dcl-s AutoArray   Packed(4)   Dim(*Auto:1000);

dcl-s Index       Uns(10);

For Index = 1 to %Elem(AutoArray);

Dsply AutoArray(Index);

Endfor;

 

Eine neue Möglichkeit für das Auslesen des Arrays bietet die For-Each Methode:

dcl-s AutoArray   Packed(4)   Dim(*Auto:1000);

dcl-s Index       Uns(10);

dcl-s Year        Packed(4);

For-Each Year in AutoArray;

Dsply %Char(Year);

Endfor;

 

Eine schöne Möglichkeit aus dem Array einen CSV-String zu machen bietet %ConcatArr, der mit dem letzten Technologierefresh eingeführt wurde:

dcl-s AutoArray   Packed(4)   Dim(*Auto:1000);

dcl-s Index       Uns(10);

dcl-s String      Varchar(100);

For Index = 1 to 5;

AutoArray(*Next) = %Subdt(%Date + %Years(Index – 1):*Years);

Endfor;

String = %ConcatArr(‚; ‚:%Char(AutoArray));

Ergebnis: 2023; 2024; 2025; 2026; 2027

 

Zu guter Letzt gibt es die Möglichkeit mit einen SQL Fetch ohne Leseschleife alle Datensätze in ein Array zu laden. Da ich die Anzahl der Datensätze nicht weiss, verwende ich das automatische dynamische Array. Ich arbeite mit der Datei QIWS/QCUSTCDT, die auf jeder Maschine vorhanden ist und 12 Datensätze enthält. Nach dem Lesen der Datei direkt in das Array ist das Array genau 12 Elemente groß.

QIWS/QCUSTCDTQuelle: Ross

QIWS/QCUSTCDT

 

Viel Spaß beim Ausprobieren.

Der Autor Rainer Ross schreibt regelmäßig für den TechKnowLetter.

Sie erreichen ihn unter:

Rainer Ross IT-Beratung, Bgm.-Hollweck-Str. 6, 85599 Parsdorf

Ausgezeichnet mit dem Innovationspreis der IBM und Spezialist für Webservices und Webanwendungen auf IBM i so schnell wie Greenscreen.

Beispiel: www.myhofi.com/myapps/HTML/Myapp.html

Tel. (+49) 171/963 79 23 oder 089/413 252 94,

E-Mail: rainer_ross[at]web.de

 

Sechs Ausgaben des TechKnowLetters erhalten Sie hier für 88 Euro.