Eure Meinung zu Artikel- und Rechnungstabelle, wie würdet..?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Eure Meinung zu Artikel- und Rechnungstabelle, wie würdet..?

Beitrag von Soner »

Hallo Leute,
ich habe hier eine Datenbank mit 2 Tabellen, eigentlich mehrere aber hier brauchen wir nur 2.
Eine Artikeltabelle mit den Spalten:
-Artikelnr
-Artikelname

Und eine Rechnungstabelle(eigentlich Rechnungsartikel) mit den Spalten:
-Artikelnr

Die beiden sind über Artikelnr miteinander Verknüpft. Beim Rechnungdruck werden verkaufte Artikelnamen aus der Artikeltabelle geholt.
Viele von euch kennen das bestimmt schon. Eine Artikel, nennen wir es X, wurde schon öfters verkauft und taucht in der Artikeltabelle auf, bisher normal.
Aber jetzt möchte der Kunde den Namen umändern, Artikel bleibt aber gleich z.B. er will von "Playstation4" zu "Sony Playstation4" umbenenen.
Wenn er das macht verfälscht er die alten schon versendeten Rechnungen und das darf er nicht.
Ich habe es so gelöst, in dem ich von diesem Artikel eine Kopie in der Artikeltabelle gemacht habe und diese Kopie als ausgelaufenen Artikel markiert und überall in alten Rechnungen die Artikelnr anpasst habe so die Rechnungen genauso aussehen wie sie versendet sind.

Was haltet ihr davon, wie würdet ihr es machen, gibt es vielleicht einen besseren Weg?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von m.fuchs »

Wenn ich dich richtig verstehe, erzeugst du eine bestehende Rechnung immer wieder neu aus der Datenbank. Warum legst du die einmal erzeugte Rechnung nicht einfach ab und zeigst sie dem Kunden immer wieder an? Dann hast du gar kein Problem mit veränderten Daten.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Soner »

Nein die Rechnung ist einmal erstellt und die Rechnungsdaten sind schon in den Tabellen gespeichert, nur der Artikelname wird bei der Anzeige aus der Artikeltabelle gelesen. Das macht man so damit Datenredundanz vermieden wird. Also wenn ein Artikel Hunderttausendmal verkauft wird dann wird Artikelname in der Rechnung nicht Hunderttausendmal gespeichert, sondern nur Artikelnr wird speichert und der Name wird aus der Artikeltabelle gelesen.
Man will die Rechnung immer so haben wie es dem Kunden versendet wurde, also als Rechnungsausdruck auf DINA4-Papier oder als Email.
Das gelingt bis der Benutzer anfängt den Artikelnamen zu ändern, siehe 1. Beitrag.

Im Nachhinhein denke ich dass meine Lösung auch nicht gut ist, weil dadurch in der Artikeltabelle die Artikelnr mehrfach vorhanden sein kann.

Edit:
Falls es unverständlich ist, der Benutzer will nicht in der Rechungstabelle editieren, sondern in der Artikeltabelle den Namen des Artikel für zukünftige Verkaufe besser umschreiben. z.B. von "Playstation4" zu "Sony Playstation IV".
Das betrifft indirekt zu Rechnungstabelle weil die Namen der verkauften Artikel ja von der Artikeltabelle geholt wird.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von m.fuchs »

Nee nee, ich habe dich wohl schon richtig verstanden. Zwar speicherst du die Daten zu einer Rechnung (also die Positionen) ab, aber das eigentliche Dokument (HTML oder generiertes PDF) wird on-the-fly erzeugt. Deswegen hast du ja das Problem. Ist das überhaupt rechtlich einwandfrei?
Mein Vorschlag ist daher: speichere das generierte HTML/PDF/wasauchimmer an einen sicheren Ort und lade es wenn der Benutzer sich eine Rechnung anzeigen will.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Michl »

Ich handhabe das hier so, wie m.fuchs schrieb. Allerdings habe ich nur mehrere hundert Rechnungen (exportiert als PDF) zu archivieren, da spielt die Größe der Rechnung eher eine untergeordnete Rolle.

Zum Problem:

Du könntest neben Artikelnummer, Artikelname auch noch einen Timestamp speichern, wann der Artikel eingefügt wurde. Eine Veränderung eines Artikelnamens darf nicht mehr zugelassen werden (oder nur wenn noch keine Rechnung mit diesem geschrieben wurde). Somit sind in der Tabelle mehrere Einträge unter der gleichen Artikelnummer möglich.

