EAN-13 Barcode

29. Juni 2022 08:58

Hallo zusammen,

ich habe ein Problem beim encodieren von EAN-13 Barcodes. Folgende Funktion habe ich dafür geschrieben:

local procedure EncodeEAN13(ValueToEncode: Text) EncodedText: Text
var
BarcodeSymbology: Enum "Barcode Symbology";
BarcodeFontProvider: Interface "Barcode Font Provider";
test: Interface "Barcode Font Encoder";
begin
if ValueToEncode <> '' then begin
BarcodeFontProvider := Enum::"Barcode Font Provider"::IDAutomation1D;
BarcodeSymbology := Enum::"Barcode Symbology"::"EAN-13";
BarcodeFontProvider.ValidateInput(ValueToEncode, BarcodeSymbology);
Exit(BarcodeFontProvider.EncodeFont(ValueToEncode, BarcodeSymbology));
end else
exit('');
end;

In einem Beispiel habe ich den Wert 4003214018089 encodieren wollen. Als Rückgabewert habe ich Y(0A32BE*KLSKST( bekommen und der Barcode passt so nicht (enthält Rechtecke).
Der richtige Wert wäre 4AKDCLE*abiaij+ . Damit funktioniert das ganze. Getestet habe ich das mit einer Excel-Datei aus einem youtube-Video 8-) https://youtu.be/5fIJftPqE7k

Vielen Dank schonmal für eure Hilfe und sonnige Grüße

Jens

Re: EAN-13 Barcode

29. Juni 2022 09:27

Hallo,

benutzt du denn in deinem Report- Feld auch den ID-Automation- Font für EAN13, für den die Encoding- Routinen geschrieben wurden?
Das muss immer zusammenpassen.

Wenn du eine anderen Font verwenden willst, dann musst du dir die Routinen beschaffen, und einen eigenen FontProvider stricken, oder vielleicht einfacher, eine Funktion erstellen, der du den Barcodewert übergibst und die den übersetzten Wert als Text zurückgibt. (Dein Youtube- Video ist für einen andern Font)

Wenn du OnPrem arbeitest wirst du dir wahrscheinlich die Funktion erstellen müssen. ( Die ID-Automation- Barcode- Fonts sind nicht gerade kostenlos). In SaaS kannst du den ID-Automation- Font ohne zusätzliche Kosten benutzen. Da wird dein eigener wohl nicht einsetzbar sein.

Gruß Fiddi

Re: EAN-13 Barcode

29. Juni 2022 10:32

Hallo,

vielen Dank für die Erleuchtung, Fiddi. Jetzt muss ich mich also entscheiden, ob wir eine Schriftart kaufen (795 $ für 100 User) oder ob ich versuche, diese Excel-Formel in AL zu bekommen:

=TEIL(C4;1;1)&ZEICHEN(TEIL(C4;2;1)+65)&ZEICHEN(TEIL(C4;3;1)+WENN(ISTNV(VERGLEICH(WERT(TEIL(C4;1;1));{0;1;2;3};0));75;65))&ZEICHEN(TEIL(C4;4;1)+WENN(ISTNV(VERGLEICH(WERT(TEIL(C4;1;1));{0;4;7;8};0));75;65))&ZEICHEN(TEIL(C4;5;1)+WENN(ISTNV(VERGLEICH(WERT(TEIL(C4;1;1));{0;1;4;5;9};0));75;65))&ZEICHEN(TEIL(C4;6;1)+WENN(ISTNV(VERGLEICH(WERT(TEIL(C4;1;1));{0;2;5;6;7};0));75;65))&ZEICHEN(TEIL(C4;7;1)+WENN(ISTNV(VERGLEICH(WERT(TEIL(C4;1;1));{1;4;6;8;9};0));75;65))&"*"&ZEICHEN(TEIL(C4;8;1)+97)&ZEICHEN(TEIL(C4;9;1)+97)&ZEICHEN(TEIL(C4;10;1)+97)&ZEICHEN(TEIL(C4;11;1)+97)&ZEICHEN(TEIL(C4;12;1)+97)&ZEICHEN(TEIL(C4;13;1)+97)&"+"

Vielleicht hat sich hier schon einmal jemand daran ausgelassen und möchte sein Ergebnis preis geben :-P Ansonsten muss ich mich eventuell mal mit Excel befassen, um die Formel verstehen zu können.

Viele Grüße

Jens

Re: EAN-13 Barcode

29. Juni 2022 11:58

Hallo,

schau dir das(Mibuso) mal an.

Gruß Fiddi

Re: EAN-13 Barcode

29. Juni 2022 13:58

Hallo Fiddi,

vielen Dank! Das war genau das, was ich gesucht habe. Falls noch jemand leidet und OnPrem unterwegs ist, hier die Lösung in AL (dran denken: ihr müsst euch bzw. auf dem Dienst-Server die Schriftart aus Fiddis Link installieren und im Report benutzen):

Code:
    #region Barcode
    Procedure CreateValueEAN13(InString: text[13]) BarCodeString: Text
    var
        i: Integer;
        Workstring: Text;
        checksum: integer;
        first: Integer;
        Table: Integer;

    begin
        if InString = '' then
            exit('');

        FOR i := 1 TO 12 DO
            IF CharToInt(InString[i]) > -1 THEN BEGIN
                WorkString[i] := InString[i];
            END;
        FOR i := 2 TO 12 DO BEGIN
            checksum := checksum + (CharToInt(InString[i]));
            i := i + 1;
        END;
        checksum := checksum * 3;
        FOR i := 1 TO 11 DO BEGIN
            checksum := checksum + (CharToInt(InString[i]));
            i := i + 1;
        END;
        WorkString[13] := IntToChar((10 - checksum MOD 10) MOD 10);
        first := CharToInt(InString[1]);
        BarCodeString[1] := IntToChar(first);
        BarCodeString[2] := (65 + CharToInt(WorkString[2]));
        FOR i := 3 TO 7 DO BEGIN
            Table := 0;
            CASE i OF
                3:
                    BEGIN
                        IF (first < 4) AND (first > 1) THEN
                            Table := 1;
                    END;
                4:
                    BEGIN
                        IF (first = 0) OR (first = 4) OR (first = 7) OR (first = 8) THEN
                            Table := 1;
                    END;
                5:
                    BEGIN
                        IF (first = 0) OR (first = 1) OR (first = 4) OR (first = 5) OR (first = 9) THEN
                            Table := 1;
                    END;
                6:
                    BEGIN
                        IF (first = 0) OR (first = 2) OR (first = 5) OR (first = 6) OR (first = 7) THEN
                            Table := 1;
                    END;
                7:
                    BEGIN
                        IF (first = 0) OR (first = 3) OR (first = 6) OR (first = 8) OR (first = 9) THEN
                            Table := 1;
                    END;
            END;
            IF Table = 1 THEN
                BarCodeString[i] := (65 + CharToInt(WorkString[i]))
            ELSE
                BarCodeString[i] := (75 + CharToInt(WorkString[i]));
        END;
        BarCodeString[8] := '*';
        FOR i := 8 TO 13 DO
            BarCodeString[i + 1] := (97 + CharToInt(WorkString[i]));
        BarCodeString[15] := '+';
        exit(BarCodeString);
    end;

    local procedure CharToInt(c: Char) n: Integer
    begin
        CASE c OF
            '0':
                BEGIN
                    n := 0;
                    EXIT;
                END;
            '1':
                BEGIN
                    n := 1;
                    EXIT;
                END;

            '2':
                BEGIN
                    n := 2;
                    EXIT;
                END;

            '3':
                BEGIN
                    n := 3;
                    EXIT;
                END;

            '4':
                BEGIN
                    n := 4;
                    EXIT;
                END;

            '5':
                BEGIN
                    n := 5;
                    EXIT;
                END;

            '6':
                BEGIN
                    n := 6;
                    EXIT;
                END;

            '7':
                BEGIN
                    n := 7;
                    EXIT;
                END;
            '8':
                BEGIN
                    n := 8;
                    EXIT;
                END;

            '9':
                BEGIN
                    n := 9;
                    EXIT;
                END;
            ELSE BEGIN
                n := -1;
                EXIT;
            END;
        END;
    end;

    local procedure IntToChar(n: Integer) c: Char
    begin
        CASE n OF
            0:
                BEGIN
                    c := '0';
                    EXIT;
                END;
            1:
                BEGIN
                    c := '1';
                    EXIT;
                END;

            2:
                BEGIN
                    c := '2';
                    EXIT;
                END;

            3:
                BEGIN
                    c := '3';
                    EXIT;
                END;

            4:
                BEGIN
                    c := '4';
                    EXIT;
                END;

            5:
                BEGIN
                    c := '5';
                    EXIT;
                END;

            6:
                BEGIN
                    c := '6';
                    EXIT;
                END;

            7:
                BEGIN
                    c := '7';
                    EXIT;
                END;
            8:
                BEGIN
                    c := '8';
                    EXIT;
                END;

            9:
                BEGIN
                    c := '9';
                    EXIT;
                END;
            ELSE BEGIN
                c := 'X';
                EXIT;
            END;
        END;

    end;

    #endregion Barcode


Nochmals vielen Dank :wink:

Jens
Zuletzt geändert von Jens1973 am 29. Juni 2022 21:00, insgesamt 1-mal geändert.

Re: EAN-13 Barcode

29. Juni 2022 15:57

Hallo,


Wenn du jetzt deinen Code noch als Code formatieren würdest:
Code:
#region Barcode
Procedure CreateValueEAN13(InString: text[13]) BarCodeEncoded: Text
var
    i: Integer;
   checksum: integer;
   first: Integer;
   Table: Integer;

begin
  IF InString = '' THEN
      EXIT('');

  first := InString[1]-48;
  BarcodeEncoded[1] := InString[1];
  BarcodeEncoded[2] := (65 + Instring[2])-48; 
  FOR i := 3 TO 7 DO BEGIN
      Table := 0;
      CASE i OF
        3: IF (first < 4) AND (first > 1) THEN
                Table := 1;
        4: IF (first = 0) OR (first = 4) OR (first = 7) OR (first = 8) THEN
                Table := 1;
        5: IF (first = 0) OR (first = 1) OR (first = 4) OR (first = 5) OR (first = 9) THEN
                Table := 1;
        6: IF (first = 0) OR (first = 2) OR (first = 5) OR (first = 6) OR (first = 7) THEN
              Table := 1;
        7: IF (first = 0) OR (first = 3) OR (first = 6) OR (first = 8) OR (first = 9) THEN
              Table := 1;
      END;
      IF Table = 1 THEN
          BarcodeEncoded[i] := (65 + Instring[i]-48)
      ELSE
          BarcodeEncoded[i] := (75 + Instring[i]-48);
  END;
  BarcodeEncoded[8] := '*';
  FOR i := 8 TO 13 DO
      BarcodeEncoded[i + 1] := (97 + Instring[i]-48);
  BarcodeEncoded[15] := '+';
end;
#endregion Barcode

Dann sieht das etwas umfomatiert in C/AL so aus (kompletter EAN vorausgesetzt)

Gruß Fiddi

Re: EAN-13 Barcode

29. Juni 2022 21:07

Hallo,
jetzt sieht´s schick aus :mrgreen:
Gruß
Jens