Hi ene
im Nachhinein finde ich es für Außenstehende etwas wirr, was ich geschrieben habe, aber so wirr ist es gar nicht.
Also vom kaufmännischen Ablauf her, ich habe eine Rechnung und die soll storniert werden.
Datentechnisch und auch papiertechnisch bedeutet das, daß ein neuer Beleg erstellt wird, nämlich der Storno-Beleg.
Bei einem Vollstorno wird ein identischer Datensatz erstellt, nur daß der halt Soll-Haben-technisch auf der anderen Seite gebucht wird und textmäßig etwas anders aussieht.
In meinem Fall kommt noch das Elend mit den zig Nummernkreisen dazu, aber das ist ne andere Geschichte.
Also ich habe beleg_liste (master-detail query in Bezug auf den Kunden) , aus der ich die Rechnung bzw. den Beleg auswähle, den es zu stornieren gilt.
Wenn der User im Formular den Storno-Button klickt, wird in der Tabelle belege ein neuer Datensatz eingefügt und mit den Werten des Datensatzes aus beleg_liste befüllt.
Der neue Datensatz bekommt außerdem die Belegnummer von dem alten Datensatz als Referenznummer mit.
Vice Versa muß nun dasselbe geschehen, d.h. der neue Datensatz muß dem alten Datensatz mitteilen, welche Nummer er bekommen hat, bei Erstellung weiß er das aber noch nicht, das geschieht erst bei Abschluß des Beleges, wenn er gedruckt wird.
belege ist ein seperates query, welches nur dem Form Beleg gehört.
Etwas Wesentliches habe ich gestern noch vergessen zu erwähnen und das ist, bei der Belegnummernvergabe wird eine Transaktion auf die Tabelle Nummernkreis mit SELECT FOR UPDATE eingeleitet und da es sich ja um MySQL handelt ist die Engine InnoDB
Innerhalb der Transaktion wird dann dem alten Beleg mitgeteilt, zu welchem Storno-Beleg er gehört, außerdem werden ein paar Status- Datumsfelder gesetzt und das Feld Offener Posten geändert, sowohl im Beleg, als auch im Storno-Beleg.
Wie gesagt, das alles funktioniert prächtig, solange der User nichts anderes macht, als den Storno-Button zu drücken und anschließend die Quasi-Kopie, also den Storno-Beleg unverändert zu bestätigen.
Er kann auch in dem neuen Beleg Veränderungen vornehmen, die auch gespeichert werden
ABER wenn er dann, also nach Änderung durch Drucken die Nummernvergabe anstößt, heißt auch die Transaktion einleitet, bekommt der Storno-Beleg ne neue Nummer und wenn dann in den alten Datensatz zurückgeschrieben werden soll, knallts.
Irgendwie muß das mit der Transaktion zu tun haben, die nach dem Fehlerfall auch macht, was sie soll, nämlich alles rückgängig...Aber was ich absolut nicht versteh, warum ich in einem Fall auf den Ur-Beleg zugreifen kann und in dem anderen Fall, wenn also im Storno-Beleg was geändert wurde, nicht, mit denselben Lese- und Speicherroutinen.
Deswegen nutzt SQL hier wenig...irgendwie verbiegt sich bei MyDac da was intern.
Na ja, hab ja kaum Hoffnung, daß mir da Jemand weiterhelfen kann, war jedenfalls schön, mal drüber geredet zu haben
