PDA

View Full Version : gepacktes num.Feld in ein Alphafeld umsetzen



Souljumper
25-10-04, 10:13
Ich vesuch verzweifelt ein gepacktes numerisches Feld in ein Alphafeld umzusetzen. jedoch bisher ohne erfolg.

hab schon diverse Versuche gestartet aber das was in meinem Alphafeld ankommt ist immer der Inhalt des gepackten Feldes.

Hat das jemand schonmal gemacht und kann mir einen tip geben. Dr.Google hat auch nichts produktives hervorgebracht.

Danke im Vorraus.

B.Hauser
25-10-04, 10:24
Ich vesuch verzweifelt ein gepacktes numerisches Feld in ein Alphafeld umzusetzen. jedoch bisher ohne erfolg.

hab schon diverse Versuche gestartet aber das was in meinem Alphafeld ankommt ist immer der Inhalt des gepackten Feldes.

Hat das jemand schonmal gemacht und kann mir einen tip geben. Dr.Google hat auch nichts produktives hervorgebracht.

Danke im Vorraus.

Hallo,

ich gehe davon aus, dass, wenn in dem gepackten Feld x'12345F' steht, Du in Deinem Alpha-Feld 12345 sehen willst.

Der einzige Weg sicher zustellen, dass numerische Felder in RPG gezont verwendet werden, ist, sie in eine Datenstruktur einzubinden.

Du definierst also eine Datenstruktur mit einem gezonten numerischen Feld, überlagerst dieses durch Dein Alpha-Feld.
Anschliessend füllst Du den gepackten numerischen Wert in das gezonte Feld (mit EVAL).

Alternativ könnten auch die Built-in-Funktionen %CHAR oder %EDITC verwendet werden.

Beispiel:


D DSAlpha DS
D Numer 10S 0
D Alpha 10A overlay(Numer)

D Packed S 5P 0 inz(12345)
*----------------------------------------------
/Free
Numer = Packed;
Dsply Alpha;

EvalR Alpha = %TrimR(%Char(Packed));
Dsply Alpha;

EvalR Alpha = %TrimR(%EditC(Packed: 'Z'));
Dsply Alpha;

*InLR = *On;
/End-Free


Birgitta

Souljumper
25-10-04, 11:26
Danke für die Antwort.

Ich hab allerdings das Problem das ich die Information per %subst aus einer anderen Datenstruktur abgreifen muss. das heist ich muss es ja erst in einem alphafeld zwischenspeichern, da der compiler sonst einen Abbruchfehler bringt wenn ich per %subst in ein numerisches Feld kopieren möchte.

Schiebe ich dann das Alphafeld per move befehl wieder in gepacktes feld steht in dem gepackten feld '000000' drin.

Ich komme also gar nicht so weit ihren Löschungsschritt auszuprobieren da ich mir den Wert schon vorher zerschoßen hab.



c evalr wpack2 = %subst(csdta:cspos:cslen)
c move wpack2 packed
c eval nummer = packed
c evalR Alpha = %trimR(%char(packed))
c evalR Alpha = %trimR(%editc(packed:'Z'))

wpack2 ist alpahnumerisch.

Fuerchau
25-10-04, 12:58
Wie im obigen Beispiel definiere ein gep. Feld in entsprechender Größe und überlageres es mit dem Alpha-Feld:

d ds
d Num 11p 2
d Alp 6 overlay(Num)

eval Alp = %subst(...)

In "Num" steht dein Wert (falls der Inhalt auch korrekt ist).
Dies sind eher "verbotene" Methoden.

B.Hauser
25-10-04, 13:20
Ich hab allerdings das Problem das ich die Information per %subst aus einer anderen Datenstruktur abgreifen muss.


Hallo,

wenn der numerische Wert immer an der gleichen Stelle steht, dann lege einfach eine Datenstruktur an, in der der numerische Wert als gepacktes Feld definiert wird:
(Du brauchst Dich nicht mit irgendwelchen SUBSTRINGS herumzuärgern)

Beispiel:


D MyDS DS
D Anfang 5A
D Packed 5P 0
D Ende 5A

D Text S 13A inz(x'E7E7E7E7E712345FE7E7E7E7E7')
*------------------------------------------------------
/Free
MyDS = Text;
Dsply Packed;
*InLR = *On;
/End-Free


Wenn die Start-Position und Länge variabel sind wird es komplizierter. Am einfachsten ist, man konvertiert den String in eine Hexadezimale Darstellung und greift dann die numerischen Werte ab. Die Konvertierung in Hex-Werte ist am einfachsten mit der SQL-Funktion HEX.

Beispiel:


D Packed S 11P 0

D Text S 13A inz(x'E7E7E7E7E712345FE7E7E7E7E7')
D AlphaHex S 26A
D AlphaNum S 26A

D Start S 3U 0
D StartHex S 3U 0
D Len S 3U 0
D LenHex S 3U 0
D Sign S 1A
*---------------------------------------------------------
C/Exec SQL
C+ Set :AlphaHex = Hex(:Text)
C/End-Exec
/Free
Start = 6;
Len = 3;
StartHex = Start * 2 - 1;
LenHex = Len * 2;
AlphaNum = %Subst(AlphaHex: StartHex: LenHex - 1);
Packed = %Dec(%Trim(AlphaNum): 11: 0);
Sign = %Subst(AlphaHex: StartHex + LenHex - 1: 1);
If Sign = 'D';
Packed -= Packed;
Endif;
Dsply Packed;
*InLR = *On;
/End-Free


Birgitta

Souljumper
25-10-04, 15:26
Wie im obigen Beispiel definiere ein gep. Feld in entsprechender Größe und überlageres es mit dem Alpha-Feld:

d ds
d Num 11p 2
d Alp 6 overlay(Num)

eval Alp = %subst(...)

In "Num" steht dein Wert (falls der Inhalt auch korrekt ist).
Dies sind eher "verbotene" Methoden.
Danke, das hat mir schon etwas weiter geholfen, allerdings renn ich jetzt immer auf einen Dezimaldatenfehler, hier der code:

d zoned ds
d nummer 30p 0
d alpha 14A overlay(nummer)

Hat es einen bestimmten Grund warum mich der compiler zwingt da Alphafeld maximal halb so groß wie das gepackte Feld sein zu lassen?!



c d420 begsr
c eval(h) wcslen = cslen / 2
c evalR alpha = %subst(csdta:cspos:wcslen) /*Bis hierher alles ok*/
c evalR Alpha = %trimR(%char(nummer)) /*dezimaldatenfehler*
c evalR Alpha = %trimR(%editc(nummer:'Z'))
Zum dedzimaldat. fehler siehe Anhang.

Fuerchau
25-10-04, 16:31
SO einfach ist es nun auch wieder nicht !
Der evalR füllt nach links mit x'40' auf !!!
Dann "30p 0" belegt 16 Bytes !!!

Mach dir ein Hilfsfeld:
d Hex0 16 inz(*loval)

Dann mach den
evalR = Hex0 + %subst(.....)

Souljumper
26-10-04, 08:30
Ahhhh, ok danke. es klappt jetzt!

Vielen Dank an alle die mir geholfen haben:cool: .