Fragensteller
[Lightswitch] Erzeugen einer neuen Rechnungsnummer

Frage
-
Hallo,
zum Hinzufügen und Ändern von Rechnungen habe ich in Lightswitch (2012) ein Formular erstellt, was sowohl für Neuanlgen als auch Editieren verwendet wird (Add & Edit).Wenn ich jetzt eine neue Rechnung erstelle, soll eine Rechnungsnummer in Form 2014-12345 erzeugt werden. Diese besteht aus dem Kalenderjahr (welches sich aus dem Rechnungsdatum ergibt) und einer fortlaufenden Nummer. Diese Rechnungsnummer ist in der Datenbank ein Pflichtfeld, es ist aber ein zusätzliches Id (PK) Feld vorhanden.
Die erste Idee, diese Rechnungsnummer gar nicht anzuzeigen, klappt natürlich nicht, weil das Neuanlegen eines Datensatzes ohne Rechnungsnummer nicht geht.
Also doch Code schreiben, aber wie?
Denn die erste Frage für mich ist, wie ich feststellen kann, dass es sich in der View um einen nuen Datensatz handelt? Schaue ich einfach, ob die Rechnungsnummer vergeben ist oder hat Lightswitch eine Property, die mir sagt, dass es sich um einen neuen Datensatz handelt?
Wenn ich das habe, greife ich dann wie auf die Datenbank zu, um mir den MAX-Wert der Rechnungsnummer anzeigen zu lassen, ihn in eine Zahl umzuwandeln, 1 hinzuzuzählen und dann zu speichern?
Oder sollte ich das ganze über einen Trigger realisieren - dann müsste ich wohl veranlassen, dass die Rechnungsnummer kein Pflichtfeld mehr ist.
Kann mir geholfen werden? ;-)
Vielen Dank vorab
Alle Antworten
-
Hi,
die lückenlose Vergabe von fortlaufenden Nummern in einem Nummernkreis ist keine triviale Aufgabe, insbesondere in einer Mehrnutzumgebung, in der zu erwarten ist, dass parallel Nummern zu vergeben sind. Außerdem kann es passieren, dass Nummern zurückgegeben werden, weil beispielsweise die Erfassung nach Nummernvergabe abgebrochen wurde.Wenn als Standardwert 0 genutzt wird, kann man erkennen, ob es sich um einen neuen Datensatz handelt. Da kann der Trigger auch entsprechend reagieren.
Die Idee mit dem Max-Wert verhindert nicht, dass bei paralleler Erfassung doppelt Nummern vergeben werden können. Damit über eine Fehlerbehandlung die doppelte Vergabe nachträglich erkannt werden kann, muss das Nummernfeld "unikat" sein. Bei Nummernkreisen (z.B. Jahresscheiben) ist diese Nummernkreiskennung in das unikate Feld einzubeziehen.
Ich löse solche Problem mit einer Zusatztabelle, in der freie Nummern für jeden Nummernkreis verwaltet werden. Da werden auch zurückgegebene Nummer eingetragen, die dann als erste "verbraucht" werden. Wenn die Liste fast leer ist, werden neue Nummern generiert (z.B. auf Basis des letzten Maximalwertes).
--
Peter -
Hallo Peter,
vielen Dank, aber mir ging es nicht um das "ob", sondern um das "wie". Die aufgezählten Gefahren sind uns bewusst, aber relativ unwahrscheinlich, weil die Rechnungserstellung prinzipiell nur von einer Person gemacht wird.
Die Idee mit der Zusatztabelle ist auch nicht schlecht - muss ich mir mal durch den Kopf gehen lassen, ob sich das in meinem Fall lohnt.
Gruß
konfida
-
Hallo,
bei meiner Umsetzung habe ich jetzt folgendes gemacht:
In der Klasse Rechnung, Rechnung_Created(), wird die Rechnungsnummer (string) mit "Wird generiert..." vorbelegt und dem User schreibgeschützt angezeigt.
In der Methode RechnungAddEdit_Saving(ref bool handled) prüfe ich, ob die Rechnungsnummer genau diesen Wert hat.
Jetzt würde ich gern in die Datenbank gehen um den MaxWert der Rechnungsnummer zu bestimmen:
Leider habe ich keine Ahnung, wie ich (aus der View) an die Datenbank heran komme, also der Datenbank-Context hergestellt wird.
Kann mir jemand Beispielcode oder einen Link dafür zeigen?
Vielen Dank
Konfida