PDA

View Full Version : Datamatrix / Dezimal / hexadezimal



Peterfritz
07-08-14, 12:34
Hallo Zusammen,
ich erstelle gerade einen Datamatrix Code mit 28 Byte.
Klappt auch alles ganz gut, wenn ich die Felder initialisiere.
28 Datenbytes
Gesamtstring: 44 45 41 12 1C 01 2B B7 45 6D 00 BE 57 8D 00 B6 00 00 0E 01 15 56 00 00 00 00 00 00
Sobald ich aber eine Variable einstelle ist der Barcode nicht mehr lesbar.

DS inz

Datamatrix 1 - 28

Postnr 1 3 inz(x'444541')
Frankierart 4 4 inz(x'12'
Version 5 5 inz((x'1C)
usw.

Habe mir ein PGM zurechtgelegt, dass mir aus einem Dezimalwert einen
Hexadezimalen Wert zurück gibt,

Bsp. " Feld Frankierart"

errechneter Hexadezimalwert = 12 ( errechnet aus Dezimal 18)

Wie bringe ich diesen Wert "12" im RPG in das einstellige Bytefeld (Frankierart) ohne INIT ?

Vielen Dank im Voraus

PF

Joe
07-08-14, 13:16
Hallo.

Knstante definieren und moven ?
D Franki C CONST(X'12')

Gruß Joe

Peterfritz
07-08-14, 13:47
Hallo,
da bin ich dann soweit wie vorher (CONST gefüllt mit x'12 = gleich wie inz(x'12')
Konstante geht hier in diesem Fall nicht. Ich muss einen variablen Wert
in das 4 Byte bringen( Frankierart)

PF

B.Hauser
07-08-14, 14:06
Ganz einfach:

Definiere für jedes Byte ein einstellige Integer Variable (3 U 0) und addiere in dieses jeweils den gepackten Wert.
Lege die einzelnen Bytes/Variablen als Feldgruppen-Elemente an und überlagere die Feldgruppe mit einem alphanumerischen String.

Deine Umrechnungsorgie kannst Du Dir dann sogar sparen.


D DS DS
D String 28A
D ArrInt 3u 0 Dim(28) Overlay(String);

/Free
Clear DS;
ArrInt(1) = 18; //Jetzt sollte in String auf der 1.Stelle hex(12) stehen
/End-Free

Birgitta

Joe
07-08-14, 14:15
Hallo,
da bin ich dann soweit wie vorher (CONST gefüllt mit x'12 = gleich wie inz(x'12')
Konstante geht hier in diesem Fall nicht. Ich muss einen variablen Wert
in das 4 Byte bringen( Frankierart)

PF

Wenn die Frankierart überschaubar ist, dann definiere diese doch als einzlne Konstanten
oder rechnen in HEX um.

Joe

malzusrex
07-08-14, 14:22
Okay,

Birgitta war mal wieder schneller und eleganter.

Möchte mein Lösungsansatz aber auch noch zum Besten geben.
Ich nutze auch gleich den Dezimalwert


h dftactgrp(*no)
d True c *On
d False c *Off
d
d hex pr 1
d 3 0
d
d Frankierart s 1
d Wert s 3 0 Inz( 18 )

c Eval Frankierart = hex( Wert )
c
c Eval *InLr = True

p Hex b
d pi 1
d Zahl 3 0
d Zahl 3 0
d Rueckgabe s 1 inz( x'00' )

c If Zahl > 255
c Return Rueckgabe
c EndIf
c
c If Zahl >= 128
c Biton '0' Rueckgabe
c Eval Zahl -= 128
c EndIf
c If Zahl >= 64
c Biton '1' Rueckgabe
c Eval Zahl -= 64
c EndIf
c If Zahl >= 32
c Biton '2' Rueckgabe
c Eval Zahl -= 32
c EndIf
c If Zahl >= 16
c Biton '3' Rueckgabe
c Eval Zahl -= 16
c EndIf
c If Zahl >= 8
c Biton '4' Rueckgabe
c Eval Zahl -= 8
c EndIf
c If Zahl >= 4
c Biton '5' Rueckgabe
c Eval Zahl -= 4
c EndIf
c If Zahl >= 2
c Biton '6' Rueckgabe
c Eval Zahl -= 2
c EndIf
c If Zahl >= 1
c Biton '7' Rueckgabe
c Eval Zahl -= 1
c EndIf
c
c Return Rueckgabe

p Hex e


Gruß
Ronald

Peterfritz
07-08-14, 14:26
Hallo Birgitta,
erst mal vielen Dank.
Hört sich ja vielversprechend an.
Ich bin leider im ILE / RPG400 noch nicht so tief drin. Werde es aber versuchen.

Was mache ich z. Bsp in diesem Fall
Gleicher String:
im Byte 6 bis 10 habe ich eine 10 Stellige Post-Nr. zu vergeben ( 5028398445 = dezimal)

Vielen Dank im Voraus.

PF

malzusrex
07-08-14, 22:25
Was soll in Byte 6-10 stehen
5028398445
Byte 6 = 50
Byte 7 = 28
Byte 8 = 39
Byte 9 = 84
Byte 10 = 45

Oder umgerechnet in HEX = 12BB7456D
6 = 01
7 = 2B
8 = B7
9 = 45
10 = 6D
??

Gruß
Ronald

B.Hauser
08-08-14, 06:29
Im ersten Fall, d.h. dass der gepackete Wert auf die Stellen 6-10 übertragen werden soll, musst Du lediglich die Positionen 6-10 als gepackt numerisches Feld definieren (11P 0) und anschließend den Wert übernehmen:


D DS1 DS Inz
D Alpha1 28A
D Dec 11P 0 Overlay(Alpha1: 6)

* Alternativ
D DS1 DS Inz
D Alpha1 28A
D Dec 6 10P 0

/Free
Dec = 5028398445;

Im zweiten Fall ist es ein bisschen trickier, da Integer-Felder nur 1 (= 3U 0), 2 (= 5U 0), 4 (= 10U 0) oder 8 (= 20U 0) Byte groß definiert werden können. 5028398445 muss in ein 8 Byte großes Feld addiert werden. Da Du jedoch 5 Byte benötigst müssen im Anschluss nur die Stellen/Bytes 4-8 in das eigentliche Text-Feld übernommen werden.

Etwa so:

D DS2 DS Inz
D Alpha2 28A
D Alpha2A 5A Overlay(Alpha2: 6)

D DS3 DS Inz
D Alpha3 8A
D Int 20U 0 Overlay(Alpha3)

/Free
Int = 5028398445;
Alpha2A = %Subst(Alpha3: 4);

Birgitta