[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    32

    RPG Zyklusfrei - Felder initialisieren

    Hallo,

    ich erstelle meine RPG-Programme seit einiger Zeit zyklusfrei (also mit main und pi, ohne *inlr). Jetzt fällt mir auf, dass beim zweiten Programmaufruf die Programmfelder oder Datenstrukturen den selben Wert haben wie beim ersten Aufruf (so wie früher bei *inrt). Erst wenn ich mich abmelde und wieder neu anmelde, sind die Felder wieder initialisiert. Gibt es eine Möglichkeit beim zweiten Aufruf so zu starten, als ob ich das Programm mit *inlr verlassen hätte, oder muß ich jedes Feld einzeln initialisieren.

    Danke für Eure Hilfe

  2. #2
    Registriert seit
    Apr 2005
    Beiträge
    385
    Wenn das Programm geöffnet bleibt... Wen kein INLR dann wird ja nur per RETURN verlassen und somit bleibt das Programm im Speicher...
    Entweder: alle Variabelen beim Start neu initaliseren (*INZSR Subroutine wird nicht aufgerufen)
    Oder : *INLR verwenden....

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    32
    Gibt es keine Möglichkeit, bei Beendigung der Main Procedure das Programm aus dem Speicher rauszubekommen?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Zur Zeit nur per RCLACTGRP.
    Selbst Zyklusprogramme, die mit INLR = *on verlassen werden, verbleiben ja im Speicher.
    Die Runtime prüft nur beim Aufruf, ob INLR an war beim Verlassen um eben INZSR erneut aufzurufen.

    Das ist halt der Nachteil von statischen Variablen.
    Im ILERPG kann man aber auch nun den Autostorage statt Staticstorage definieren, der vergleichbar zu Stackvariablen ist.
    Diese werden bei erneutem Aufruf mit der INZ-Anweisung auch erneut initialisiert.
    Ein weiterer Vorteil ist dies bei rekursiven Aufrufen von Prozeduren/Funktionen, da diese dann immer auch ein neues Set an Variablen bekommt.
    Statische und Autovariablen lassen sich auch mischen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von mgraskamp Beitrag anzeigen
    Gibt es keine Möglichkeit, bei Beendigung der Main Procedure das Programm aus dem Speicher rauszubekommen?
    ACTGRP(*NEW) ist eine naheliegende Möglichkeit.
    Ansonsten gilt immer: lokale Variablen für alle nicht Zustands behafteten Variablen bevorzugen.
    Legt man alle Zustandsvariablen in eine (qualified, versteht sich) Datenstruktur (ich nenne die analog zu Java this) kann man diese mit einer einzigen Anweisung reinitialisieren und man kann auch einfach sowas ähnliches wie Mehrfach Aktivierung programmieren.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    32
    ACTGRP(*NEW) hatte ich auch schon überlegt. Allerdings fehlte mit der Parameter im Befehl CRTSQLRPGI. Habe das jetzt aber in die Control-Options geschrieben und dann funktioniert es. Das Programm wird nicht so oft aufgerufen, da kann ruhig jedesmal eine neue Actgrp geöffnet werden.

  7. #7
    Registriert seit
    Apr 2005
    Beiträge
    385
    Kannst du im PGM bei den SQL Options mit angeben:
    Code:
     C/EXEC SQL                         
     C+ SET OPTION                      
     C+ COMPILEOPT = 'ACTGRP(*NEW)'     
     C/END-EXEC

  8. #8
    Registriert seit
    Jan 2009
    Beiträge
    67
    Standard RPG Compile Options kann man auch and den Befehl CRTSQLRPGI übergeben. Dafür ist der Parameter COMPILEOPT da.

    Zum Bespiel:

    CRTSQLRPGI ... COMPILEOPT('DFTACTGRP(*NO) ACTGRP(*CALLER) INCDIR(''/usr/local/include'') OPTION(*SRCSTMT *NODEBUGIO) OPTIMIZE(*BASIC)')

  9. #9
    Registriert seit
    Oct 2014
    Beiträge
    28
    Nur mal so gefragt, hilft da auch kein inz(*zero) bzw *inz(*blanks)?

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Leider nein.
    Inz ist eine Initialisierung die bei der Speicherbelegung ausgeführt wrd.
    Das selbe gilt dann für Clear.
    Einzig die Existenz einer *INZSR (auch verdeckt) sorgt automatisch dafür, dass der Compiler für jede Reset-Anwesiung eine Kopie mit dem Initwert des Feldes/der Struktur generiert.
    Ansonsten wirkt Reset da wohl wie Clear.

    Wenn du allerdings mittls NoMain eine Prozedur verwendest, dann wird nicht mehr static, sondern automatic storage belegt. Einzig Variablen, die vor der 1. Prozedur definiert sind, bleiben static.

    https://www.itjungle.com/2008/08/27/fhg082708-story01/
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Felder anonymisieren (DSGVO)
    By nico1964 in forum NEWSboard Programmierung
    Antworten: 37
    Letzter Beitrag: 12-06-18, 11:41
  2. Felder in der WSDL-Datei
    By svit in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 06-07-15, 11:44
  3. VARCHAR Felder(UTF-8) und ILE RPG
    By uditzen in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 26-06-15, 11:03
  4. Modem initialisieren
    By Mädele in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 16-05-03, 12:31
  5. SQL Felder dynamisch
    By Harald.Wallukat in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 16-12-02, 21:37

Tags for this Thread

Berechtigungen

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