EAN-Nummer Auslesen

funnyluke

Grünschnabel
Ich versuche seid geraumer Zeit ein Programm zu entwickeltn, welches für mich EAN Nummern nach meinen Ansprüchen ausließt.

Dabei ist zu erst zu erklären die EAN Nummer ist eine Nummer die auf jedem Produkt zu finden ist, und es eindeutig identifiziert, änhlich der ISBN nummer bei Büchern.

Bsp:

Land Hersteller Artikel Prüfziffer
04 12978 99214 8

(Eine zusammenhängende Nummer versuche es nur im Forum deutlicher zu machen)

Dabei bestehen die ersten 2 Ziffern aus dem Herkunftsland:
Für mich interessant wären dabei nur:
00-09 USA/Kanada
40-43 Deutschland
49 Japan
90/91 Österreich
93 Australien
alles andre: Unbekanntes Land

Die nächsten 5 Ziffern sind die Herstellernummer
Dann eine 5 stellige Artikelnummer und zum schluß eine Prüfziffer.
Dabei soll die Herstellernummer und Artikelnummer lediglich ausgegeben werden.

Das alles wäre kein Problem aber:
Es soll überprüft werden ob die Eingabe die korrkte Länge, 13 Zeichen hat!
Ob die Eingabe nur aus Zahlen besteht!

Falls nach diesen kriterien kein Fehler besteht soll er halt wie gesagt die hersteller und Artikelnummer auslesen und ausgeben.

Im Anschluss soll er schaun ob die Nummer insgesammt mit der Prüfziffer zusammen zu einem richtigen ergebnis kommt, um auszuschließen das sich ein Zahlendreher eingemogelt hat.
Bsp
041297899214 Prüfziffer 8
Dabei wird nun immer abwechselnd mal 1 und mal 3 Multipliziert, d.h alle ungeraden Stellen in unserem Bsp: 0,1,9,8,9,1 mit 1 und alle Geraden mit 3 multiplizieren.
Diese dann alle addieren und dabei kommt in unserem Bsp 112 heraus.
Diese 112 dann mit unserer Prüfziffer adiert macht 120 und somit ist die Eingabe ohne Zahlendreher erfolgt. Die Prüfziffer dient dazu, auf die nächste glatte durch 10 teilbare Zahl aufzustocken. D.h für 94 wäre die Prüfziffer 6 usw. (Ich hoffe ihr habt es verstanden)

Als entgültige Ausgabe hätten wir dann.
Herkunftsland
Artikelnummer
Herstellernummer
Prüfsummenkorrektheit

Nun zu meinen ersten Lösungsansätzen:
Längenfunktion um länge zu ermitteln
Dann die ersten beiden Zeichen rauskopieren diese per Case Of Entscheidung zuordnen, dann ausgeben
Dann die Herstellernummer rauskopieren und ausgeben
Die Artikelnummer rauskopieren und ausgeben

Dann per Zählschleife
For i=1 To 13 Do
S:=Copy(Art,i,1)
If odd(i)
then Sum:=Sum+S
else Sum:=Sum+(3*S)
(Art ist meine Variable für die komplette Eingabe, S hier eine Zwischenvariable)


Dann kopiert er die Prüfziffer addiert sie mit meiner Variable "Sum" und schaut dann per If entscheidung ob
B mod 10=0 ist (mod überprüft ja nur alles nach dem Komma)
Dann halt die Ausgabe ob die Prüfsumme stimmt oder nicht.

Was ich nicht hinkriege:
Die Überprüfung ob es nur Zahlen sind
und traurig aber wahr, einen funktionierenden Quelltext :-(

Falls mir wer mit der Überprüfung oder dem ganzen Quelltext helfen kann wäre super nett. Bastle schon eine weile daran, kriege es aber einfach nicht zum laufen. Habe es mit absicht sehr ausfühlrich beschrieben, damit ihr auch sofort wisst, wie es genau aussehen soll!
 
Wow. Ein Erstpost und das in ordentlicher Schreibweise und mit eigenen Lösungsansätzen. Also wenn ich da nicht helfe, dann brauche ich nirgends zu helfen. :)

Ok, Problemstellung:
- Syntaxprüfung des Eingabewertes (Länge, Zahlen)
- Aufsplitten des Eingabewertes
- Semantische Prüfung (Prüfziffer)
- Ausgabe der Einzelteile

Das klingt für mich absolut nach einer eigenen Klasse.
Ich habe mal ein kleines Testprogramm gebastelt. Die Oberfläche dazu ist supereinfach:
- Formular, Name 'Main'
- Ein TEdit, Name 'edInput'
- Ein BitButton, Name btOk, Kind btOk
- Vier Labels, Name lbLand, lbHersteller, lbArtikel, lbGueltig

Enthalten sind im Source 2 Klassen:
- TEANObject: Das ist die Klasse, die die gesamten EAN-Prüfungen vornimmt. Mittels SendEAN kriegt sie einen String, schaut ob der paßt und wenn ja, dann wird der String entsprechend verarbeitet. Ansonsten hat das Ding nur einen Konstruktor, der es mit entsprechenden Defaultwerten vorbelegt.
- TMain: Das Hauptformular mit einer einzige Funktion: Wenn auf den 'ok'-Button geklickt wird, dann wird ein lokales EANObject erstellt, der Inhalt von edInput an das EANObject geschickt und hinterher werden die Labels gemäß des Inhalts des EANObjects aktualisiert.

Ich hoffe, der Source ist einfach genug gestrickt, daß er nachvollziehbar ist. :)

Code:
unit EANMain_unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils, Buttons;

type
  TEANObject = class(TObject)
  private
    fLand: String;
    fHersteller: String;
    fArtikel: String;
    fPruefziffer: String;
    fGueltig: boolean;

  public
    constructor Create;
    procedure SendEAN(EANNummer: String);

    property Land: String read fLand;
    property Hersteller: String read fHersteller;
    property Artikel: String read fArtikel;
    property Gueltig: boolean read fGueltig;
  end;


  TMain = class(TForm)
    edInput: TEdit;
    btOk: TBitBtn;
    lbLand: TLabel;
    lbHersteller: TLabel;
    lbArtikel: TLabel;
    lbGueltig: TLabel;

    procedure btOkClick(Sender: TObject);
  end;

var
  Main: TMain;

implementation

{$R *.dfm}

constructor TEANObject.Create;
begin
  inherited Create;

  fLand := '';
  fHersteller := '';
  fArtikel := '';
  fPruefziffer := '';
  fGueltig := false;
end;



procedure TEANObject.SendEAN(EANNummer: String);
var
  i: Integer;
  v: Integer;
  IsNumeric: boolean;
begin
  // Längenprüfung
  if Length(EANNummer) < 13 then ShowMessage('Die übergebene EAN Nummer ist zu kurz.')
  else if Length(EANNummer) > 13 then ShowMessage('Die übergebene EAN Nummer ist zu lang.')
  else
  begin
    // Prüfung, ob alle einzelnen Zeichen der übergebene EAN Nummer auch
    // Ziffern sind.
    IsNumeric := true;
    for i := 1 to 13 do
      if TryStrToInt(MidStr(EANNummer, i, 1), v) = false then ISNumeric := false;

    if IsNumeric = false then ShowMessage('Der übergebene Wert ist keine gültige EAN Nummer.')
    else
    begin
      // Aufteilen der übergebenen EAN Nummer auf die einzelnen Bereiche
      fLand := MidStr(EANNummer, 1, 2);
      fHersteller := MidStr(EANNummer, 3, 5);
      fArtikel := MidStr(EANNummer, 8, 5);
      fPruefziffer := MidStr(EANNummer, 13, 1);

      v := StrToInt(fLand);

      // Ländercodeprüfung
      if not( (v < 10) or
              ((v >= 40) and (v <= 43)) or
              (v = 49) or
              (v = 90) or
              (v = 91) or
              (v = 93)
            ) then
        ShowMessage('Die EANNummer bezieht sich auf ein nicht relevantes Land.')
      else
      begin
        // Prüfziffernprüfung
        v := 0;
        for i := 1 to 12 do
        if odd(i) then
          v := v + StrToInt(MidStr(EANNummer, i, 1))
        else
          v := v + (StrToInt(MidStr(EANNummer, i, 1)) * 3);

        v := v + StrToInt(MidStr(EANNummer, 13, 1));

        if v mod 10 <> 0 then ShowMessage('Die Prüfziffer stimmt nicht mit der EAN Nummer überein.')
        else fGueltig := true;
      end;
    end;
  end;
end;



procedure TMain.btOkClick(Sender: TObject);
var
  EANObject: TEANObject;
begin
  EANObject := TEANObject.Create;
  EANObject.SendEAN(edInput.Text);

  lbLand.Caption := 'Land: ' + EANObject.Land;
  lbHersteller.Caption := 'Hersteller: ' + EANObject.Hersteller;
  lbArtikel.Caption := 'Artikel: ' + EANObject.Artikel;

  if EANObject.Gueltig = true then
    lbGueltig.Caption := 'EAN Nummer ist gültig.'
  else
    lbGueltig.Caption := 'EAN Nummer ist NICHT gültig.';

  if (EANObject <> nil) then FreeAndNil(EANObject);
end;



end.
 

Neue Beiträge

Zurück