PDA

View Full Version : Kostanten ausserhalb vom Prog verwalten?



Seiten : [1] 2

robertki
22-11-06, 08:36
Hallo,

ich bin neu hier und beschäftige mich erst seit kurzer Zeit mit RPG. Bin selber Informatiker und komme aus C, JAVA, HTML, ... Ich habe nun mein erstes RPG4 Programm fertig und gleich eine Frage dazu.

Ich habe im Programm selber Kostanten definiert, die ich benötige. Problem: Wenn sich eine Kostante mal ändert, muss das Programm neu umgewandelt werden. Also dachte ich ich lege die Werte in einer Externen Datei ab. Nur wie genau gehe ich da vor? Gibt es dafür irgendwelche Ideen/Konzepte? Oder reicht dafür eine PF Tabelle, die ich dann im Prog auslese? Vielleicht könnt ihr mir mal schreiben, wie ihr so etwas löst? Vielen Dank vorab

Robert

kuempi von stein
22-11-06, 08:48
Moin und willkommen.

So etwas in eine PF abzulegen, halte ich durchaus für einen möglichen Weg.
Wie immer auf der AS/400 gibt es viele Wege.

So grundsätzlich scheint mir das aber eher eine Designschwäche in Deinem Konzept zu sein, denn ne Konstante die sich immer mal wieder ändert, ist ja keine echte Konstante, gell?

k.

robertki
22-11-06, 08:54
Moin und willkommen.

So etwas in eine PF abzulegen, halte ich durchaus für einen möglichen Weg.
Wie immer auf der AS/400 gibt es viele Wege.

So grundsätzlich scheint mir das aber eher eine Designschwäche in Deinem Konzept zu sein, denn ne Konstante die sich immer mal wieder ändert, ist ja keine echte Konstante, gell?

k.

Ok du hast natürlich recht. Ich denke die Konstanten werden sich nicht sehr oft ändern. Mein Programm greift über TCP auf eine externe Seite zu. Da habe ich natürlich keinen Einfluss auf die Werte. So wäre es doch einfacher so etwas ausserhalb des Programms zu speichern, um Änderungen schnell einzupflegen.

Nebenbei wollte ich dies nutzen, um mehr RPG zu erlernen ;-)

Robert

DVE
22-11-06, 09:52
Ich denke, dein Ansatz ist richtig. Es geht hier weniger um Designschwäche sondern um "'rumspielen" und du möchstest einige Vorschläge.

Also erster Vorschlag: Du arbeitest mit Übergabeparamter. Du definierst mit
*ENTRY eine Übergabeliste und damit übergibst du an deinem RPG die Werte die er benötigt.

Zweiter Vorschlag, du legst die Werte in einer *DTAARA und liest zur Laufzeit die *DTAARA mit *NAMVAR und danach IN zur Laufzeit. Änderungen an der *DTAARA werden, werden mit CHGDTAARA durchgeführt.

Dein Vorschlag, das ganze in einer Datei. Ist grundsätzlich möglich, aber du musst die Daten in der Datei auch pflegen, oder ?
Dafür brauchst du ein Pflegeprogramm (mußt es schreiben) oder du pflegst mit STRDFU (Standard) oder du pflegst mit SQL-Update.

Wie gesagt, es gibt viele Möglichkeiten zur Lösung. Die Frage ist immer diesselbe: Wieviel Aufwand will ich 'reinstecken??
Gruß
DVE

robertki
22-11-06, 10:37
Ich denke, dein Ansatz ist richtig. Es geht hier weniger um Designschwäche sondern um "'rumspielen" und du möchstest einige Vorschläge.
ja irgendwie hast du recht :-)

Also erster Vorschlag: Du arbeitest mit Übergabeparamter. Du definierst mit
*ENTRY eine Übergabeliste und damit übergibst du an deinem RPG die Werte die er benötigt.
An Übergabeparameter habe icha uch schon gedacht, aber dann muss man die immer mitschleppen.

Zweiter Vorschlag, du legst die Werte in einer *DTAARA und liest zur Laufzeit die *DTAARA mit *NAMVAR und danach IN zur Laufzeit. Änderungen an der *DTAARA werden, werden mit CHGDTAARA durchgeführt.
Das hört sich interessant an. Was hat es mit *DATAARA auf sich? Habe bis jetzt ncoh nicht davon gehört.

Dein Vorschlag, das ganze in einer Datei. Ist grundsätzlich möglich, aber du musst die Daten in der Datei auch pflegen, oder ?
Dafür brauchst du ein Pflegeprogramm (mußt es schreiben) oder du pflegst mit STRDFU (Standard) oder du pflegst mit SQL-Update.
Ok, das mit der Datei ist doch nciht so der richtige Weg. Viel zu viel Aufwand mit dem Pflegeproggi.

Wie gesagt, es gibt viele Möglichkeiten zur Lösung. Die Frage ist immer diesselbe: Wieviel Aufwand will ich 'reinstecken??
Gruß
DVE
Hey DVE, Danke für deine Infos. Bei der Pflege soll möglichst wenig Aufwand getrieben werden.

Robert

mk
22-11-06, 10:53
Hallo Robert,

