[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Konvertieren RPG FREE

    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

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.879
    @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.
    Code:
     /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:
    Code:
     /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:
    Code:
    /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:
    Code:
    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:
    Code:
     /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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke Frau Hauser,

    wie immer sehr kompetent und ausführlich.

    Lg

    Tarki

  4. #4
    Registriert seit
    Apr 2012
    Beiträge
    360
    Code:
         
              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?

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Es würde auch reichen, wenn du gleich
    Code:
    Chain MyKey MyFile;                                             
    If  Not %Found(MyFile);
    schreibst.

  6. #6
    Registriert seit
    Apr 2012
    Beiträge
    360
    Habe die BZ dazu kopiert, um zu verdeutlichen ob der Code dann korrekt wieder arbeitet.

    Lg

Similar Threads

  1. Free RPG für angefangene
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 13-03-12, 13:21
  2. Datum-Konvertierung free rpg
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 14-03-08, 06:21
  3. Frei Porn Site!
    By Fucasdreh in forum NEWSboard Server Job
    Antworten: 0
    Letzter Beitrag: 10-01-07, 13:12
  4. FREE RPG .. TESTN
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 25-01-05, 07:43
  5. Free Rpg Zeitdauer errechnen
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 12-07-04, 09:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •