Magento: Kunden-, Bestell- oder Rechnungsnummern ändern

Das OpenSource Shop System Magento sticht besonders durch seinen Featurereichtum vor und macht durch auch alt etablierten kommerziellen Shop-Systemen ernsthaft Konkurrenz. Zudem ist das Administrationsinterface klar gegliedert und erlaubt weitesgehend Zugriff auf alle Funktionen und Einstellen.

Magento OpenSource eCommerceEine Sache scheinen die Entwickler bislang vergessen zu haben, welche besonders auffällt wenn man einen bestehenden Shop von einen anderen System zu Magento migrieren muss. Sobald eine Rechnung erstellt wird,  wird von Magento automatisch eine fortlaufende Nummer erzeugt. Soweit werden schon mal die deutschen gesetzlichen Vorgaben an eine ordentliche Vergabe von Rechnungsnummern erfüllt. Allerdings hat ein Administrator leider keinerlei Möglichkeit die Rechnungsstartnummer nach Installation des Systems im Administrationmenu zu konfigurieren. Zudem sind die Rechnungsnummer immer automatisch 8-stellig und daher lautet die erste vergebene Nummer immer 10000001.

Allerdings kann man auch diese nervige Sache ohne allzu große Mühe abstellen. Ein paar Recherchen ergaben das Magento keine gewöhnlich inkrementelle Fortschreibung der Nummernkreise betreibt, sondern sie explizit in Feldern in einer Datenbanktabelle definiert. Diese Felder kann man ganz leicht quasi manuell mit einem SQL-Tool wie phpmyadmin editieren oder anpassen, aber eleganter ist das Ganze via SQL-Script das alles auf einen Rutsch erledigt.

Hinweis:
Magento ist berühmt dafür besonders fragil auf Upgrades & Co zu reagieren, deshalb hier die eindringliche Warnung noch vor Anwendung irgendwelcher Datenbankeingriffe unbedingt ein komplettes Backup vorzunehmen !

Die Anwendung des folgenden SQL-Scripts kann über zweierlei Varianten geschehen je nachdem welche konkreten Möglichkeiten man jeweils hat.

A.) via phpmyadmin ..

Einloggen in das Webfrontend, die entsprechende Datenbank des Magento-Shops auswählen, dann im oberen mittigen Bereich auf den SQL-Button klicken und das SQL Script via copy+paste reinbefördern und ausführen lassen. Vorteil bei dieser Lösung ist das man sofort das Ergebniss direkt begutachten kann, ohne gleich ein SQL-Experte zu sein.

B.) via mysql Commandozeile ..

Dazu braucht man auf dem jeweiligen Server einen interaktiven Shell-Zugriff meist in Form eines SSH-Logins. Anschliessend muss man zunächst das angepasste Script als Datei hochgeladen werden. Um diese anschliessend im Commando


mysql -p -u {BENUTZER} {DATENBANKNAME} <{/pfad/zur/scriptdatei.sql}

auszuführen zu können. Die Angaben in {}-Klammer müssen natürlich durch konkrete eigene Werte ersetzt werden !

Hier das SQL-Script was die Magento-Konfiguration nun entsprechend geraderückt ..

--
-- ** Längendefinitionen **
--
-- Länge Kundennummern
UPDATE `eav_entity_type` SET `increment_pad_length` = '5' WHERE `entity_type_code`='customer' AND `entity_model`='customer/customer';
--
-- Länge Bestellnummern
UPDATE `eav_entity_type` SET `increment_pad_length` = '5' WHERE `entity_type_code`='order'    AND `entity_model`='sales/order';
--
-- Länge Rechnungsnummern
UPDATE `eav_entity_type` SET `increment_pad_length` = '5' WHERE `entity_type_code`='invoice'  AND `entity_model`='sales/order_invoice';
--
-- Länge Sendungsnummern
UPDATE `eav_entity_type` SET `increment_pad_length` = '6' WHERE `entity_type_code`='shipment' AND `entity_model`='sales/order_shipment';
--
-- ** Startwerte aendern **
--
-- Startwert Kundennummern
UPDATE `eav_entity_store`,`eav_entity_type` SET `increment_last_id` = '50000',`increment_prefix`='' WHERE `eav_entity_store`.`entity_type_id`=`eav_entity_type`.`entity_type_id` AND `entity_type_code`='customer' AND `entity_model`='customer/customer';
--
-- Startwert Bestellnummern
UPDATE `eav_entity_store`,`eav_entity_type` SET `increment_last_id` = '50000',`increment_prefix`='' WHERE `eav_entity_store`.`entity_type_id`=`eav_entity_type`.`entity_type_id` AND `entity_type_code`='order'    AND `entity_model`='sales/order';
--
-- Startwert Rechnungsnummern
UPDATE `eav_entity_store`,`eav_entity_type` SET `increment_last_id` = '50000',`increment_prefix`='' WHERE `eav_entity_store`.`entity_type_id`=`eav_entity_type`.`entity_type_id` AND `entity_type_code`='invoice'  AND `entity_model`='sales/order_invoice';
--
-- Startwert Sendungsnummern
UPDATE `eav_entity_store`,`eav_entity_type` SET `increment_last_id` = '50000',`increment_prefix`='' WHERE `eav_entity_store`.`entity_type_id`=`eav_entity_type`.`entity_type_id` AND `entity_type_code`='shipment' AND `entity_model`='sales/order_shipment';
--