eine beliebte Art der Konstantenverwaltung ist die Message File.

Damit können Texte sehr schön veraltet werden.
Ein Verwaltungsprogramm bringt die AS400 schon mit.

Mit CRTMSGF wird eine Messagefile erstellt
Mit WRKMSGF kann diese bearbeitet werden

Mit einem kleinen CL Programm können Nachrichten z.B. über den CL Befehl RTVMSG variable in dein Programm geholt werden.

Schau es Dir mal an.
Ist eine einfache Sache und es gibt keine Konstanten mehr
in deinem Programm.

Gruss
Michael

B.Hauser
22-11-06, 11:57
Hallo,

warum erstellst Du Dir nicht einfach für jede Konstante eine Funktion die nichts anderes macht als den Konstantenwert auszugeben. Am einfachsten ist, Du hinterlegst alle Funktionen in der gleichen Teildatei und erstellst daraus ein Service-Programm.

Anstatt in Deinen Programmen die Konstanten zu verwenden rufst Du die entsprechende Prozdur auf. Sollte sich der Konstantenwert einmal ändern, musst Du lediglich den Rückgabewert Deiner Funktion ändern und das Service-Programm neu erstellen.

Birgitta

robertki
22-11-06, 13:37
Hallo Birgitta, Hallo Michael,

Danke für eure Ideen.

@Birgitta:
Das ist ne Idee, aber so etwas nutze ich nicht so gerne. Damit komme ich ums Umwandeln nicht herum und dann kann ich es auch direkt im Programm stehen lassen. Trotzdem Danke.

@Michael:
Das mit den MessageFiles habe ich ausprobiert, aber auch davon habe ich kaum Ahnung. Gibt es dazu noch mehr informationen, wie und was ich da hinein schreiben muss?

Gruß Robert

RobertMack
22-11-06, 23:35
Halloooo,

in der Zeit, die bis jetzt verbraten wurde hätte auch ein /Copy entstehen können.

Entscheidungsparameter:
- die meisten Alternativen deuten Richtung Umwandlung
- CLs und Procedures gefallen nicht
- /Copys können gemäß *LIBL je nach Bedarf unterschiedlich sein
- sind zentral leicht zu verwalten
- können in beliebig viele Programme eingebunden werden
- können/sollten eine als Kommentar getarnte, interpretierbare Umwandlungsanweisung für betroffene Programme enthalten (so ein Tool schreibt man nur einmal im Leben - oder kauft eine teure CASE-Anwendung die dann /Copys innerhalb /Copys nicht erkennt ;-)

Grüße,
Robert

DVE
23-11-06, 07:58
Hallo Robertki,
leider hatte ich gestern schlechteres zu tun als in diesem Forum produktiv zu arbeiten.
Wie du gesehen hast, viele Meinungen aber keine Ausführung zu *DTAARA. Der Grund ist ziemlich einfach, *DTAARA und RPG sind "exotisch".
Trotzdem hier ein bisschen was zum spielen.
Du hast gefragt was *DTAARA sind, nun es sind Datenbereiche die du erstellen und benutzen kannst.
Die Befehle dazu lauten CRTDTAARA (*DTAARA Erstellen), DSPDTAARA (Anzeigen), CHGDTAARA (Inhalt der *DTAARA ändern), DLTDTAARA (*DTAARA löschen) und RTVDTAARA(Inhalt holen). Bis auf RTVDTAARA (nur im CLP-Programm nutzbar) können alle Commandos in Programm und Befehlszeile eingesetzt werden.
Zunächst erstellst du eine *DTAARA mit
CRTDTAARA DTAARA(MYLIB/MYARA) TYPE(*CHAR) LEN(2000). Der Wert Type definiert ob die *DTAARA *CHAR oder *DEC (Dezimal)ist. Ich persönlich benutze nur *DTAARA vom Typ *CHAR, weil sie mit DSPDTAARA leichter zu lesen sind. Die Länge ist Variabel (min 1 max 2000 Zeichen).

Mit dem Befehl CHGDTAARA DTAARA(MYLIB/MYARA (1 9)) VALUE('ANTON1997') kannst du den Inhalt der *DTAARA anpassen. Hier wird ab der Position 1 in der Länge 9 ANTON1997 in die *DTAARA reingeschrieben.

Jetzt kommt dein RPG-Programm

IINARA DS 2000
I 1 5 INAME
I 9 90IJAHR
C *NAMVAR DEFN MYARA INARA
C IN INARA
C SETON LR

Wenn du im Debug Modus das Programm ausführst und dir die Felder INAME und IJAHR anschaust, haben diese den Wert ANTON bzw. 1997.

mit *NAMVAR definierst du die *DTAARA und mit IN liest du die *DTAARA in die Datenstruktur INARA. Die Felder INAME und IJAHR sind bestandteile dieser Datenstruktur.

Da das Einlesen zur Laufzeit passiert, kannst du den Inhalt der *DTAARA mit CHGDTAARA jederzeit anpassen und dein Programm hat genau die "Constanten" die du haben möchtest.

Also dann, viel Spaß beim Spielen.

Gruß
DVE