[gelöst] Code 39,Funktion Prüfziffernberechnung Modulo43

14. Februar 2012 19:38

Hallo zusammen.

Ich habe nicht vor von jemandem den Code schreiben zu lassen, aber ich frage einfach mal nach :oops:

Ich muss in einem Barcode (Code 39) eine Prüfziffer ergänzen nach Modulo43. Bedeutet jeder Buchstabe und die zulässigen Sonderzeichen bekommen eine Zahl zugeordnet, werden in der Quersumme addiert und durch 43 geteilt. Der Rest der Teilung wird wiederum per zugeordneten Zeichen zum endgültigen Prüfzeichen uzmgerechnet.

Hat jemand zufällig eine solche Funktion "auf Lager" ?
Hier der Link zur Beschreibung : http://www.activebarcode.de/codes/checkdigit/modulo43.html

Viele Grüße
Zuletzt geändert von alexanderp am 16. Februar 2012 10:58, insgesamt 3-mal geändert.

Re: Code 39,Funktion zur Prüfziffernberechnung nach Modulo43

14. Februar 2012 19:46

Willkommen bei uns!

alexanderp hat geschrieben:Hat jemand zufällig eine solche Funktion "auf Lager" ?

Ich zufällig nicht, aber zur Not liefert dir das - hoffentlich - die notwendigen Inspirationen:
viewtopic.php?f=7&t=2586
http://www.mibuso.com/forum/viewtopic.php?f=5&t=28523

Re: Code 39,Funktion zur Prüfziffernberechnung nach Modulo43

15. Februar 2012 16:57

Vielleicht hilft Dir eine Lösung, die wir hier für Modulo11 verwenden.

Code:

PRZglobal := GetPRZ(10, BarcodeKlartextOhnePRZ);
BarcodeKlartext := BarcodeKlartextOhnePRZ + FORMAT(PRZglobal);


// Variablen für GetPRZ

piModul                   Integer      
piNutzziffern   Text      1024
//GetPRZ

IF piModul < 1 THEN BEGIN
  ERROR('Modul darf nicht kleiner 1 sein.');
END;

FOR Pos := 1 TO STRLEN(piNutzziffern) DO BEGIN
  Char := COPYSTR(piNutzziffern, Pos, 1);
  CurrPRZ := STRPOS('0123456789', Char);
  IF CurrPRZ = 0 THEN BEGIN
    ERROR('Zeichen dürfen nur 0123456789 enthalten.');
  END ELSE BEGIN
    CurrPRZ -= 1;
    PRZ := (PRZ + CurrPRZ) MOD piModul;
  END;
END;

retPRZ := (piModul - (PRZ MOD piModul)) MOD piModul;

Re: Code 39,Funktion zur Prüfziffernberechnung nach Modulo43

15. Februar 2012 17:13

Hallo.

Danke für die Tipps. Die Themen hatte ich schon gefunden und den Quellcode nach Modulo 11 auch. Beide beziehen sich aber leider auf Quersummen bei Zahlen.
Ich bastel mir mal was auf den Grundlagen. Danke Euch für die Tipps.

Quellcode schiebe ich dann hier rein. :-)

Re: [gelöst] Code 39,Funktion Prüfziffernberechnung Modulo43

15. Februar 2012 17:31

Oh, Da hast Du wohl Recht. Das hat mit Modulo 11 nicht viel zu tun ;-)
Ich würde mir eine Tabelle nehmen mit zwei Feldern.
Integer und Text(1)
In das Integerfeld schreibst Du die Zahlen 0-42 und in das Textfeld den jeweiligen Wert(0..10, A..Z und die Sonderzeichen).
Den Primary Key legst Du auf das Feld Wert, dann kannst Du Dir mittels Get recht einfach die Referenzzahl holen.

So würde ich das machen.

Gruß
Alexander

Re: [gelöst] Code 39,Funktion Prüfziffernberechnung Modulo43