Jetzt kannst du bei der Erstellung einer Rechnung den Artikelnamen mit dem jüngsten Datum abrufen.
Bei der Ansicht einer archivierten Rechnung, kannst du das Rechnungsdatum nehmen und den Artikelnamen des damals jüngsten Datums anfordern.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von VB_Lazarus »

Hallo Soner,

ich habe auch ein Rechnungsprogramm in VB6 geschrieben und portiere es gerade nach Lazarus.
Nach meiner Meinung hast du doch eine eindeutige Verknüpfung zu den Artikel durch die Artikelnummer.
Ich würde (da ja nach Meinungen gefragt wurde) die Artikelbezeichnung direkt in die Rechnung schreiben und nur die Nummer als Verbindung existieren.
Die Rechnung ist nach dem Speichern und gegebenenfalls Ausdrucken eigentlich immer schreibgeschützt.
Es darf sich eigentlich nichts mehr ändern, da der Kunde die Rechnung hat und du das genaue Abbild.
Wenn du immer den Text aus dem Artikel holst, hast du unweigerlich immer eine Änderung.

Gruß

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von MacWomble »

Dem stimme ich voll zu.

In den meisten DB-Tutorials wird dies falsch vermittelt.

Eine Rechnungstabelle wird grundsätzlich nicht normalisiert. Dies betrifft vor allem die Bezeichnungen, Beschreibungen, Preise und Steuersätze (also die Positionen)!

Stichwort Veränderbarkeit bzw. Unveränderbarkeit
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Socke »

MacWomble hat geschrieben:Eine Rechnungstabelle wird grundsätzlich nicht normalisiert. Dies betrifft vor allem die Bezeichnungen, Beschreibungen, Preise und Steuersätze (also die Positionen)!

Man könnte in der Artikeltabelle auch noch ein Zeitstempel zum Primärschlüssel hinzufügen. Damit ist auch bei Änderungen am Artikelstamm die eindeutige zeitliche Zuordnung gegeben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eb
Lazarusforum e. V.
Beiträge: 238
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Eb »

Du könntest auch ein Feld 'variante' in beiden Tabellen hinzufügen. Beim Ändern des Artikels wird dieses hochgezählt. Artikelnummer und Variante zusammen wären dann eindeutig.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von MacWomble »

Socke hat geschrieben:Man könnte in der Artikeltabelle auch noch ein Zeitstempel zum Primärschlüssel hinzufügen. Damit ist auch bei Änderungen am Artikelstamm die eindeutige zeitliche Zuordnung gegeben.


Unter der Voraussetzung, dass Artikel nur gelöscht werden dürfen, wenn sie nie in einer Rechnung verwendet wurden!
In der Praxis kann dies auch ansonsten Probleme ergeben, insbesondere bei Abschlagsrechnungen oder Projektabrechnungen über längere Zeiträume.

Wohin das führt wenn zu exzessiv oder falsch normalisiert wird erlebe ich regelmäßig bei meinen Kunden, die L*xware-Programme einsetzen.
Ständig kommt es dort zu falschen Ausgaben und Berechnungen - obwohl dort mit Zeitstempeln gearbeitet wird.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Soner »

Erstmal danke für die Antworten.

Zum Artikelnamenkopieren (also bei jede Rechnung kopieren):
Das ist einfach und anfallende Datenmenge ist auch nicht zu groß bei 150 Rechnungen mit 20 Produkten pro Rechnung/Tag wären das im Jahr ca. 43 MB/Jahr. Aber im Laufe der Jahre und wenn es mehr verkauft wird kommt da was zusammen. Naja Festplatten sind billig, aber große Datenmengen zu verwalten ist in effizient und Adressen sind noch nicht mitberechnet. Bei diese Methode müssen die ja auch bei jede Rechnung kopiert werden.
Das ist wie "Exceltabellen auf DB-Tabellen umgewandelt" methode. Es ist einfach gut aber mit der Zeit und größe der Geschäfts kriegt man "Probleme" mit Datenmenge.

Zum Vorschlag "Als PDF ablegen":
Ja, das hab ich auch zusätzlich vor, aber die Daten der Rechnung (Artikel mit verkaufte MEnge, Preis) sollen auch in DB erhalten bleiben, z.b. zu Analyse der Verkäufe. Man kann mit diese Methode Artikelnamen jederzeit ändern weil man originale Rechnung hat, aber schön sieht es nicht, glaub ich. So habe ich es auch bisher gemacht. Ich habe gedacht, dass es für Analysezwecke kleine Namensänderungen unwichtig sei bis jemand diese Rechnungen neu gedruckt und verschickt hat.
Vielleicht muss ich Nachdruck verbieten oder auf die Originale hinweisen.

Zum Vorschlag Zeitstempel:
Das ist wie meine Lösung bei der Änderung Kopie zu machen.

Ich glaube, ich mach das mit Kopieren, also bevor Artikel geändert wird kopieren, die Kopie als neue "Alte" benutzen und das Alte als Auslaufartikel stempeln, sodas es nicht in der Artikeltabelle auftaucht und zum Verkauf angeboten wird, sondern nur bei Rechnungsdarstellung benutzt wird.
Da jetzt in der Artikeltabelle Artikelnr mehrfach existieren können, kann ich vielleicht auch Artikelvariationen nutzen/vereinfachen.
Vorher musste man dafür eine externe Tabelle zum verknüpfen benutzen.

SchwabenTom
Beiträge: 49
Registriert: So 4. Jan 2015, 21:34
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von SchwabenTom »

Das Modell bildet die Realität ab. Da wo die Realität so komplex ist, daß das Modell nicht alles abbilden kann, werden Kompromisse eingegangen. D.h. bspw. daß man eine gewisse Ungenauigkeit in Kauf nimmt, um nicht handhabbare Dinge/Objekte/Beziehungen/Eigenschaften/etc. weglassen zu können. Bspw. brauchst du nicht Pi vollständig zu kennen, um die Fläche eines Kreises zu berechnen. Du lebst damit, daß bei der soundsovielten Nachkommastelle dann halt ein kleiner Fehler sein könnte. Oder man nimmt ganze Bereiche heraus und gibt zu, daß das dann halt nicht geht. Ein Auto kann das Modell für die Realität Transportmittel sein - zum Mond fliegen kannst du damit trotzdem nicht: also heißt die neue Realität: Transportmittel ja, aber nur für die Straße.

Deine Realität heißt: Rechnungen sind nicht veränderbar, Artikelnamen können sich ändern.

In deinem konkreten Modellierungsfall hast du die Normalisierung so angewendet, daß sich ergibt:
a) Artikelnamen können sich ändern => das ist ok, Modell = Realität
b) Rechnungen ändern sich bei geänderten Artikelnamen => das ist nicht ok, da Modell != Realität

Normalisierung heißt nicht, Datenreduktion bis es nichts mehr zu reduzieren gibt. Normalisierung heißt, das Modell mit so wenig Daten wie möglich auskommen zu lassen, ohne es dabei zu verändern. Alle Stadien im Prozess der Normalisierung sind was die "Außenwirkung" des Modells angeht identisch. Es ändert sich nur der Umfang des benötigten Speichervolumens.

D.h. du bringst deine Realität in ein (tragfähiges, mit seinen etwaigen Schwächen akzeptiertes) Modell. Du hast dann Modell = Realität. Mit Normalisierung reduzierst du dann das benötigte Speichervolumen des Modells. Normalisierung ist ein iterativer Prozess mit sehr genauen Handlungsdirektiven. Aber über allen Iterationen steht: Modell bleibt Realität; wenn sich Modell durch eine Handlung des Normalisierungsprozesses verändert, so ist das nicht mehr Normalisierung.

Auf die Gefahr hin daß ich mich wiederhole :-) Normalisierung ist per Definition in _allen_ Iterationsschritten in Bezug auf das Modell _immer_ identisch. Das Modell wird _nie_ verändert.

Wenn du also in einem Tutorial, in einem Buch oder sonstwo gelesen hast, daß die Tabelle mit den Rechnungen über die Artikelnummer mit der Artikeltabelle verknüpft wird, und man das ganze mit Normalisierung begründet, ist das schlichtweg falsch. Entweder hat da der Autor geschlampt, da er nicht erläutert hat, daß es nur als Beispiel dienen soll. Oder du hast es falsch verstanden. Richtig heißt es: Normalisierung kennt eine Handlungsdirektive, bei der eine Tabelle mit Redundanz in zwei oder mehr Tabellen aufgeteilt wird und durch Referenzen zwischen den neu entstanden Tabellen dabei das Gesamtgebilde aber erhalten bleibt. Wichtig ist es, nicht nur das zu lesen, was man lesen möchte, sondern den ganzen Satz zu ende zu lesen: "dabei das Gesamtgebilde aber erhalten bleibt".

