PDA

View Full Version : Konvertieren RPG FREE



tarkusch
21-07-12, 07:50
Hallo liebes Forum,

bin ein Azubi und muss mir in Free sehr vieles selber aneignen und habe an euch, leider viele Fragen.

1. Habe bei einem Arbeitskollegen gesehen das die RDi verwenden, kann man das als OpenSource beziehen?

2. Wie müsste da eigentlich die Built in Funktion %REM aussehen

C W1MINU DIV 60 W2ZEIT
C MVR NF20
C Eval W2ZEIT * 100 + NF20

3. CHAIN
im Free CHAIN(N) KEY ZWT12;
*IN99 = NOT %FOUND;

%FOUND = *IN99 = *OFF;
NOT %FOUND = *IN99 = *ON;

Die Bezugszahlen sind von mir richtig gedeutet worden oder?

4.Wie verhält es sich eigentlich bei setll und %Equal

Falls vorhanden %Equal Bezugszahl ist *ON oder?

5. COM
C W1KZ2A COMP 'X1' 88
Wie kann ich das in Free umsetzen.
Wenn w1KZ2A auch 2 stellen hat kann ich diese Anweisung schreiben?
IF W1KZ2A = 'X1';
*IN88 = *ON;
Endif;

Wie müsste ich vorgehen wenn W2KZ2A nur 1-stellig ist?

6. Wie bekomme ich eigentlich von einem 8-Stelligen nummerischen Feld am elegantesten die ersten 2 Stellen auch in ein nummerisches Feld?

7. In den alten souren steht immer Do *HIVAL wie müsste das eigentlich im Free aussehen?


8. C *IN75 CABEQ *OFF ANFANG
Das ist eigentlich ein ordinäres GOTO oder?

Möchte mich schon mal im Voraus bedanken

Tarki

B.Hauser
22-07-12, 10:21
@1: Es gibt eine 70-tägige Testversion. Nach Ablauf der 70 Tage benötigst Du entweder eine kostenpflichtige Lizenz oder kannst das Produkt nicht mehr verwenden. Vielleicht kannst Du noch irgendwo eine alte WDSC 7.0-Version auftreiben, die war kostenlos.

@2.

/Free
W2Zeit = %Div(%Int(W1MINU): 60);
Rest = %Rem(%Int(W1MINU): 60);
HHMM = W2Zeit * 100 + Rest;

//Oder
HHMM = %Div(%Int(W1MINU): 60) * 100 + %Rem(%Int(W1MINU): 60);
/End-Free

Sofern W1MINU ohne Nachkommastellen definiert ist, kann die Konvertierung mit %INT entfallen.

@3 Im Free Format wird komplett ohne Bezugszahlen gearbeitet. Stattdessen müssen/können bei Schreib/Leseoperationen die Built-In-Funktionen %EOF, %FOUND, %ERROR und %EQUAL verwendet werden.
Sofern Du Teile von alten Programme umsetzen willst, in denen die Bezugszahlen weiterhin verwendet werden, muss Du diese wie folgt umsetzen:

/Free
Chain(N) (KeyFld1: KeyFld2: ... KeyFldN) MyFormat;
*IN99 = Not %Found(MyFile);

If %Found(MyFile); //entspricht *IN99 = *OFF
//Satz gefunden
EndIf;
Bei den Built-In-Funktionen %FOUND oder %EOF solltest Du IMMER den Datei-Namen angeben, ansonsten wird die Einstellung der letzten Dateioperation ausgegeben.

@4. Bei SETLL werden sowohl die Built-In-Funktionen %EQUAL als auch %FOUND gesetzt.
%EQUAL wird auf *ON gesetzt, wenn mindestens ein Datensatz mit dem angegebenen Schlüssel vorhanden ist.
%FOUND wird auf *ON gesetzt, wenn ein folgender READ oder READE erfolgreich wäre, das heißt jedoch nicht zwangsläufig, dass ein Datensatz mit genau dem angegebenen Schlüssel vorhanden ist.
Wenn Du also einen CHAIN durch einen SETLL ersetzten willst, um festzustellen dass ein Datensatz vorhanden ist, musst Du die Built-in-Funktion %EQUAL prüfen und nicht %FOUND. Auch wenn in 95% aller Fälle beide Funktionen das gleiche Ergebnis liefern.

@5. Der OpCode COMP ist so alt, dass ich ihn das letzte Mal am Anfang meiner "RPG-Karriere" so ca. 1867 gesehen habe. Da die Position der Bezugszahl aus Deinem Code nicht ersichtlich ist, gehe ich davon aus, dass sie auf der letzten Position (Gleich) steht. In diesem Fall kannst du den Source-Code so wie in Deinem Beispiel übersetzen.

Du kannst das Ganze auch in einer Zeile machen:

/Free
*IN88 = (W1KZ2A = 'X1');
/End-Free

Bei einem einstelligen Feld kannst Du auch nur eine Stelle, also entweder X oder 1 prüfen.

Da in Free Format eigentlich ohne Bezugszahlen (zumindest ohne *IN01-*IN99) gearbeitet wird, würde ich auch keine Bezugszahl setzten, sonder immer direkt die Bedingung (IF W1KZ2A = 'X1') prüfen.

@6: Am einfachsten macht man das in einer Datenstruktur:

D MyDS DS
D MyNum8 8S 0
D MyNum21 2S 0 Overlay(MyNum8)
D MyNum22 2S 0 Overlay(MyNum8: *Next)
/Free
MyNum8 = 12345678;
Dsply MyNum21;
/End-Free

Man kann natürlich auch ein Konstrukt aus diversen Built-in-Funktionen verwenden:

/Free
MyNum21 = %Dec(%Subst(%EditC(MyNum8: 'X'): 1: 2): 2: 0);
/End-Free

@7: Der OpCode DO wird im Free-Format nicht unterstützt. Du musst einen der OpCodes DOW, DOU oder FOR verwenden.
Sofern Du eine Endlos-Schleife (DO *HIVAL) programmieren willst, musst Du eine Bedingung angeben, die nie wahr wird (z.B. DOU 0=1; )

@8: CABxx steht für compare and branch und ist nichts anderes als eine IF-Bedingung mit einem GOTO.
Im Free-Format werden allerdings weder CABxx noch GOTO noch TAG unterstützt.
In einer sauberen, gut strukturierten modularen Programmierung sind diese OpCodes auch nicht notwendig ... und der Quellcode bleibt trotzdem lesbar.

Birgitta

tarkusch
22-07-12, 15:15
Danke Frau Hauser,

wie immer sehr kompetent und ausführlich.

Lg

Tarki

tarkusch
08-10-12, 11:36
Chain MyKey MyFile;
*IN50 = Not %Found(MyFile);
If *IN50 = *OFF;
Clear WK2KST;
Chain MyKey MyFile;
*IN50 = Not %Found(MyFile);
If *IN50 = *OFF;
F2KOST = F2AKT;
Else;
F2KOST = F2KOST_Sv;
EndIf;
EndIf;

/End-Free
c MyKey chain MyFile 50
c 50 clear Wk2kst
c 50MyKey chain MyFile 50
c if *in50 = *off
c eval F2KOST = F2AKT
c else
c eval F2KOST = F2KOST$
c endif


Frau Hauser habe ich das korrekt aufgelöst?

andreaspr@aon.at
08-10-12, 11:59
Es würde auch reichen, wenn du gleich

Chain MyKey MyFile;
If Not %Found(MyFile);

schreibst.

tarkusch
08-10-12, 12:34
Habe die BZ dazu kopiert, um zu verdeutlichen ob der Code dann korrekt wieder arbeitet.

Lg