PDA

View Full Version : Numerisches Feld zu lang



Seiten : [1] 2

woodstock99
15-04-08, 13:50
Hallo ich schon wieder :).
Ich soll ein altes RPG-Programm umstellen
Problemstellung:

IKundumsa KF 1 CK 2 CU
I 3 4 0JAHR
I p 12 76 UFG

UFG is hier somitn 65 stellen lang. Also zu lang. Im alten RPG wurde diese Zeile hinzugefügt und der Compiler ist zufrieden:

E UFG 13 9 0

gelöst.

Aber in RPGLE gibt es keine E-Zeilen zum definieren von interenen Tabellen und der der Compiler meckert weil das Feld UFG zu lang ist. Im alten RPG nicht. Warum??



Klar ich könnte das Feld unterteilen aber gibt es ne andere Lösung?? Evtl uber DS oder was kann man tun ??


UFG S 5P 0 Dim(13)
geht nicht

DUFG DS
Du1 1 5P 0
Du2 6 10P 0
Du3 11 15P 0
Du4 16 20P 0
Du5 21 25P 0
Du6 26 30P 0
Du7 31 35P 0
Du8 36 40P 0
Du9 41 45P 0
Du10 46 50P 0
Du11 51 55P 0
Du12 56 60P 0
Du13 61 65P 0

geht nicht


DUFG DS
Du1 1 9 0
Du2 10 18 0
Du3 19 27 0
Du4 28 36 0
Du5 37 45 0
Du6 46 54 0
Du7 55 63 0
Du8 64 72 0
Du9 73 81 0
Du10 82 90 0
Du11 91 99 0
Du12 100 108 0
Du13 111 117 0

geht nicht

Fuerchau
15-04-08, 14:10
Durch die E-Definition des UFG und die passende I-Definition weiß der Compiler, dass diese Definition den selben Speicher betrifft.

Bei ILERPG wird dies durch DIM(nn) ersetzt.

Zur ILE-Übersetzung ist da CVTRPGSRC ganz hilfreich, da nach der Übersetzung das Programm fehlerfrei compilierbar ist.
Die E/I-Definitionen werden korrekt übersetzt.

woodstock99
15-04-08, 14:32
Danke. Ich check es nicht.

Ich defeniere gepackte Felder,

muß aber ein Dezimales Dim geben.

also in diesem Fall

DUFG S 9 0 Dim(13)
da steig ich noch nicht ganz durch.


überträgt dann das Programm automatisch die Werte in die einzelnen Dim Felder und kann man dann ganz normal mir ihnen Rechnen??

das ganze soll dann natürlich wieder als gepackte Zahl ausgegeben werden.



z.B. in das B2-Feld
.


DSACHKONTDS DS
DDSSACHKONT 1 24
Dw 1
DBAB 5
DB2 16P 0
DG 22P 0
DEGNRDS 24



muß man hier irgendwas beachten??

danke nochmal

B.Hauser
16-04-08, 07:57
Hallo,

Versuch mal folgendes:



D DSUFG DS
D Du1 5P 0
D Du2 5P 0
D* usw.
D UFG 5P 0 Dim(13) Overlay(DSUFG)

Oder als UnterFeld(er) innerhalb einer Datenstruktur:


D MyDS DS
D Fld1 10A
* weitere Felder
D SubFUFG
D Du1 5P 0 Overlay(SubFUFG)
D Du2 5P 0 Overlay(SubFUFG: *Next)D* usw.
D UFG 5P 0 Dim(13) Overlay(SubFUFG)
D* Weitere Felder


Das Feld SubFUFG braucht nicht weiter definiert zu werden, da es allein durch die Überlagerung definiert ist!

woodstock99
16-04-08, 08:18
Danke für den Lösungsvorschlag.

Kann mir jemand nen Link oder ähnliches geben bezüglich meiner Frage wie das RPG intern mit gepackten Zahlen umgeht. Oder besser gesagt das Handling mit den Werten. Soll heissen wie kann man im Programm auf diese Werte zugreifen und weiterverarbeiten (Addieren usw.) und was zu beachten ist

Fuerchau
16-04-08, 08:30
Wenn ich diese Frage mal verstehen würde ;)

Mit gepackten Zahlen wird eben ganz einfach gerechnet, wie mit allen Zahlen eben.

Der Zugriff auf DIM-Variablen erfolgt mittels einer Indexvariablen, der im RPG per "Feld,I" in ILE nun mit "Feld(I)" erfolgt.

Daher ist der Zugriff nun einfacher, vor allem bei komplexeren Berechnungen.

woodstock99
16-04-08, 08:57
das ist mir sogar bekannt ;)

( Der Zugriff auf DIM-Variablen erfolgt mittels einer Indexvariablen, der im RPG per "Feld,I" in ILE nun mit "Feld(I)" erfolgt. )

Ich probiers mal so zu erklären.

Kann ich gepacktes Feld add Dezimalfeld = gepacktes oder dezimales Feld.

oder

gepacktes Feld add gepacktes Feld = gepacktes oder dezimales Feld usw.


Dies würde mich interessieren wie sich hier RPG verhält und was man beachten sollte. Klar geht es auch über die Methode Jugend forscht aber ich würde halt schon gern wissen warum das so und so funktioniert.

Ich hoffe ich konnte mich jetzt ein wenig deutlicher ausdrücken ;)

Fuerchau
16-04-08, 09:52
Hierzu kann das ILERPG-Programmierhandbuch wohl sachdienliche Hinweise geben.

Für die Genauigkeit gelten die allgemeinen mathematischen Regeln bezgl. der Nachkommastellen.

eval = (Wert1 + Wert2) * 12;

Es gibt noch Ergänzungen:
eval(h) <= kaufm. Runden
eval(r) <= Zwischenergebnisse runden
eval(hr) <= Kombination aus beiden

Ob ein Feld gepackt, gezont oder Integer ist, entscheidet allein die Definition.
Zwischenergebnisse werden ggf. angepasst.

Bei Konstanten sollte man ggf. Nachkomma angeben, da sonst Ganzzahlen verwendet werden könnten:

Ziel = Quelle * 10;
Ziel = Quelle * 10,0;

Für Zeichenvariablen kann man auch "rechnen":

ZielChar = QuellChar + 'Text' + Feld2;

In diesem Fall entspricht das dem alten CAT, nur wesentlich einfacher, vor allem bei BuiltIn's:

Ziel = %trim(Feld) + %trimr(Feld2) + %triml(Feld3);

woodstock99
23-04-08, 13:19
Hallo.
Schade aber
die Lösung von B.Hauser funktioniert so leider nicht. Evtl kapier ich es ja auch net.


Folgendes Problem:
FKUNDUMSA UF f 76 6AIDISK KEYLOC(5)

IKundumsa KF 1 CK 2 CU
I 3 4 0JAHR
I p 12 76 UFG

UFG IST SOMIT 65 P LANG


Meine Datenstruktur:


D* --- KUNDUMSA DATENSTRUKTUR ---
DKUNDUMSADS DS
DDSKUNDUMSA 1 76
Djahr 3 4 0
D SUBUFG
D UFG1 5P 0 overlay(SUBUFG)
D UFG2 5p 0 overlay(SUBUFG:*NEXT)
D UFG3 5p 0 overlay(SUBUFG:*NEXT)
D UFG4 5p 0 overlay(SUBUFG:*NEXT)
D UFG5 5p 0 overlay(SUBUFG:*NEXT)
D UFG6 5p 0 overlay(SUBUFG:*NEXT)
D UFG7 5p 0 overlay(SUBUFG:*NEXT)
D UFG8 5p 0 overlay(SUBUFG:*NEXT)
D UFG9 5p 0 overlay(SUBUFG:*NEXT)
D UFG10 5p 0 overlay(SUBUFG:*NEXT)
D UFG11 5p 0 overlay(SUBUFG:*NEXT)
D UFG12 5P 0 overlay(SUBUFG:*NEXT)
D UFG13 5p 0 overlay(SUBUFG:*NEXT)
D UFG 5p 0 DIM(13) overlay(SUBUFG)






Ich will die Datenstruktur so aufbauen das ich folgenden Befehl absetzten kann:

keykundumsa CHAIN KUNDUMSA KUNDUMSADS

Also lesen in die Datenstruktur


So wie ich die Datenstruktur definiert habe meckert der Compiler: die Länge der Datenstruktur ungleich der länge der SATZLÄNGE KUNDUMSA.

DS-länge laut Compilerliste 115
SUBUFG LÄNGE 39 ALPHA (sollte eigentlich auch 65 P werden)

laut B.Hauser: Das Feld SubUFG braucht nicht weiter definiert zu werden, da es allein durch die Überlagerung definiert ist!-. STIMMT nicht so ganz oder :(?



wie müss ich die DS definieren das mein Vorhaben funktioniert???

Danke für eure hilfe

B.Hauser
24-04-08, 10:03
Hallo,

es geht ja auch nicht um das Feld SUBUFG.
Dieses Feld wird nur dazu benötigt um überlagert zu werden, bzw. damit sowohl die Felder UFG1 bis UFG13 druch die Feldgruppe UFG überlagert werden kann, bzw. diese Unterfelder als UFG(Index) angesprochen werden können.

Ein numerisches Feld kann maximal 63P 0 definiert werden.
Datenstrukturen bzw. überlagerte Felder (Ohne weitere Angaben werden immer als Alpha definiert) Deshalb gibt es ja auch des öfteren Probleme, wenn eine Datenstruktur mit numerischen Unterfeldern nicht initialisiert wurde.

Was die Länge angeht, diese errechnet sich wie folgt:
13 x 5P0 und für ein 5P0 Feld werden 3 Byte benötigt, ergibt also eine Gesamtlänge von 39 Byte.

Das nächste Problem liegt darin, dass das Feld DSKUNDUMSA von Position 1-76 definiert wurde. Bei den gepackten Feldern und dem Subfeld SUBUFG wurde keine Start-Position angegeben, d.h. diese Felder beginnen ab der nächsten nicht belegten Position innerhalb der Datenstruktur. SUBUFG beginnt also ab Position 77. (Deshalb auch die Fehlermeldung, dass die Länge nicht übereinstimmt!) Wenn das Feld SUBUFG innerhalb der Datenstruktur an einer bestimmten Position beginnen soll, ist entweder die Startposition und End-Position erforderlich, oder die Angabe des Overlay-Schlüssel-Wortes.

Ich weiß nicht, ob und in wiefern Du das Feld DSKUNDUMSA benötigst. Wenn es nur notwendig ist um die Länge der Datenstruktur zu definieren kannst Du darauf völlig verzichten und die Länge direkt in der Zeile mit der DS-Definition.


DKUNDUMSADS DS 76
D DSKUNDUMSA 76A Overlay(KUNDUMSADS: 1)
D Jahr 4P 0 Overlay(KUNDUMSADS: 3)
D SUBUFG Overlay(KUNDUMSADS: 5)
D UFG1 5P 0 overlay(SUBUFG)
D UFG2 5p 0 overlay(SUBUFG:*NEXT)
D UFG3 5p 0 overlay(SUBUFG:*NEXT)
D UFG4 5p 0 overlay(SUBUFG:*NEXT)
D UFG5 5p 0 overlay(SUBUFG:*NEXT)
D UFG6 5p 0 overlay(SUBUFG:*NEXT)
D UFG7 5p 0 overlay(SUBUFG:*NEXT)
D UFG8 5p 0 overlay(SUBUFG:*NEXT)
D UFG9 5p 0 overlay(SUBUFG:*NEXT)
D UFG10 5p 0 overlay(SUBUFG:*NEXT)
D UFG11 5p 0 overlay(SUBUFG:*NEXT)
D UFG12 5p 0 overlay(SUBUFG:*NEXT)
D UFG13 5p 0 overlay(SUBUFG:*NEXT)
D UFG 5p 0 DIM(13) overlay(SUBUFG)