Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb (https://www.delphipraxis.net/164731-vorgehensweise-fuer-rechnungsnummernvergabe-im-multi-user-betrieb.html)

RWarnecke 27. Nov 2011 17:56

Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Hallo zusammen,

ich muss in einem Programm Rechnungsnummern mit fortlaufender Nummer vergeben ohne eine Lücke zu produzieren. Die Vergabe muss auch noch dann funktionieren, wenn mehrere Leute eine Rechnung erstellen. Ich habe dazu zwei Tabellen für die Rechnung. Die erste Tabelle enthält alle Daten zum Kunden und natürlich die Rechnungsnummer und die zweite Tabelle enthält alle Rechnungspositionen, mit Referenz auf die Rechnungsnummer. Ich hatte mir dazu zwei Möglichkeiten überlegt.
  1. Die Rechnungsnummer wird beim Aufruf des Rechnungsformular vergeben.
  2. Die Rechnungsnummer wird erst vergeben, wenn die Rechnung gespeichert wird.
Bei der ersten Möglichkeit sehe ich das Problem, wenn mehrere Leute das Rechnungsformular geöffnet haben und einer die Eingabe abbricht oder sonst irgendwas passiert, eine Lücke entstehen kann. Bei der zweiten Möglichkeit weiß ich nicht, wie ich das mit dem Speichern übernehmen sollte.

Wie würdet Ihr die Aufgabe lösen ? Eine meiner Möglichkeiten verwenden, wenn ja welche und warum ? Oder gibt es noch einen ganz anderen Ansatz ?

P.S. : Wenn es umbedingt nötig ist, kann das Design der beiden Tabellen geändert werden.

MGC 27. Nov 2011 18:09

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Hallo,

Du hast doch mit Sicherheit eine Tabele, in der ggf. nur die vergebenen Rechnungsnummern stehen. Wenn Du beim Speichern die Tabelle kurzzeitig sperrst, den gröten bereits gespeicherten Wert ausliest, deine demnach nächst höhere Nummer spiecherst und dann die Tabelle für den nächsten freigibst sollte nichts mehr passieren können.

Also im Prinzip Dein 2. Ansatz. Schwierig wird es jedoch, wenn Du mit verschiedenen Severn zu tun hast und diese erst synchronisiert werden. Dort könnte es dann zu Problenmen, bzw. bemerkbaren teitlichen Verzögerungen kommen.

Auf welche Weise ist das DB-System aufgebaut, bzw. wie werden die Zugriffe geregelt udn welche Technologie setzt Du beim Zugriff auf die DB ein?

Viele Grüße,

Neumann 27. Nov 2011 18:27

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Hallo,

ich mache es so:

Es gibt eine Tabelle mit Rechnungsnummern, nur eine Spalte. Wenn eine Nummer gebraucht wird, holt sich der Client die kleinste Nummer aus der Tabelle und löscht sie.

Wenn die Tabelle nahezu leer ist, wird sie wieder aufgefüllt.

Bricht jemand eine Rechnung ab oder es geht sonst etwas schief, wird die Nummer wieder in die Tabelle zurückgeschrieben.

Die Zeit von Nummer holen bis "verbrauchen" halte ich sehr kurz, die Nummer wird erst geholt wenn die Rechnung ausgegeben wird, nicht schon wenn die Positionen bearbeitet werden.

Ist die Rechnung gedruckt und gegebenenfalls bestätigt ist die Nummer entgültig verbraucht. Dann kann man nur noch eine Stornorechnung machen.

Furtbichler 27. Nov 2011 18:30

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Wie werden die Rechnungen erstellt?

Ich mache das so: Es wird zunächst eine offene Rechnung erstellt. Erst wenn diese vollständig (und in der DB vollständig gespeichert) ist, wird per Stored Procedure eine eindeutige und lückenlos steigende Rechnungsnummer erstellt.

haentschman 27. Nov 2011 18:32

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Hallo...

welches DBMS ist im Einsatz ? Persönlich würde ich folgenden Ablauf bevorzugen:
1. RE speichern
2. DBMS vergibt eine Nummer über einen Generator (Firebird)... ist damit eindeutig und fortlaufend
3. Die Query enthält als Rückgabewert die Nummer
4. Mit dieser Nummer können dann die Positionen gespeichert werden (Zuordnung)

Bummi 27. Nov 2011 18:37

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
@haentschman
so kenn ich es auch, unter Berücksichtigung der Vorgaben finde ich die Implementierung von Neumann am interessantesten.

RWarnecke 27. Nov 2011 18:37

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Zitat:

Zitat von MGC (Beitrag 1138105)
Auf welche Weise ist das DB-System aufgebaut, bzw. wie werden die Zugriffe geregelt udn welche Technologie setzt Du beim Zugriff auf die DB ein?

Es soll lediglich nur einen Firebird-Server geben, wo alle drauf zugreifen. Als Datenbankkomponente setze ich UniDAC ein. Die Daten werden aus der Datenbank geholt und in einer TObjectList gespeichert und dort vom Programm auch bearbeitet. Erst wenn es Änderungen in der TObjectList gibt, werden die Daten zurückgeschrieben in die Datenbank.

Zitat:

Zitat von Furtbichler (Beitrag 1138109)
Wie werden die Rechnungen erstellt?

Ich habe ein Formular erstellt, wo ich die Kundendaten eintragen kann und die Rechnungspositionen. Danach ist alles offen, wie die Daten verarbeitet werden. Bevor ich die Rechnung ausdrucke oder abschliesse, möchte ich natürlich noch eine Vorschau haben.

Furtbichler 27. Nov 2011 19:01

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Zitat:

Zitat von haentschman (Beitrag 1138110)
...
2. DBMS vergibt eine Nummer über einen Generator (Firebird)... ist damit eindeutig und fortlaufend
...

Man muss aufpassen, das es beim Speichern kein Rollback geben kann, das ist Alles.

haentschman 27. Nov 2011 19:48

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Klar, in diesem Ausnahmefall (bei fehlerhaftem Eintragen in die DB) wäre dann die Nummer verbraucht. Mit diesem Sonderfall hätten wahrscheinlich alle Lösungen ein Problem und sollte seperat behandelt werden.

TBx 27. Nov 2011 20:02

AW: Vorgehensweise für Rechnungsnummernvergabe im Multi-User Betrieb
 
Zitat:

Zitat von haentschman (Beitrag 1138128)
Klar, in diesem Ausnahmefall (bei fehlerhaftem Eintragen in die DB) wäre dann die Nummer verbraucht. Mit diesem Sonderfall hätten wahrscheinlich alle Lösungen ein Problem und sollte seperat behandelt werden.

Und genau dafür kann man die vorgeschlagene Möglichkeit mit der Rechnungsnummerntabelle verwenden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz