PDA

View Full Version : Variablenname in Variable



Seiten : [1] 2

harkne
02-12-14, 12:42
Hallo zusammen,

in anderen Programmiersprachen habe ich die Möglichkeit einen Variablen Namen variabel zu machen. Ich kenne das z.B. von PHP.

Beispiel:

$Name = "harkne"
$Var = "Name"

Wenn ich jetzt einen print $Var ausführe wird "Name" ausgegeben
Wenn ich einen print $$Var ausführe wird "harkne" ausgegeben.

Mit $$ wird nicht der Inhalt der Variablen sondern der Inhalt der in der Variablen gespeicherten Variable ausgegeben.

Ich hoffe es weiß jeder was ich meine.

Für mich ist es deshalb wichtig weil ich in einer Subfile eine Übersicht geänderter Feldwerte aus einer Datei anzeigen soll. Jetzt möchte ich nicht hergehen und jedes Feld einzeln Konstant angeben sondern die Felder wenn möglich programmtechnisch abarbeiten.

Jetzt unter dem Schreiben bin ich gerade am überlegen ob ich das über SQL hinbekomme.

Also Ziel ist es
Lies Satz 1 aus Datei 1 (dort steht der Update Before)
Lies Satz 2 aus Datei 1 (dort steht der Update Past)
Und jetzt in einer Schleife die Felder abarbeiten und die Feldwerte aus Satz 1 und Satz 2 vergleichen. Ist ein Feldwert unterschiedlich soll in die Subfile der Feldname der Wert vorher und der Wert nachher

Kann ich mir irgendwie die Feldnamen aus einer Datei per SQL ermitteln ???

Sorry Tausend Fragen. Vielleicht kann mir jemand helfen, vielleicht auch nur mit Ideen.

Vielen Dank

Viele Grüße Harald

Fuerchau
02-12-14, 12:46
Ich denke, das ist eher was für ein PHP-Forum.

harkne
02-12-14, 12:52
Ich möchte doch aber das Ergebnis im RPG. Ich habe PHP nur als Beispiel gebracht wie es dort funktioniert und wollte wissen ob es sowas auch in RPG gibt.

maro78
02-12-14, 12:58
Ich habe ein ähnliches Programm auch mal erstellt.

Um die Feldnamen zu ermitteln bin ich auf die Datei QSYS2/SYSCOLUMNS gegangen.

harkne
02-12-14, 13:03
Ich habe mich wahrscheinlich missverständlich ausgedrückt.

Ich muss das Journal nachprogrammieren.

Natürlich aber nur für bestimmte Dateien.

Die Datensätze liegen mir auch bereits mit Update Before und Update Past vor. Jetzt soll ich aber nur die Felder in einer Subfile anzeigen die sich tatsächlich geändert haben.

Ich könnte jetzt abfragen:
if Name (Update Before) <> Name (Update Past)
eval SfFeld = "Name"
eval SfValBfr = Name (Update Before)
eval SfValPast = Name (Update Past)
endif
Und das mit jedem einzelnen Feld in der Datei

Sondern eleganter irgendwie mit Feldnamen einlesen und Inhalte der Feldnamen vergleichen. Dafür müsste es aber irgend eine Möglichkeit geben die Variablen in einer Variablen zu speichern und dann auch Variabel auszugeben.

Sehr schwer zu schreiben und zu erklären

harkne
02-12-14, 13:04
ah ok, danke. Werde ich mal nachsehen

camouflage
02-12-14, 13:32
Ich denke, Pointers sind deine Freunde...

Nur mal Dr. Google fragen.

Als Häppchen:
https://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c0925083545.htm

Den Tipp mit den SysColumns haste ja bereits bekommen.

BenderD
02-12-14, 13:48
... sowas machen nur Masochisten mit RPG, oder arme Knechte, die ihre Vorgaben von Sadisten bekommen...

D*B

Fuerchau
02-12-14, 16:33
Das Ganze funktioniert nur in RPGLE.
Per Syscolumns kannst du die Feldliste mit Namen und Ausprägung auslesen, allerdings nicht die Pufferposition.
Hier bietet sich DSPFFD mit Outfile an, da bekommt man auch diese.
Per Feldtyp bzw. Spalte STORAGE dann die Bytelänge ermitteln (beachte bei Packed die Länge in Bytes!), ggf. die Feldposition (an Hand von ORDINAL_POSITION) hochzählen.
Bei DATE (4)/TIME (3)/TIMESTAMP (10) hast du jedoch schon verloren, da hier die interne Länge und nicht die Pufferlänge angegeben wird.
Da ist dann DSPFFD wohl besser, da hier das DATFMT berücksichtigt wird.
Bist du so gewappnet kannst du per %SUBST() die Felder vergleichen.
Für die Ausgabe musst du nur noch bei gepackten Feldern ein paar Verrenkungen programmieren.

BenderD
02-12-14, 16:40
... eleganter ist natürlich, wenn man sich das Programm immer dann neu generiert, wenn die Datei sich ändert und dann cached...