PDA

View Full Version : Schönes, neues free RPG: DCL-PI Frage



Seiten : [1] 2 3

camouflage
11-03-15, 08:33
Seh ich das richtig, dass ich bei einem DCL-PI nicht mehr direkt eine Datenstruktur angeben kann, sondern den Parameter in die Struktur übertragen muss? Und zurück natürlich auch.

Danke für den Feedback.

Fuerchau
11-03-15, 09:47
Nein, LIKEDS(XYDS) funktioniert auch da, so wie früher.

camouflage
11-03-15, 10:13
Hallo Baldur,

klar, blöd ist nur, dass der dcl-pi praktisch nochmals eine Deklaration bewirkt. Heisst, ich kann mich nicht direkt auf die dcl-ds referenzieren. Noch mehr Spass macht's, wenn die Struktur noch extern referenziert ist. :-)

Aber passt schon...

ExAzubi
11-03-15, 13:26
Also das mit dem DCL-PI habe ich nicht ganz durchschaut.... Habe es nciht geschafft drei Parameter in dieser Deklarationsanweisung zu Hinterlegen...

Habe dann wieder die gute alte D-Karte genutzt...

Doku ist auch etwas rar was das Thema angeht... :(

camouflage
11-03-15, 13:44
Hi,

So schwör ist's auch wieder nicht.

Beispiel:


//
// Entry parameter list
//
dcl-pi *n;
$Parm1 char(1);
$Parm2 like(myField);
$Parm3 likeds(myDS);
end-pi;


Parameter 1 und 2 kannste gleich verarbeiten, Parameter 3 muss vorgängig in die myDS verschoben werden damit die Daten richtig zur Verfügung stehen. Ist zumindest meine Erfahrung - wer's besser weiss, nur her damit.

dschroeder
11-03-15, 16:42
Hallo Baldur,

klar, blöd ist nur, dass der dcl-pi praktisch nochmals eine Deklaration bewirkt. Heisst, ich kann mich nicht direkt auf die dcl-ds referenzieren. Noch mehr Spass macht's, wenn die Struktur noch extern referenziert ist. :-)

Aber passt schon...

Wir deklarieren Strukturen als template. Dann belegen sie keinen Speicherplatz und man kann im Programm beliebig oft eine Instanz mit likeds erzeugen:

Z.B.:


dcl-ds testDS_templ qualified template;
text varchar(1000);
netto packed(15:2);
brutto packed(15:2);
end-ds;

dcl-s testDS likeds(testDS_templ);

oder

dcl-pi *n;
inputDS likeDS(testDS_templ);
end-pi;


Die neue dcl-pi - Anweisung ist eine tolle Sache. Jetzt sieht man jedem Parameter direkt an, welchen Datentyp er hat. Bei den alten Parm-Anweisungen konnte man z.B. ein Datumsfeld oder ein Boolean nicht erkennen. Dazu musste man immer erst zu deN D-Anweisungen blättern.

Dieter

Fuerchau
11-03-15, 18:37
Wenn eine DS qualified ist sollte sie bei LIKEDS auch qualified ansprechbar sein, ansonsten wird sie als Zeichenfeld fester Länge definiert.
Den Move kann man sich sparen, wenn man den Pointer einer BASED-DS auf die Adresse des Parameters setzt.

dschroeder
12-03-15, 08:12
Wahrscheinlich habe ich das Problem nicht richtig verstanden. Ich weiß gar nicht, warum ein Move notwendig sein soll. In meinem Beispiel kann man doch direkt mit der empfangenen Datenstruktur "inputDS" arbeiten. Wenn man die nicht qualified haben möchte, lässt man das Schlüsselwort "qualified" einfach weg.

Ein Umschieben ist nur dann erforderlich, wenn sich die dcl-pi Anweisung in einer Procedure befindet und man die Datenstruktur global haben möchte. Im Main-Bereich eines "normalen" RPG-Programms (also in einem Nicht-Serviceprogramm) sind die empfangenen Parameter aber sowieso global. Genauso wie bei *ENTRY PLIST.

Dieter

Fuerchau
12-03-15, 08:36
Der wesentliche Unterschied zwischen *ENTRY PLIST und dcl-pi (bzw. die alte PI-Definition) ist, dass du bei *ENTRY PLIST auf definierte Variablen verweist (incl. der impliziten Definition von Single-Variablen).
Bei PI und dcl-pi definierst du allerdings neue Variablen und verweist eben nicht auf Bestehende.
Daher kann bei LIKEDS(xxx) für das korrekte Ansprechen nur eine qualified-DS verwendet werden.
dcl-pi funktioniert ja i.W. wie ein dcl-ds mit dem kleinen Unterschied, dass jede Variable pointerbasiert ist.

dschroeder
12-03-15, 09:14
Das Schlüsselwort qualified ist bei der DS nicht nowendig. Allerdings stimmt es, dass der Zugriff auf die Struktur nur qualifiziert erfolgen kann.
Folgender Code funktioniert (man beachte, dass kein Schlüsselwort qualified gesetzt ist):


dcl-ds testDS_templ template;
text varchar(50);
netto packed(15:2);
brutto packed(15:2);
end-ds;


test1();


*inlr = *on;


//----------------------------------
dcl-proc test1;


dcl-ds test1DS likeDS(testDS_templ);


test1DS.text = 'hallo';
test2(test1DS);


end-proc;


//----------------------------------
dcl-proc test2;
dcl-pi *n;
inputDS likeDS(testDS_templ);
end-pi;


dsply inputDS.text;


end-proc;