15. Februar 2012 19:08

Hallo,

das könnte ein Muster für die Funktion sein, die das Prüfzeichen berechnet :wink:

i,ChPOS,CRCSum sind integer, SearchStr vom Typ Text[50];

Code:
procedure CalcCode39Mod43(TXT : Text[30]) : Text[30]
begin
  SearchStr :='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
  for i:=1 to Strlen(TXT) do 
  begin
    ChPOS :=strpos(SearchStr,format(txt[i]));
    if ChPOS =0 then
      error('unzulässiges Zeichen:'+format(TXT[i]));
    crcsum += (ChPOS -1);
  end;
  exit(txt+format(searchstr[(crcsum mod 43)+1]));
end;


Habe es nicht genau getestet, aber mit meinem Beispiel hat es funktioniert.

Gruß, Fiddi

Re: Code 39,Funktion Prüfziffernberechnung Modulo43

16. Februar 2012 09:51

So hier habe ich nun meine Funktion zur Prüfziffer Modulo 43. Danke für die Unterstützung Fiddi.

Ich bin klein , was Programmierung angeht. Sicher gibt es noch ein paar Opitimierungsmöglichkeiten und Fehlerprüfungen , die man einbauen kann. So läufts fast richtig.


Code:
//Parameter
//BarcodeString                Text         60

//Variablen
//BarcodeStringModulo43   Text      5
//BarcodeStringLength   Integer      
//Modulo43                   Integer         
//CharVar                           Text      30
//Pos                           Integer      
//SumBarcode                   Integer      
//SumVar                           Integer      

SumBarcode := 0;
Modulo43 := 0;

FOR Pos := 1 TO STRLEN(BarcodeString) DO BEGIN
  CharVar := COPYSTR(BarcodeString, Pos, 1);
   //Umrechnung Zeichen zu Zahlenwert
   CASE CharVar OF
     '0': SumVar := 0;
     '1': SumVar := 1;
     '2': SumVar := 2;
     '3': SumVar := 3;
     '4': SumVar := 4;
     '5': SumVar := 5;
     '6': SumVar := 6;
     '7': SumVar := 7;
     '8': SumVar := 8;
     '9': SumVar := 9;
     'A': SumVar :=10;
     'B': SumVar :=11;
     'C': SumVar :=12;
     'D': SumVar :=13;
     'E': SumVar :=14;
     'F': SumVar :=15;
     'G': SumVar :=16;
     'H': SumVar :=17;
     'I': SumVar :=18;
     'J': SumVar :=19;
     'K': SumVar :=20;
     'L': SumVar :=21;
     'M': SumVar :=22;
     'N': SumVar :=23;
     'O': SumVar :=24;
     'P': SumVar :=25;
     'Q': SumVar :=26;
     'R': SumVar :=27;
     'S': SumVar :=28;
     'T': SumVar :=29;
     'U': SumVar :=30;
     'V': SumVar :=31;
     'W': SumVar :=32;
     'X': SumVar :=33;
     'Y': SumVar :=34;
     'Z': SumVar :=35;
     '-': SumVar :=36;
     '.': SumVar :=37;
     ' ' : SumVar :=38;
     '$': SumVar :=39;
     '/': SumVar :=40;
     '+': SumVar :=41;
     '%': SumVar :=42;
    ELSE
      MESSAGE('Unzulässiges Zeichen für HIBC Barcode');
    END;
  SumBarcode := SumBarcode + SumVar;
END;
Modulo43 := (SumBarcode MOD 43);

