Codierung Code128B

31. August 2012 09:57

Hallo, heute wende ich mich einmal an Euch.
Ich habe eine Codierung für den Strichcode Code128B gefunden und verwendet.

Leider wird das Prüfzeichen in einigen Fällen nicht richtig berechnet oder ich bin zu blöd:

Ich verwende den folgenden Code:

IF (ValueText = '') THEN
EXIT;
StartChar := 'š';
StopChar := 'œ';
BlankChar := '€';
Checksum := 104;
FOR i :=1 TO STRLEN(ValueText) DO BEGIN
CurrChar := ValueText[i];
IF (CurrChar <= 94) THEN
Checksum := Checksum + (i * (CurrChar - 32))
ELSE
Checksum := Checksum + (i * (CurrChar - 50));
END;
ChecksumVal := Checksum MOD 103;
ChecksumChar := ChecksumVal + 32;
ValueText := CONVERTSTR(ValueText,' ', FORMAT(BlankChar));
BarcodeBC128:=STRSUBSTNO('%1%2%3%4', StartChar, ValueText, ChecksumChar, StopChar);
EXIT(BarcodeBC128);

Es sollen nur numerische Werte = Lieferscheinnummern ausgedruckt werden.
In ca. 70 % Fälle klappt das auch, aber z. B. bei der Nummer 80052492 wird das Prüfzeichen auf 132 berechnet und der Barcode ist anschliessend š80052492äœ und nicht nicht lesbar.

Der Code entspricht Der Beschreigbung für die Codierung, soweit ich das sehen kann.

Hat jemand eine Idee, woran das liegen kann?

Re: Codierung Code128B

31. August 2012 12:20

Kann deinen Code nicht komplett nachvollziehen, aber vielleicht kannst du dir den Prüfsummencode hier ableiten. (Link)

Example: BarCode 1
Message : Start B B a r C o d e 1
Value 104 34 65 82 35 79 68 69 0 17
Position: - 1 2 3 4 5 6 7 8 9
Calculate Total: 104 + (34x1) + (65x2) + (82x3) + (35x4) + (79x5) +
(68x6) + (69x7) + (0x8) + (17x9) = 2093
2093/103 = 20 remainder 33
33 = A
Final message: (Start B)BarCode 1(A)(STOP)PLEASE NOTE: When you print the checksum character "A", you are REALLY printing ASCII character number 65 (not 33). You must add 32 to whatever the checksum number to find out what ASCII CHARACTER must be printed. Let's say you are printing a code A barcode using START A, and the checksum number you calculate is 64. You might think you would print a NULL character, but you would be wrong. You must add 32 to 64 to get 96. You would print ASCII character 96 (or the ` character)


mfg,
winfy

Re: Codierung Code128B

31. August 2012 13:13

Der Link entspricht der Berechnung in meinem Code.
Aber bei dem Wert 80052492 kommt als Prüfcode 100+32 heraus, der aber in dem Font Mapping nicht vorhanden ist, es wird also ein nicht druckbares Zeichen erzeugt (ä).
Und das verstehe ich nicht. Ich frage mich, wo da mein Fehler liegt.

Re: Codierung Code128B

31. August 2012 13:48

Und wenn du am Ende
Code:
ChecksumChar := ChecksumVal + 32;

weglässt und das Prüfzeichen anders ermittelst?

Laut meinem Mapping müsstest du hier das Zeichen ö haben.

Du könntest dir alle Prüfzeichen in eine Textvariable schreiben und den einzelnen Prüfzeichen mit der Position auf diese Textvariable oder Konstante ermitteln.

Code:
AllChecksumChar:=' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~áùâŠüöäÃ';


Beachte das Navision einen Array immer mit der Position 1 beginnt und nicht bei 0 wie in manch anderen Programmiersprachen.

Code:
ChecksumChar:= AllChecksumChar[ChecksumVal+1];



[EDIT]AllChecksumChar war zunächst nicht korrekt - wurde korrigiert[/EDIT]

mfg,
winfy

Re: Codierung Code128B

31. August 2012 14:23

Ich habe ja das Problem, das mir das Prüfzeichen berechnet wird, aber der Font Code128BWin kann laut
FontMapping das Zeichen 132 nicht drucken.
Berechnet wurde 132 = ä

Dies ist meine komplette Nr in CODE128: š80052492äœ

An der Stell des [ä] druckt der Font nur ein Kästchen oder eine leere Stelle, unterbricht also den Strichcode.

Re: Codierung Code128B

31. August 2012 14:55

Ich meine, dass die Zeichen, die in Winfys String hinter den Kleinbuchstaben kommen, in etwa ab dem ~ nicht mehr der Ascii-Reihenfolge entsprechen; da werden also andere Zeichen zugewiesen als bei dir.

Re: Codierung Code128B

31. August 2012 15:33

ANSI ist mit ASCII nur identisch von 0 bis 127 - darüber nicht mehr.

mfg,
winfy

Re: Codierung Code128B

31. August 2012 15:37

Trotzdem kann der Strichcode nicht gelesen werden.
Danke für die Hilfe Winfy, ich werden mich an den Lieferanten des Barcodes wenden.

Re: Codierung Code128B

31. August 2012 17:03

Hallo,

was heißt hier der Code ist nicht lesbar. Wer versteht ihn nicht, wer druckt Ihn aus?

evtl. ist das hier eine Hilfe.

Edit: Das hattest du anscheinend schon gesehen aber evtl hilft dir das hier weiter

Gruß, Fiddi

Re: Codierung Code128B

3. September 2012 09:05

fiddi hat geschrieben:Edit: Das hattest du anscheinend schon gesehen aber evtl hilft dir das hier weiter

Gruß, Fiddi


Könnte wirklich sein, dass ihm das hilft.

Man sieht hier gut das nach dem ASCII-Wert 0126 auf 0200 gesprungen wird.
Demnach ist das nicht durchgängig so einfach mit +32 zu berechnen, sondern ab 95 mit +105.

mfg,
winfy

Re: Codierung Code128B

3. September 2012 10:24

Man sieht hier gut das nach dem ASCII-Wert 0126 auf 0200 gesprungen wird.
Demnach ist das nicht durchgängig so einfach mit +32 zu berechnen, sondern ab 95 mit +105.


Das hängt immer von dem Font ab, den man verwendet.

Gruß, Fiddi