PDA

View Full Version : daten typ einer Datenstruktur ändern



Seiten : [1] 2

inchic
16-04-10, 09:00
Hallo *all,

ich habe zwei DS mit unterschiedlichen Datentyp, deren Inhalt ich von DS1 -> DS2 übergeben möchte. Wie kann ich dass am Besten machen ohne jedes einzelne Feld anzupassen??? Gibt es da eine schöne möglichkeit?

D DS1 DS
D feld1 1 30a
D feld2 31 60a
D feld3 91 100a
D feldn 150 160a
D stringds1 200a Overlay(ds1)

D DS2 DS
D feld1 1 30c
D feld2 31 60c
D feld3 91 100c
D feldn 150 160c
D stringds2 200c Overlay(ds2)

Danke!

andreaspr@aon.at
16-04-10, 09:50
Ab V5R4 gäbe es ja den Eval-Corr Befehl. Allerdings müssten dafür der Feldname + Typ übereinstimmen.
Du könntest mit dem Befehl MOVEL die DS1 in die DS2 schieben.
Mit MOVE-Befehle arbeiten zu müssen würde ich jedoch nicht unbedingt als schöne Lösung bezeichnen.

Fuerchau
16-04-10, 09:54
Da du den Typ nur von SBCS (A) in UCS2 (C) ändern möchtest kannst du den Move hin und zurück so codieren:

DS1 = %char(DS2);
DS2 = % UCS2(DS1);

B.Hauser
16-04-10, 10:02
Bist Du Dir eigentlich sicher, dass Du in der 2. Datenstruktur alle Zeichen aus der 1. Datenstrukutr unterbringst?
M.E. sind die Felder nur noch halb so lang, da für ein Zeichen 2 Byte anstatt 1 Byte benötigt werden.

Die Sub-Felder mit Von-/Bis-Angaben zu definieren, sollten die Felder mit Länge und dem entsprechenden Datentypen definiert werden.

Wenn Du bereits auf 6.1. sollte ein einfacher Eval (besser allerding EVAL-CORR) genügen. EVAL-CORR setzt allerdings voraus, dass die Datenstrukturen qualifiziert angesprochen werden und alle Unter-Felder gleich heißen.

Birgitta

inchic
16-04-10, 10:30
Da du den Typ nur von SBCS (A) in UCS2 (C) ändern möchtest kannst du den Move hin und zurück so codieren:

DS1 = %char(DS2);
DS2 = % UCS2(DS1);

DS2 = %UCS2(DS1), wenn ich das versuche, dann sind die Inhalt der DS2 nicht mehr lesbar. die AS400 zeigt mir dann nur noch Striche an.

Gruß,
inchic

inchic
16-04-10, 10:54
Bist Du Dir eigentlich sicher, dass Du in der 2. Datenstruktur alle Zeichen aus der 1. Datenstrukutr unterbringst?
M.E. sind die Felder nur noch halb so lang, da für ein Zeichen 2 Byte anstatt 1 Byte benötigt werden.

Die Sub-Felder mit Von-/Bis-Angaben zu definieren, sollten die Felder mit Länge und dem entsprechenden Datentypen definiert werden.

Wenn Du bereits auf 6.1. sollte ein einfacher Eval (besser allerding EVAL-CORR) genügen. EVAL-CORR setzt allerdings voraus, dass die Datenstrukturen qualifiziert angesprochen werden und alle Unter-Felder gleich heißen.

Birgitta

das habe ich jetzt auch versucht, leider akzeptiert er die unterschiedlichen Datentypen nicht.

D DS2 E DS EXTNAME(DS2:*INPUT) QUALIFIED
D DS2 E DS EXTNAME(DS:*OUTPUT) QUALIFIED

Eval-corr ds2 = ds2;

Fuerchau
16-04-10, 11:43
Um einen Einzel-Move kommst du wohl nicht herum:
1. UCS2 läßt sich auf einer DS leider nicht definieren
2. MOVE und EVAL nehmen keine automatische Konvertierung vor, deshalb der Compilerfehler

Was die Definition angeht, so sind c-Felder automatisch Doppelbytes.
Du musst also für die Übertragung gezielt jedes Feld mit Konvertierung übertragen (qualified):

ds2.feld1 = %ucs2(ds1.feld1);
ds1.feld1 = %char(ds2.feld1);

Nachtrag:
Du kannst natürlich nicht 2 gleiche DS-Namen definieren (2x DS2).

inchic
16-04-10, 11:49
Um einen Einzel-Move kommst du wohl nicht herum:
1. UCS2 läßt sich auf einer DS leider nicht definieren
2. MOVE und EVAL nehmen keine automatische Konvertierung vor, deshalb der Compilerfehler

Was die Definition angeht, so sind c-Felder automatisch Doppelbytes.
Du musst also für die Übertragung gezielt jedes Feld mit Konvertierung übertragen (qualified):

ds2.feld1 = %ucs2(ds1.feld1);
ds1.feld1 = %char(ds2.feld1);

Nachtrag:
Du kannst natürlich nicht 2 gleiche DS-Namen definieren (2x DS2).


DANKESCHÖN.
Ich habe hofft, dass ich das einzelene Übertragen meiden könnte.
DANKE!

Fuerchau
16-04-10, 12:02
Ich habs noch mal unter V5R4 getestet:
%UCS2 und %CHAR werden auf DS nicht korrekt unterstützt.
Da die DS als Ziel wieder vom Typ SBCS ist, führt der DS2 = % UCS2(DS1) zu einer Rückkonvertierung in CHAR und macht deshalb den Unterfeldinhalt nicht lesbar, da er kein UCS2 mehr ist.
Ein DS1 = % CHAR(DS2) wird vom Compiler abgelehnt.

Der Test hat auch ergeben, dass man sich ab V5R4 wohl die Funktionen % UCS2 und % CHAR beim Eval sparen kann, der Compiler generiert den richtigen Code automatisch.

BenderD
16-04-10, 12:56
... du hast doch schon die Huddelfelder mit Overlay deklariert, da kannst du doch dem einen Huddelfeld das andere Huddelfeld zuweisen (würg, schüttel, kotz) , bzw. mit %ucs zuweisen, je nach release.

D*B,
den der Ekel schon beim schreiben packt