Sorry, wenn es so wirkt, als wenn ich unnötig lange darauf herumhacke. Aber das ist so ein Fall, wo sich Fehler unnötig fortpflanzen. Wenn also jemand über die Suchfunktion in diesen Thread stolpert: Normalisierung heißt nicht Volumenreduktion bis im Idealfall nichts mehr übrig ist. Es heißt aber auch nicht Reduktion bis zu einem vertretbaren Maß und dann nicht mehr weiter. Auch das ist es nicht. Es heißt: Normalisierung soweit wie nur irgend möglich. D.h. ja, sehr sehr weit, so weit wie es nur irgend geht. Aber eben nur bis zu dem Punkt, solange das Ausgangsmaterial nicht verfälscht wird. Anfang und Ende der Normalisierung müssen identisch bleiben. Sie unterscheiden sich nur im Volumen, das für die Speicherung benötigt wird.

Um zum Schluss zu kommen. Die Aussage, daß die Tabelle Rechnungen die Tabelle Artikel nur über die Artikelnummer fremdreferenziert, um bspw. den Artikelnamen in der betreffenden Rechnungsposition zu haben - und das mit Normalisierung zu begründen (d.h. "fachgerechter" Datenreduktion) - ist schlicht und einfach falsch.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von Christian »

Alle grösseren Rechnungssysteme die ich kenne halten alle für die Rechnung relevanten Daten in der/den Rechnungstabelle(n) komplett vor. Du kopierst also alle Kunden und Artikeldaten in die Rechnung. Alles andere führt dazu das du mit Änderungen sehr komplex umgehn musst. Kundenadressen ändern sich Artikeldaten ändern sich. Das darf sich alles auf die Rechnungen nicht auswirken.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Eure Meinung zu Artikel- und Rechnungstabelle, wie würde

Beitrag von af0815 »

Vielleicht ein Kurzer Auszug aus Informationen in Österreich, auch bezüglich Registriekasssenpflicht.

Code: Alles auswählen

5. Was versteht man unter Belegerteilungspflicht? 
Für jeden Unternehmer besteht ab 1.1.2016 die Verpflichtung bei Barzahlungen einen Beleg zu erstellen und dem Käufer auszuhändigen. Dieser muss den Beleg entgegennehmen und bis außerhalb der Geschäftsräumlichkeiten für Zwecke der Kontrolle durch die Finanzverwaltung mitnehmen. Jeder Beleg muss folgenden Inhalt aufweisen:
 
* Bezeichnung des leistenden/liefernden Unternehmens
* fortlaufende Nummer mit einer oder mehreren Zahlenreihen, die zur Identifizierung des Geschäftsvorfalls einmalig vergeben werden
* Tag der Belegausstellung
* Menge und handelsübliche Bezeichnung der Ware oder Dienstleistung
* Betrag der Barzahlung
* bei Verwendung der technischen Sicherheitseinrichtung (verpflichtend ab 2017) müssen noch zusätzlich folgende Bestandteile auf dem Beleg aufscheinen: Kassenidentifikationsnummer, Datum und Uhrzeit der Belegausstellung, Betrag der Barzahlung nach Steuersätzen getrennt, maschinenlesbarer Code (z.B. QR-Code)
 
Vom Beleg muss der Unternehmer eine Durchschrift oder elektronische Abspeicherung machen und wie alle Buchhaltungsunterlagen sieben Jahre aufbewahren.
 
Quelle:https://www.wko.at/Content.Node/Service/Steuern/Weitere-Steuern-und-Abgaben/Verfahren---Pflichten-im-oesterr--Steuerrecht/Registrierkassenpflicht---FAQ.html

Wobei es sich bei der technischen Sicherheitseinrichtung IMHO um eine Signatur sowohl in der Buchungszeile als auch über die ganze Rechnung handelt. Nachdem das ganze verkettet ist, also von Rechnung zu Rechnung fortlaufend, ist das ganze Schlüssig wie ein endloser Protokollstreifen. Damit wird sichergestellt, das nicht später die Rechnungen manipuliert werden.

Siehe auch https://www.a-sit.at/de/a-sit_plus/registrierkassenverordnung/index.php - dort gibt es auch Verweise auf Beispielcode.

Damit ist auch klar, was in DB hinengehört. :shock: Ich ghehe davon aus, das es in D ähnlich sein wird ( jetzt oder in Zukunft).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten