PDA

View Full Version : Inhalt Variable Wert zuweisen



Seiten : 1 2 [3] 4 5 6

woodstock99
19-09-08, 09:46
Nein wollte nur demonstrieren das es Programme gibt die den Wert eines Buffers auslesen und ausgeben. Aber das hätte ich Dir eigentlich ja nicht zu erzählen brauchen den das weißt du ja sowieso.

Hab mir halt gedacht das ich mir über die beschriebenen Apis der IBM das Ganze realisieren kann.
1:
Api 1
Feldnamen holen.
2:
Api 2 Buffer holen
3:
Serviceprogramm informationen verarbeiten (Buffer überschreiben).

Aber wie du es ja beschrieben hast scheint dies nicht zu funktionieren :(

BenderD
19-09-08, 09:52
... bei diesem Programm kann ich als Senior nur empfehlen erst mal über modulares Programmdesign zu forschen...



JUGEND FORSCHT :)

woodstock99
19-09-08, 09:56
bin zwar noch Jung aber auch nicht mehr ganz so grün hinter den Ohren was die AS/400 betrifft :).

Fuerchau
19-09-08, 10:07
Also das mit den API's ist mir persönlich nun mal nicht so ganz unbekannt ;).

Ich habe mir früher mal die Mühe gemacht, MI-Code zu verstehen (daher biete ich ja auf meiner Seite auch einen MI-Compiler an, der in MI geschrieben ist).

Um zu verstehen, was RPG da so treibt, kannst du ein Programm (nur RPG, nicht ILERPG) mit CRTRPGPGM ... OPTION(*SRCDBG) GENOPT(*LIST) umwandeln.

In der MI-Ausgabe kannst du dann mal nach EXFMT suchen und analysieren, was der Compiler da so treibt.

Zuerst werden da ein paar Hilfsvariablen gefüllt und anschliessend per CALLI (entspricht EXSR) eine Unterroutine gefüllt.
In dieser Unterrouten siehst du dann die einzelnen CPY-Befehle:
CPYBLA .BUFFER(0001:0001),*IN30
CPYBLA .BUFFER(0002:0001),DAFIRM
:

Für die Leseroutine ist das dann analog generiert.

Die Felddefinitionen werden vom Compiler in der Reihenfolge ihrer Verwendung definert. Suche mal in der Liste nach "ZFLDSTRT":

DCL DD DSHENX CHAR (0010) INIT((0010)' ')
DCL DD DSHENR PKD (08,0) INIT(P'0')
DCL DD DSSTAP CHAR (0001) INIT((0001)' ')
DCL DD DSMATC CHAR (0010) INIT((0010)' ')
DCL DD DSNAME CHAR (0030) INIT((0030)' ')
DCL DD DSBRAN CHAR (0030) INIT((0030)' ')
DCL DD DSSTRA CHAR (0030) INIT((0030)' ')
:
:

Nur Strukturen, also DS, sind tatsächlich korrekt in der Folge definiert und auch als solche erkennbar.

DCL DD EXFIWK CHAR(0170) /*ZDATAS*/
INIT /*ZDSINITS*/
DCL DD DAFIRM CHAR (0001) DEF(EXFIWK) POS(0001)
/*ZDSDEF*/
INIT( <0001! >)
DCL DD DAWKNR CHAR (0003) DEF(EXFIWK) POS(0002)
/*ZDSDEF*/
INIT((0003)<0001! >)
DCL DD DAFINA CHAR (0030) DEF(EXFIWK) POS(0005)
/*ZDSDEF*/
INIT((0030)<0001! >)
DCL DD DAWKNA CHAR (0030) DEF(EXFIWK) POS(0035)
/*ZDSDEF*/

Ich hoffe, du kannst nun meiner Argumentation folgen.

woodstock99
23-09-08, 08:16
So, zuerst einmal danke für eure Antworten.
Aber gegen allen wiederspruch :
Für meine Aufgabenstellung funktioniert es :D :D :D :D .
Deshalb Parole: Niemals aufgeben
und geht nicht gibts nicht. Geht ab und zu nur schwierig :))).
Jugend forscht ist ab und zu doch ein guter weg...

Trotzdem nochmal Danke für die gut gemeinten Ratschläge

Fuerchau
23-09-08, 09:07
Dann sach mal, wie es geht ;)

woodstock99
23-09-08, 09:27
Ok ich versuchs mal zu erklären wie wir es realisiert haben :).
Aber ist ist keine Lösung für das Problem: wie komm ich an die Speicheradresse von.
einem String in einer Variablen der einen Feldnamen darstellt!!!




DSPATR(&VARFELDER)

&varfelder muß als System to Programm Field definiert werden.
So weit ist ja alles klar.
Diese Felder werden im Speicher nach dem Alphabet sortiert und hängen aneinander.
Am besten man definiert sich ein Dummy Feld mit z.b den Namen &AAAAAAAAAA bei dem man sicher sein kann, je nach Namenskonventionen der Firma, das es sortiertechnisch im Speicher als erstes kommt.

Diese Startadresse muß ich meinem Serviceprogramm per %ADDR(&AAAAAAAA) übergeben.
( leider bis jetzt noch . Müssen weiterforschen das es anders geht :) )

Danach über folgende Apis
Q D F R T V F D
Q U S C R T U S
Q U S P T R U S
Q U S D L T U S

die ganzen Werte zusammenbasteln die man braucht und schon kann mal alle Felder eines Displayfiles initialisieren oder weiß der Geier was machen ..

:).


Hoffe das dies eine einigermaßen- Erklärung war :).

Gibts kritik???

RobertMack
23-09-08, 10:13
Gibts kritik???

Das hat Zeit, bis das Dingen gewartet werden muss...

Fuerchau
23-09-08, 10:14
Das mit der alphabetischen Sortierung ist doch wohl eher Zufall, oder ?
In meiner MI-Liste sind die Felder in der Reihenfolge ihrer ersten Benutzung definiert (DSBRAN liegt z.B. hinter DSNAME).
Und wer sagt, dass das mit dem nächsten Compiler auch so sein muss ?

Eine Garantie für Adressen gibt's tatsächlich nur in DS'n.
Hier kann man (in ILE) mit "qualified" auch Mehrfachnennungen in unterschiedlichen DS'n erreichen.

Aber, wie gesagt, du musst selber wissen was du den Programmierern für Vorschriften gibst damit deine eigenen API's auch funktionieren.

woodstock99
23-09-08, 10:26
Nein die Sortierung ist bei diesen Programm to System Feldern immer so.
Zumindest ich bekomme Sie immer so.

Ich weiß ja nicht was die Apis intern so alles treiben aber

Probiers mal aus. Tu seit 1 1/2 Tage nix anderes :). mal mit 10 mal mit 100 mal mit 500 Feldern total egal..

Ausserdem denke ich nicht das was geändert wird an diesem Konzept. Warum soll das IBM auch tun???