//Umrechnung Zahlenwert zu Zeichen
CASE Modulo43 OF
  0: BarcodeStringModulo43 :='0';
  1: BarcodeStringModulo43 :='1';
  2: BarcodeStringModulo43 :='2';
  3: BarcodeStringModulo43 :='3';
  4: BarcodeStringModulo43 :='4';
  5: BarcodeStringModulo43 :='5';
  6: BarcodeStringModulo43 :='6';
  7: BarcodeStringModulo43 :='7';
  8: BarcodeStringModulo43 :='8';
  9: BarcodeStringModulo43 :='9';
  10: BarcodeStringModulo43 :='A';
  11: BarcodeStringModulo43 :='B';
  12: BarcodeStringModulo43 :='C';
  13: BarcodeStringModulo43 :='D';
  14: BarcodeStringModulo43 :='E';
  15: BarcodeStringModulo43 :='F';
  16: BarcodeStringModulo43 :='G';
  17: BarcodeStringModulo43 :='H';
  18: BarcodeStringModulo43 :='I';
  19: BarcodeStringModulo43 :='J';
  20: BarcodeStringModulo43 :='K';
  21: BarcodeStringModulo43 :='L';
  22: BarcodeStringModulo43 :='M';
  23: BarcodeStringModulo43 :='N';
  24: BarcodeStringModulo43 :='O';
  25: BarcodeStringModulo43 :='P';
  26: BarcodeStringModulo43 :='Q';
  27: BarcodeStringModulo43 :='R';
  28: BarcodeStringModulo43 :='S';
  29: BarcodeStringModulo43 :='T';
  30: BarcodeStringModulo43 :='U';
  31: BarcodeStringModulo43 :='V';
  32: BarcodeStringModulo43 :='W';
  33: BarcodeStringModulo43 :='X';
  34: BarcodeStringModulo43 :='Y';
  35: BarcodeStringModulo43 :='Z';
  36: BarcodeStringModulo43 :='-';
  37: BarcodeStringModulo43 :='.';
  38: BarcodeStringModulo43 :=' ';
  39: BarcodeStringModulo43 :='$';
  40: BarcodeStringModulo43 :='/';
  41: BarcodeStringModulo43 :='+';
  42: BarcodeStringModulo43 :='%';
ELSE BEGIN
  MESSAGE('Prüfziffer fehlerhaft');
  EXIT;
  END;
END;

EXIT(BarcodeStringModulo43);


Nun noch ein Problem, daher habe ich den Beitrag nochmal aufgemacht.

:?: Ich möchte mit EXIT(BarcodeStringModulo43); die Prüfziffer zurück an den Report übergeben. Dort rufe ich die Codeuit mit FunctionsInhouse.HIBCModulo43Calc(BarcodeString); auf. Ich bekomme aber die Prüfziffer BarcodeStringModulo43 nicht im Report.

Jemand dazu eine Idee ?

Re: Code 39,Funktion Prüfziffernberechnung Modulo43

16. Februar 2012 10:16

Hallo,

wenn du nur die Prüfziffer für den String haben willst, dann geht das so. Das funktioniert aber nicht, um die Prüfziffer zu überprüfen, das muss man dann etwas anders lösen

Code:
procedure CalcCode39Mod43Char(TXT : Text[30]) : Text[30]
begin
  SearchStr :='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
  for i:=1 to Strlen(TXT) do
  begin
    ChPOS :=strpos(SearchStr,format(txt[i]));
    if ChPOS =0 then
      error('unzulässiges Zeichen:'+format(TXT[i]));
    crcsum += (ChPOS -1);
  end;
  exit(format(searchstr[(crcsum mod 43)+1])); // hier die Änderung zu meiner Ursprünglichen Funktion
end;


Prüfziffer prüfen. Übergeben wird Code39 mit Prüfziffer

Code:
procedure CheckCode39Mod43(TXT : Text[30]) :boolean
begin
  SearchStr :='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%';
  for i:=1 to Strlen(TXT)-1 do  // man beachte hier
  begin
    ChPOS :=strpos(SearchStr,format(txt[i]));
    if ChPOS =0 then
      error('unzulässiges Zeichen:'+format(TXT[i]));
    crcsum += (ChPOS -1);
  end;
  exit(searchstr[(crcsum mod 43)+1]=TXT[Strlen(txt)]); // und hier
end;