Um das Script an die jeweiligen eigenen Gegebenheiten anzupassen muss die Wertezuweisung (zwischen dem SET und der WHERE Teil) geändert werden. Im Fall der Längendefinitionen heisst das Feld increment_pad_length und im Fall der Startwerte heisst es increment_last_id. Weiterhin kann man über das Feld increment_prefix jedem Nummernkreis noch ein statisches Prefix (darf auch eine beliebige Zeichenkette sein nicht nur Zahlen) hinzufügen

Hinweis:
Die beschreibenen Methoden wurden mit der Magento Version 1.3.2.4 getestet, sollte es bei zukünftigen Versionen Probleme damit geben, hinterlasst bitte einen kurzen Kommentar.


Links

http://www.perfect-knowhow.de/blog/archives/Magento-Kundenummer-und-Bestellnummer-aendern

http://legacy.blogtabs.de/2009/03/22/nummernkreislufe-in-magento-anpassen

Kommentar schreiben

7 Kommentare.

  1. Hallo Stefan, wenn ich die Beschreibung verwende, wird die Änderung beim Anlegen neuer Kunden nicht übernommen – es wird lediglich die Standard-ID übernommen bzw. von 1 angefangen …!

    Woran könnte es liegen? Ich benutze Magento 1.5.1

    Gruss
    Miguel

  2. Hallo,
    ich wollte nun gerade ihre Beschreibung anwenden, bekomme aber sobald ich den SQL-Befehl ausführe die Fehlermeldung:

    SQL-Befehl:

    — ** Längendefinitionen **

    — Länge Kundennummern
    UPDATE `eav_entity_type` SET `increment_pad_length` = ‚4‘ WHERE `entity_type_code` = ‚customer‘ AND `entity_model` = ‚customer/customer‘;

    MySQL meldet: ./url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.1%2Fen%2Ferror-messages-…
    #1046 – No database selected

    Ich habe manuell den Code etwas abgeändert, also die Nummern-Länge auf „4“ gestellt und die Startnummer auf „0000“. Aber ich denke, dass kann nichts damit zu tun haben, oder?

    Wie kann ich denn die Datenbak anwählen?

    Vielen Dank für Ihre Hilfe!

    • Hallo Matthias,
      das geht ganz einfach indem man das Commando ..

      USE ;

      vor den anderen SQL-Befehlen ausführt.
      Damit sollten dann hoffentlich die restlichen Befehle durchlaufen (sofern es da in der Zwischenzeit keine Änderungen an der Tabellenstruktur gab)

      Grüße Sefan

  3. Hat wunderbar in unserem Shop (Magento 1.5.0.1) geklappt.
    Außer der Zeile mit den Kundennummern. Hier wurde ein Fehler angezeigt, und ich denke, dass das daran liegt, dass in unserer Tabelle „eav_entity_store“ gar kein „increment_last_id“ für customer gesetzt wurde, warum auch immer.

    Das Ergebnis ist also: MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).

    Ist aber auch in unserem Fall nicht weiter schlimm.

    Besten Dank für die Erklärung,
    Tobi

  4. Argh.. ich bekomme jetzt diesen Fehler : /
    Warning: strpos() [function.strpos]: Empty delimiter in …/app/code/core/Mage/Eav/Model/Entity/Increment/Numeric.php on line 44

    • Hi Steven,
      ich hab im Netz den Hinweis gefunden, das das Feld „increment_prefix“ in der Tabelle „eav_entity_store“ bei einigen älteren Versionen von Magento nicht leer sein darf, sondern statt dessen eine ‚0‘ enthalten sollte.

      siehe auch unter …
      http://www.magentocommerce.com/boards/viewreply/132138/

      • Ah okay, danke! Komisch, da ich das auf einer 1.3.2.4-Instanz gemacht habe. Dass das Feld nicht leer sein darf habe ich dann auch gemerkt. heißt aber im Umkehrschluss aber auch, dass man die „0“ nicht als Prefix definieren könnte, wenn man denn wollte?!

Kommentar schreiben


Hinweis - Du kannst dies benutzenHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>