[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Nov 2004
    Beiträge
    11

    Datamatrix / Dezimal / hexadezimal

    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

  2. #2
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Hallo.

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

    Gruß Joe

  3. #3
    Registriert seit
    Nov 2004
    Beiträge
    11
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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.

    Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Zitat Zitat von Peterfritz Beitrag anzeigen
    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

  6. #6
    Registriert seit
    May 2002
    Beiträge
    1.121
    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
    PHP-Code:
    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 hexWert )
    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

  7. #7
    Registriert seit
    Nov 2004
    Beiträge
    11
    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

  8. #8
    Registriert seit
    May 2002
    Beiträge
    1.121
    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

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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:

    Code:
    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:
    Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. Dezimal- Punkt oder Komma!
    By Daniel Ritzmann in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 15-03-02, 15:37

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •