Mr K: leidiges Thema - fortlaufende Nummer

Hi Leute,

ich habe folgendes Problem:

Ich schreibe gerade ein Rechnungsformular. Dazu wird eine PHP-Datei durch eine HTML-Datei mit Daten gefüttert. Hierzu möchte ich, um die Rechnungsnummer anzugeben, eine fortlaufende Nummer verwenden (die Rechnungsnummer soll schließlich eindeutig sein). Die Daten werden durch einen Submit-Button übertragen.
Ist es (und wenn ja, wie) möglich einen Zähler zu generieren, der die Anzahl der Klicks auf den Button zählt und dann in die PHP-Datei überträgt? (wenn nötig auch mit einer Text-Datei, aber ohne Datenbank)

Ich habe schon etliche Foren durchgeschaut und nichts vergleichbares gefunden.

Vielen Dank schonmal im vorraus,

Gruß Mr K

  1. Ist es (und wenn ja, wie) möglich einen Zähler zu generieren, der die Anzahl der Klicks auf den Button zählt und dann in die PHP-Datei überträgt? (wenn nötig auch mit einer Text-Datei, aber ohne Datenbank)

    Klar ist das möglich. Du schreibst die jeweils letzte Nummer da rein und kannst dir dann die nächste berechnen.
    Ganz wichtig: Du musst das nur synchronisieren, damit zwischen lesen und schreiben kein anderer Prozess dazwischen funkt.

    1. Klar ist das möglich. Du schreibst die jeweils letzte Nummer da rein und kannst dir dann die nächste berechnen.

      Ich wollte, dass die Gernerierung der Nummer eben automatisch geschieht, indem der Zähler die Klicks zählt und dann irgendwo speichert und dann in die PHP-Datei schreibt. Geht das am besten mit PHP oder JavaScript?

      Ganz wichtig: Du musst das nur synchronisieren, damit zwischen lesen und schreiben kein anderer Prozess dazwischen funkt.

      Blöde Frage, aber wie kann ich das synchronisieren?

      1. Klar ist das möglich. Du schreibst die jeweils letzte Nummer da rein und kannst dir dann die nächste berechnen.

        Ich wollte, dass die Gernerierung der Nummer eben automatisch geschieht, indem der Zähler die Klicks zählt und dann irgendwo speichert und dann in die PHP-Datei schreibt. Geht das am besten mit PHP oder JavaScript?

        Javascript ist nur beim clienten, das wird dir nichts bringen. Es muss serverseitig laufen also php.

        Ganz wichtig: Du musst das nur synchronisieren, damit zwischen lesen und schreiben kein anderer Prozess dazwischen funkt.

        Blöde Frage, aber wie kann ich das synchronisieren?

        in dem fall z.b. eine "Lock"-Datei verwenden, die den zugriff sperrt. Bei einzelplatznutzung (sonnst wäre eine DB vermutlich da), ist das aber zu vernachlässigen, da nur immer einer drauf zu greift.

        Alternativ zur extra Datei könntest du auch die bisher erstellten Rechnungen durchsuchen nach der größten Nummer und dann diese + 1 verwenden. Geht natürlich nur gut, wenn du die RE-Nr. auch im Dateinamen hast und das ganze abspeicherst. (z.b. als PDF)

        1. in dem fall z.b. eine "Lock"-Datei verwenden, die den zugriff sperrt. Bei einzelplatznutzung (sonnst wäre eine DB vermutlich da), ist das aber zu vernachlässigen, da nur immer einer drauf zu greift.

          Okay, Lock-Datei klingt logisch.

          Alternativ zur extra Datei könntest du auch die bisher erstellten Rechnungen durchsuchen nach der größten Nummer und dann diese + 1 verwenden. Geht natürlich nur gut, wenn du die RE-Nr. auch im Dateinamen hast und das ganze abspeicherst. (z.b. als PDF)

          Die Nummer im Dateiname z.B.: Rechnung1.pdf ?

          Dann könnte ich doch bestimmt auch die zuletzt erstellte Datei nehmen, geht das?

          1. Such doch mal ein bisschen, ob es nicht noch was anderes gibt als voll MySql zu installieren.
            Jetzt machst du dir selber irgendwas mit IDs generieren. Nächste Woche soll dann doch noch was anderes dazu wie du Daten speicherst. Übernächste dann nochmal was neues...
            Ich würde da nicht so anfangen zu frickeln.

  2. Tach!

    Ich schreibe gerade ein Rechnungsformular. Dazu wird eine PHP-Datei durch eine HTML-Datei mit Daten gefüttert. Hierzu möchte ich, um die Rechnungsnummer anzugeben, eine fortlaufende Nummer verwenden (die Rechnungsnummer soll schließlich eindeutig sein). Die Daten werden durch einen Submit-Button übertragen.

    Und in welcher Datenhaltung speicherst du die Rechnungsdaten inklusive der Rechnungsnummer ab?

    Ist es (und wenn ja, wie) möglich einen Zähler zu generieren, der die Anzahl der Klicks auf den Button zählt und dann in die PHP-Datei überträgt?

    Was willst du mit der Anzahl der Klicks? Wenn ich dreimal draufklicke und erst beim vierten Mal deine Validitätsprüfung die Rechnung als einwandfrei weiterverarbeitet ist deine fortlaufende Nummerierung anhand der Klicks unbrauchbar.

    (wenn nötig auch mit einer Text-Datei, aber ohne Datenbank)

    Irgendeine Form der Datenhaltung benötigst du. Aus der ermittelst du den nächsten Wert, wenn die neuen Rechnungsdaten die Validitätsprüfung überstanden haben und sich anschicken, gespeichert zu werden. Eine Textdatei ist dabei zwar möglich (vielleicht im CSV-Format), aber du kannst auch SQLite nehmen, was eine kleine, nur eine simple Datei verwendende Datenbank ist. Für die Textdatei musst du dir jede einzelne Form der Datenbearbeitung selbst schreiben und dabei ständig die Datei als Ganzes und im Zusammenhang mit Mehrbenutzerzugriff inklusive der dabei entstehenden Zugriffskonflikte berücksichtigen. Mit SQLite hast du diesbezüglich eine Menge Probleme weniger und schon einige Funktionalität (wie zum Beispiel Suchen nach bestimmten Kriterien) bereits eingebaut.

    dedlfix.

    1. Und in welcher Datenhaltung speicherst du die Rechnungsdaten inklusive der Rechnungsnummer ab?

      Die Daten werden in die Rechnung geschrieben und dann wir ein pdf daraus erzeugt.

      Was willst du mit der Anzahl der Klicks? Wenn ich dreimal draufklicke und erst beim vierten Mal deine Validitätsprüfung die Rechnung als einwandfrei weiterverarbeitet ist deine fortlaufende Nummerierung anhand der Klicks unbrauchbar.

      Das ist wohl richtig, aber da ich die Rechnung verwende, dürfte das kein Problem sein. Ansonsten kann ich bei einem Klick zu viel auch mal die Nummer ändern wenns sein muss.

      Irgendeine Form der Datenhaltung benötigst du. Aus der ermittelst du den nächsten Wert, wenn die neuen Rechnungsdaten die Validitätsprüfung überstanden haben und sich anschicken, gespeichert zu werden. Eine Textdatei ist dabei zwar möglich (vielleicht im CSV-Format), aber du kannst auch SQLite nehmen, was eine kleine, nur eine simple Datei verwendende Datenbank ist. Für die Textdatei musst du dir jede einzelne Form der Datenbearbeitung selbst schreiben und dabei ständig die Datei als Ganzes und im Zusammenhang mit Mehrbenutzerzugriff inklusive der dabei entstehenden Zugriffskonflikte berücksichtigen. Mit SQLite hast du diesbezüglich eine Menge Probleme weniger und schon einige Funktionalität (wie zum Beispiel Suchen nach bestimmten Kriterien) bereits eingebaut.

      Gut, wenn ich denn eine DB verwende, dann habe ich die Kundendaten auch gleich zur Hand. Daraus könnte ich dann die Kundennummer verwenden, okay. Ich werde mir mal SQLite ansehen, danke.

      1. Tach!

        Und in welcher Datenhaltung speicherst du die Rechnungsdaten inklusive der Rechnungsnummer ab?
        Die Daten werden in die Rechnung geschrieben und dann wir ein pdf daraus erzeugt.

        Das ist keine Datenhaltung, das ist nur Datenverarbeitung mit anschließendem Verwurf. Es bleibt nur das PDF erhalten und das ist keine brauchbare Datenquelle für weitere Prozesse. "Datenhaltung" ist ein Notieren der Daten im Rohformat zum späteren Wiederverwenden.

        Was willst du mit der Anzahl der Klicks? Wenn ich dreimal draufklicke und erst beim vierten Mal deine Validitätsprüfung die Rechnung als einwandfrei weiterverarbeitet ist deine fortlaufende Nummerierung anhand der Klicks unbrauchbar.
        Das ist wohl richtig, aber da ich die Rechnung verwende, dürfte das kein Problem sein. Ansonsten kann ich bei einem Klick zu viel auch mal die Nummer ändern wenns sein muss.

        Wenn du sowieso aufpassen willst/musst, kannst du auch gleich selbst die Nummer aus dem letzten erzeugten PDF (oder einem Ausdruck) nehmen und eine neue zu Fuß generieren.

        Gut, wenn ich denn eine DB verwende, dann habe ich die Kundendaten auch gleich zur Hand. Daraus könnte ich dann die Kundennummer verwenden, okay. Ich werde mir mal SQLite ansehen, danke.

        Beachte, dass, wenn du es richtig machen willst, das Prinzip SELECT MAX(Rechnungsnummer)->Increment->INSERT auch bei einer DB nicht mehrbenutzersicher ist. Während User 2 gerade dabei ist, zu Inkrementieren und aus den restlichen Daten das INSERT-Statement zu erzeugen, kann User 1 damit bereits fertig sein und sein INSERT ausführen. Anschließend führt User 2 sein INSERT aus und du hast du zweimal dieselbe Nummer in der Tabelle stehen. Der Zufall wird vielleicht bei dir nie solch eine Situation ergeben, aber wenn doch, so wirst vermutlich du es nicht bemerken sondern erst der Steuerprüfer. Die einfachste Schutzmaßnahme gegen einen solchen Fall wäre ein Unique-Index auf dem Rechnungsnummernfeld. Dann misslingt das INSERT von User 2 und du kannst den Vorgang wiederholen oder vom Anwender wiederholen lassen.

        dedlfix.

        1. Hey,

          danke dedlfix, das hat mir schon sehr gut weitergeholfen. Wobei die DB höchstwahrscheinlich nur von einem User verwendet werden wird, aber ich kann das ja schonmal als Sicherheit mit einbauen.

          Nochmals Danke

          Mr K

  3. Moin!

    Ich schreibe gerade ein Rechnungsformular. Dazu wird eine PHP-Datei durch eine HTML-Datei mit Daten gefüttert. Hierzu möchte ich, um die Rechnungsnummer anzugeben, eine fortlaufende Nummer verwenden (die Rechnungsnummer soll schließlich eindeutig sein).

    Die Regeln zur Bildung einer Rechnungsnummer fordern nicht, dass die Nummern fortlaufend sind, nur eindeutig. Du kannst einer Rechnungsnummer auch typische Ordnungskriterien des Rechnungsvorgangs hinzufügen, beispielsweise das aktuelle Datum, Uhrzeit der Rechnungserstellung, die Kundennummer etc.

    Nimmt man beispielsweise Das Datum bis hinunter zur Sekunde, ergibt sich zu jedem definierten Zeitpunkt eine exakte Rechnungsnummer, sofern man garantiert, dass in derselben Sekunde nur genau EINE Rechnung erzeugt wird. Bei deinem manuellen Button-Szenario wäre das ja vermutlich so.

    Man kann auch das Datum in Form von Jahr und Monat plus Kundennummer nehmen, wenn man weiß, dass jeder Kunde pro Monat maximal EINE Rechnung bekommt.

    Weitere Methoden zur Ermittlung der Rechnungsnummer aufgrund von vollkommen bekannten Daten sind denkbar. Irgendeine Art von Zähler benötigt man erst dann, wenn man tatsächlich unabsehbar viele Rechnungen erzeugt, die keinem einfacheren Schema gehorchen, beispielsweise wenn in einem Online-Shop ein Kunde beliebig häufig pro Monat oder Tag bestellen kann und das jeweils individuelle Rechnungen erzeugt.

    Auf der anderen Seite hat man bei solchen größeren Rechnungsmengen in der Regel ein automatisiertes System der Zahlungserfassung, mithin also irgendeine Datenbank, und deshalb auch direkt einen Zähler für die Rechnungsnummer mit dabei.

    - Sven Rautenberg

    1. Nimmt man beispielsweise Das Datum bis hinunter zur Sekunde, ergibt sich zu jedem definierten Zeitpunkt eine exakte Rechnungsnummer, sofern man garantiert, dass in derselben Sekunde nur genau EINE Rechnung erzeugt wird. Bei deinem manuellen Button-Szenario wäre das ja vermutlich so.

      Das würde auf jeden Fall gehen, wobei ich aber gerne die Rechnungsnummer von 1-xxxx haben möchte und bei der Rechnung mit der Zeit normalerweise andere Zahlen rauskommen.

    2. Die Regeln zur Bildung einer Rechnungsnummer fordern nicht, dass die Nummern fortlaufend sind, nur eindeutig. Du kannst einer Rechnungsnummer auch typische Ordnungskriterien des Rechnungsvorgangs hinzufügen, beispielsweise das aktuelle Datum, Uhrzeit der Rechnungserstellung, die Kundennummer etc.

      Bist du dir da sicher? Mein Wissensstand ist, dass die sehr wohl fortlaufend sein müssen, damit nachvollziehbar ist, wieviele Rechnungen ausgestellt wurden.

      Eine nicht fortlaufende Nummer wäre natürlich einfacher zu handeln,wenn sie denn wirklich zulässig ist.

      1. Hello,

        Die Regeln zur Bildung einer Rechnungsnummer fordern nicht, dass die Nummern fortlaufend sind, nur eindeutig. Du kannst einer Rechnungsnummer auch typische Ordnungskriterien des Rechnungsvorgangs hinzufügen, beispielsweise das aktuelle Datum, Uhrzeit der Rechnungserstellung, die Kundennummer etc.

        Bist du dir da sicher? Mein Wissensstand ist, dass die sehr wohl fortlaufend sein müssen, damit nachvollziehbar ist, wieviele Rechnungen ausgestellt wurden.

        Bitteschön: http://www.akademie.de/wissen/fortlaufende-rechnungsnummer

        Um eine fortlaufende Nummer zu erzeugen, muss man dann entweder pessimistisch arbeiten (dann geht die Nummer ggf. verloren, wenn man es sich anders überlegt und doch keine Rechnung schreibt) oder optimistisch, dann steht sie aber erst nach dem Speichern der Rechnung zur Verfügung. Hier reicht meistens ein autoincrement-Wert als ID.

        Da die rechnung ja ohnehin erst zum Abschicken gedruckt werden kann, wenn sie fertig ist, würde ich die zweite Lösung bevorzugen. Eine fertige Rechnung darf nicht mehr manipuliert werden können :-O

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://restaurant-zur-kleinen-kapelle.de
        1. Bitteschön: http://www.akademie.de/wissen/fortlaufende-rechnungsnummer

          Danke, das ist gut zu wissen. Ich weiss schon, wieso ich meinen Steuerberater zum Ex gemacht hab ....

          Eine fertige Rechnung darf nicht mehr manipuliert werden können :-O

          Tja, der Wunschtraum der Bürokraten, der nicht umsetzbar ist. Selbst eine gedruckte Rechnung kann manipuliert werden ;)