PDA

View Full Version : Datenstruktur in eine Char Variable umwandeln /Packed werte machen Probleme



Seiten : [1] 2

DZDominik
30-03-21, 12:13
Hallo Zusammen,

ich komme bei einem Problem nicht mehr weiter.

Ich habe eine DatenStruktur die ich eine Char Variable zuweisen möchte, aber die Packed Werte hier Probleme machen:

dcl-ds InformationenderPerson qualified inz;
Infonummer zoned(8:2) //bsp 12345678,12
infoname char(10) // bsp: Max
infopacked packed(5:0) //bsp 85354
end-ds


dlc-s WertederDS char(100) inz;


WertederDs = InformationenderPerson;

Eregbnis :
WertederDs = 112345678,12MaxeMW!

Wie kann ich die Variable parsen oder umwandeln damit ich den normalen Wert (nicht eMW! sondern 85354) bekomme?

Bedingungen sind:

Die Datenstruktur kann ich nicht geändern werden, da diese Prozedur von verschiedenen Datenstrukturen aufgerufen werdeb soll.

Übergabeparameter soll nur diese Variable WertederDS sein.

Vielen Dank!

mfg

Fuerchau
30-03-21, 12:20
Definiere eine 2. Struktur mit identischen Namen und Zoned-Felder.
Mach einen eval-corr und du hast alles passend.

DZDominik
30-03-21, 12:29
Hallo Fuerchau,

in meinem Sourcecode definiere ich keine Datenstrukturen sondern bekomme nur diesen Wert WertederDS und kann nur mit diesen arbeiten.

Sonst müsste ich für jede Datenstruktur, die mir übergeben wird eine 2. Datenstruktur anlegen und das wäre unnötiger Verbrauch von speicher.

Gibt es keine Möglichkeit die Packed Werte als Normalen String umwandeln zu können ohne eine 2 Datenstruktur aufbauen zu müssen?

Fuerchau
30-03-21, 13:23
Du kannst ein zusätzliches Feld mit "Overlay() Pos()" als gepackt definieren.
Woher kommt denn die DS "InformationenderPerson"?
Du kannst doch ebenso ein neues Feld "WertederDs likeds(InformationenderPerson)" anlegen und der DS dann den Wert zuweisen.

Normalerweise sind ja nun mal Felder und vor allem Strukturen in Copystrecken definiert;-), so dass man sich darauf beziehen kann.

DZDominik
30-03-21, 14:24
Du kannst ein zusätzliches Feld mit "Overlay() Pos()" als gepackt definieren.

Woher kommt denn die DS "InformationenderPerson"?
Das Problem ist das es nicht nur diese DS sein kann sondern auch andere (die auch anders strukturiert sind).
In der Theorie soll jedes RPGLE Objekt darauf zugreifen können.

ich will einen simplen xml generator bauen
und mit einen simplen %subst die Tags befühlen
das hat super funktioniert solange ich keine Packed werte hatte




Du kannst doch ebenso ein neues Feld "WertederDs likeds(InformationenderPerson)" anlegen und der DS dann den Wert zuweisen.

dann hätte ich doch schon wieder eine Datenstruktur mit packed werten und könnte diese wieder nicht als char übergeben



Normalerweise sind ja nun mal Felder und vor allem Strukturen in Copystrecken definiert;-), so dass man sich darauf beziehen kann.
Ja, da hast du recht.

Ich wollte nur eine Dynamische "Klasse" erschaffen, wo ich nicht immer expliziert auf die jeweilige Datenstruktur schauen muss.

B.Hauser
30-03-21, 14:26
Dann hilft nur mit Pointern zu arbeiten ... und das wird komplex.

Birgitta

DZDominik
30-03-21, 14:32
danke dir Birgitta

schade ich dachte es würde einfacher gehen :)

B.Hauser
30-03-21, 14:39
Ich habe allerdings doch mal eine dumme Frage.
Warum willst Du denn die Datenstruktur überhaupt in eine Text-Variable schieben?
Bei der Parameter-Übergabe kannst Du auch eine Datenstruktur mitgeben.
Außerdem kannst Du ja auch die Variable wieder in die Datenstruktur schieben und damit wären Deine gepackten Felder wieder richtig sichtbar.
Ansonsten ist die Lösung von Baldur, d.h. 2. Datenstrutkur mit gezonten Feldern die beste Lösung.

DZDominik
30-03-21, 14:56
Warum willst Du denn die Datenstruktur überhaupt in eine Text-Variable schieben?

Weil ich keine Dynamische Datenstruktur erstellen kann oder ?

Nehmen wir mal an das ich eine Datenstruktur als Parameter übergeben würde,

dann müsste meine Datenstruktur genauso ausschauen wie die ich übergeben habe richtig ?
Und müsste für jede Datenstruktur eine Prozedur schreiben.

Fuerchau
30-03-21, 15:21
Nein musst du nicht. Wenn du allerdings an die Feldinhalte willst, kannst du relativ simple Definitionen verwenden:

dcl-pi *n;
myds char(2000);
end-pi;

dcl-s pDS pointer;
dcl-ds MyDS likeds(xxxx) based(pDS);

pDS = %addr(myds); // Setzen Basispointer von Parameter