Anmelden

View Full Version : Inhalt Variable Wert zuweisen



Seiten : 1 [2] 3 4 5 6

Fuerchau
19-09-08, 08:33
Das kann doch nur die jeweilige Anwendung selber entscheiden.
Ich würde dem eigenen API eben das Attributfeld auch als Parameter übergeben.

woodstock99
19-09-08, 08:40
"Das kann doch nur die jeweilige Anwendung selber entscheiden." ???

Ich muß gestehen der Zug rollt grad bei mir ein. Soll heissen ich versteh nur Bahnhof :).

Wie mit übergeben?
Das Problem ich ja das der Feldname in einer Variablen steht.
Ich muß ja an die Adresse des Feldnamens kommen und ich denke mal des dies über das Api

QUSLFLD (buffer position)


<TABLE border=1><TBODY><TR><TH vAlign=bottom align=middle colSpan=2>Offset </TH><TH vAlign=bottom align=left rowSpan=2>Type </TH><TH vAlign=bottom align=left rowSpan=2>Field </TH></TR><TR><TH vAlign=bottom align=left>Dec </TH><TH vAlign=bottom align=left>Hex

</TH></TR><TR><TD vAlign=top align=middle>0 </TD><TD vAlign=top align=middle>0 </TD><TD vAlign=top align=left width="1%">CHAR(10) </TD><TD vAlign=top align=left width="98%">Field name </TD></TR><TR><TD vAlign=top align=middle>10 </TD><TD vAlign=top align=middle>A </TD><TD vAlign=top align=left width="1%">CHAR(1) </TD><TD vAlign=top align=left width="98%">Data type </TD></TR><TR><TD vAlign=top align=middle>11 </TD><TD vAlign=top align=middle>B </TD><TD vAlign=top align=left width="1%">CHAR(1) </TD><TD vAlign=top align=left width="98%">Use </TD></TR><TR><TD vAlign=top align=middle>12 </TD><TD vAlign=top align=middle>C </TD><TD vAlign=top align=left width="1%">BINARY(4) </TD><TD vAlign=top align=left width="98%">Output buffer position </TD></TR><TR><TD vAlign=top align=middle>16 </TD><TD vAlign=top align=middle>10 </TD><TD vAlign=top align=left width="1%">BINARY(4) </TD><TD vAlign=top align=left width="98%">Input buffer position </TD></TR></TBODY></TABLE>


realisiert werden kann oder bin ich jetzt im Augenblick nur noch verwirrt..

BenderD
19-09-08, 08:44
@Bahnhof: dann gehen wir doch nochmal zurück nach draußen.
das alles ist doch zur Compilezeit bekannt und ändert sich erst, wenn das DSPF geändert wird?!
Dann würde ich den erforderlichen Code generieren!!!

D*B


wir haben halt mehrere Records,Windows usw in unserer Bildschirmmaske. Wir positionieren und z.b auch bei einer Fehlermeldung über ein Api auf das fehlerhafte Feld. Ziel dieser ganzen Aktion soll sein : Keine Bezugszahlen mehr und flexibilität z.b. ein Feld das Blau ist soll bei einem Fehler in Umkehranzeige dargestellt werden usw und das ganze ohne Bezugszahlen, denn 1347 :) Bezugzahlen im Programm macht das ganze nicht grad übersichtlicher :).

Fuerchau
19-09-08, 08:51
Was soll denn dein API leisten ?

Ein Programm, dass eine DSPF verarbeitet, muss doch genau auf diese abgestimmt sein.
Ich verstehe also dein Problem hier überhaupt nicht.

Ach ja, es gibt bei RPG ja noch ein Problem:
Jedes Feld ist mit seinem Namen nur einmal im Programm bekannt!
D.h., dass der Compiler die Adresse berechnet.
Es ist nicht garantiert, dass die Felder in der Reihenfolge ihrer Definition des Puffers auch im Speicher stehen.
Beispiel:
In 2 Formaten verwendest du den Feldnamen "DSNAME".
Das Feld ist nur 1 Mal im Programm vorhanden, irgendwo im Speicher.

RPG generiert zusätzlichen Code:
Bei der Ausgabe eines Formates werden die Felder in den internen Puffer des Filehandles übertragen und dann der tatsächliche Write ausgeführt.
Bei der Eingabe wird aus dem internen Puffer in die einzelnen Variablen übertragen.

Ein zentrales Programm, dass also auf irgendwelche Puffer zugreifen will, funktioniert bei RPG so gar nicht.

Hier hilft also nur, je Format eine DS zu definieren.
Der Compiler lehnt es aber ab, dass ein Feld in verschieden DS'n vorkommt, es sei denn du verwendest "qualified" in ILERPG.
Dies setzt jedoch eine entsprechende Definition in den F-Bestimmungen voraus.
Ausserdem ändert sich jeder Zugriff auf eine Variable, ob das denn nun der Übersichtlichkeit dient und die Programmierung vereinfacht ?

woodstock99
19-09-08, 08:58
Mein api soll leisten:

egal welches Bildschirmfile ich definiere und wieviele DSPATR(&VARFELDER) ich in meiner Maske habe soll mein Api + Serviceprogramm alle diese Felder initialisieren.

Sprich mein Rpg-Programm wird aufgerufen, dann lese ich über ein eine Funktion alle &varfelder meiner Bildschirmmaske aus, ermittel die Speicheradresse und initialisiere diese Felder mit dem Wert x:20.

Wenn das Funktioniert kann ich diese INIT-&DSPATRFELDER in jeden Programm einbinden ohne das ich im Rpg auch nur eine Zeile mit definition und init schreibe.

Fuerchau
19-09-08, 09:02
Nunja, wie gesagt gibt es 2 Möglichkeiten:

a)
call 'MyInz'
parm MyAttr1
call 'MyInz'
parm MyAttr2
:
:
b)
MyAttr1 = x'20';
MyAttr2 = x'20';

woodstock99
19-09-08, 09:06
genau diese möglichkeiten will ich aber nicht :). Ich schau das ich das so lösen kann wie ich beschrieben habe. Vollautomatisch :).

ohne

a)
call 'MyInz'
parm MyAttr1
:
:
b)
MyAttr1 = x'20';
MyAttr2 = x'20';

wenn ich das hinbekomme komm ich nicht mehr in die Suppe :). Ok? :D

Fuerchau
19-09-08, 09:13
Schau dir noch mal meine obige Beschreibung an.
Du kannst es nur hinbekommen, wenn dein API-Programm so dynamisch ist, dass es auch die DSPF's selber verarbeitet und dein übergeordnetes Programm von dieser gar nichts mehr weiß.
Dieses bedarf dann ggf. größerer Übergabestrukturen, die eben alle Felder enthält.

Ich kenn da ein ERP-System (XPPS von ehemals BRAIN), die über Generatoren je DSPF ein Verarbeitungsprogramm für READ/WRITE/EXFMT erstellen, eine ziemliche große DS als Copy generieren, die dann von dem eigentlichen Programm verwendet wird.

Das generierte Programm leistet dann auch z.B. die Varianten
a) als Service-Job im Hintergrund (Umgehung von Dialog-CPW)
b) PC-Clients mit grafischer Oberfläche
c) eher selten auch als interaktives Programm

Dies kommt dann Dieters Vorschlag schon näher, entsprechende Generatoren zu verwenden/entwickeln.

woodstock99
19-09-08, 09:18
Erst einmal Danke für alle Antworten und übt ein bisschen nachsicht mit mir denn ich bin kein As/400 Crack:(.

Hab da grad was gefunden.
Diese Programm macht zwar ein bisschen was anderes aber naja.
Aber die Funktionen die ich brauche und wie ich es mir vorstelle sind enthalten.
Es liesst die Werte der Felder aus und gibt sie aus.

Wenn ich jetzt dieses abändere könnte es funktionieren.
evtl..
Ich bin ja noch jung und deshalb stelle ich dieses Projekt unter das Motto


JUGEND FORSCHT :)

Fuerchau
19-09-08, 09:36
Was versuchst du mir damit zu zeigen ?
Was erreichst du damit, die Datei zu öffnen ?

Mit C-Routinen kannst du eine DSPF natürlich auch verarbeiten, dies hilft jedoch immer noch nicht dem übergeordneten Programm, wenn du keine defiierte Übergabestruktur zwischen den Programmen hast.

Eine Datei (egal wieviele Formate bei DSPF/PRTF) hat intern nur genau einen einzigen Puffer, der je nach gewünschtem Format aufzubauen ist.
Dies leistet RPG automatisch durch den Compiler, da ja (wie gesagt) die Adressen der Variablen im RPG-Programm überhaupt nichts mit der tatsächlichen Pufferposition zu tun haben.

Hinzukommt ja noch, dass bei einer DSPF der Ausgabepuffer eines Satzformates anders aufgebaut ist, als der Eingabepuffer !
Enthält ein Format O-Felder (also reine Ausgabe) so sind diese zwar im Ausgabe- jedoch nicht im Eingabeformat enthalten.

Kodierst du ein WRITE FMT wird durch den Compiler halt der benötigte Code generiert um die Daten zusammenzubauen, kodierst du ein READ FMT, werden die Daten wieder zerpflückt.
Kodierst du ein EXFMT wird der intern in WRITE und READ aufgelöst.

Fazit:
Die Speicheradressen deiner Variablen im Programm haben überhaupt nichts mit der Pufferposition der geöffneten Datei zu tun!