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
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
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
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
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
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
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