SQL Datenbanklogik für Kassenprogramm

sLgFiRE

Lieutenant
Registriert
März 2013
Beiträge
855
Hallo,

ich habe hier eine Datenbankstruktur (siehe Bild)


datenbankmodell_jufi-software1.png
ist die Beziehung der beiden roten Pfeile irgendwie möglich?
auf normalem wege ging es nicht, da immer die zweite Referenz anscheinend gefehlt hat.

Die Ausgabe, wenn ich etwas in die Tabelle "lager" schreiben wollte, war dabei immer:
Code:
    Cannot add or update a child row: a foreign key constraint fails (`test`.`lager`, CONSTRAINT `lager_ibfk_1` FOREIGN KEY (`artikelnr`) REFERENCES `artikel` (`artikelnr`))

Wenn jemand einen besseren Vorschlag hat, wie ich den Rabatt mit seinen Eigenschaften besser in die Datenbankstruktur einbinden kann, kann den gerne kund tun.

Vielen Dank für eure Hilfe und

Viele Grüße
FiRE
 
Würde die Verbindung so machen:
Artikel -> Lager
Artikel -> Rabat
Ergänzung ()

Mach kein Fremdschlüssel um Fremdschlüssel einer zweiten Tabelle
 
Vielen Dank für die Antwort!

Aber wie bekomm ich dann Daten von Rabatt ins Lager?
 
Bin nicht sicher ob ich deine Frage richtig verstehe. Wenn es um einen extract geht:

select *
from artikel inner join lager on artikel.artikelnummer = lager.artikelnummer
left outer join rabatt on artikel.artikelnummer = rabatt.rabatartikelnummer

ist es das was du meinst?
 
Gehört der Rabatt zum Artikel? Dann ist das eine 1 (Artikel) : 0..1 (Rabatt) Beziehung und damit muss die Artikelnummer Fremdschlüssel im Rabatt sein.

Tante Edith sagt:
Wofür benötigst du den Verkauf als eigene Tabelle? Wofür das Datum im Bon und im Lager?
 
Zuletzt bearbeitet:
Ich glaube dass du da eine m:n Beziehung eingebaut hast.

Wenn ich es richtig verstehe ist die Artikel Tabelle eine Master Table, und Lager eine Detail Table, wo du deine Einkäufe mit Datum reinbuchst. Wenn dem so ist, dann kann es zu jedem Artikel im Lager mehrere Einträge (Einkäufe) geben. Das wäre eine 1:n Beziehung.

Bei den Rabatten ist es ähnlich. Du hast Rabatt Codes (Mastertable), die du auf mehrer Artikel (und Einkäufe) anwenden kannst (wieder eine klasseische 1:n Beziehung).

Aber der Versuch die Lager Tabelle mit der Rabatt Tabelle über die Artikelnummer zu verbinden, obwohl es in beiden zu einem Artikel mehrer Einträge gibt wäre eine m:n Relation. Das funktioniert so nicht.

Wenn aber in der Lager Tabelle jeder Artikel nur einmalig ist, und das Datum nur den letzten "Zählstand" wider gibt, dann kannst du die ganze Tabelle kniggen und menge und datum gleich in die Artikel Tabelle inkludieren.

Schreib mal dazu, in welcher Beziehung (1:1 oder 1:n) die Tabellen stehen, dann tut man sich leichter.
 
Deine DB Struktur ist nicht Optimal:
- Warum ist dein Bon mit dem Lager verknüpft?
- ich würde Kunde mit verkauf und nicht mit Bons verknüpfen
- artikel muss mit Lager verknüpft sein
- warum verkauf und bons, kannst beides in eine machen
- dein Bon brauch einen Artikel preis. Wenn ein Preis àndert werden alle dein Bons nicht mehr den damaligen Preis anzeigen
- wenn ein verkauf einen Rabatt kriegt muss du Rabatt mit Verkauf/Bon verbinden

Was ist WG?
 
sgrisius schrieb:
Deine DB Struktur ist nicht Optimal:
- Warum ist dein Bon mit dem Lager verknüpft?
Weil ich Artikel von Lager auf eine Bon schreibe und somit aus Lager ausbuche
sgrisius schrieb:
- ich würde Kunde mit verkauf und nicht mit Bons verknüpfen
Aber ich brauch ne Kundennummer/Interne Nummer auf dem Bon. Damit ich den Kunde den richtigen Bon zuweisen kann.
sgrisius schrieb:
- artikel muss mit Lager verknüpft sein
Die artikelnr(Artikel) ist doch mit artikelnr(Lager) verknüpft, oder meinst du die komplette Table?
sgrisius schrieb:
- warum verkauf und bons, kannst beides in eine machen
Okay, wenn ich mir das so ansehe hast du recht, dazu brauch ich dann aber noch ne bonnr. da die vkid auf einen Verkauf darstellt.
Wir verkaufen nur in 4-5 Wochen im Jahr und eine vkid soll einen Verkauf darstenne. zB 1 Woche/Januar VKID=1, 2Woche/März VKID=2, ...
sgrisius schrieb:
- dein Bon brauch einen Artikel preis. Wenn ein Preis àndert werden alle dein Bons nicht mehr den damaligen Preis anzeigen
Es werden keine Preise geändert, und wenn doch, wird dies über den Rabatt gelöst und bekommt eine neue Artikelnummer.
sgrisius schrieb:
- wenn ein verkauf einen Rabatt kriegt muss du Rabatt mit Verkauf/Bon verbinden
Also der Verkauf bekommt keinen Rabatt, sondern nur der Artikel. Und der liegt ja dann im Lager

Bevor ihr jez was falsch versteht, dies ist kein ganz normaler Verkauf wie im Discounter.
Dies ist sozusagen ein Personalverkauf in einer Firma. nach jedem Verkauf(=nur 1Tag) wird abgerechnet und wir müssen daraus anhand der VKID eine Statistik erstellen.

an dieser Stelle schonmal danke für eure Hilfe!
Dies hilft mir/uns viel.

Hier mal noch ein überarbeitetes Datenbankkonzept:
Datenbankmodell_Jufi-Software(1)(1).jpg

Meint ihr das es so besser ist?
Wie kommt man an die Rabatttartikel?
 
Zuletzt bearbeitet:
Fireplayer schrieb:
Weil ich Artikel von Lager auf eine Bon schreibe und somit aus Lager ausbuche
Eine Kunde kauft einen Artikel und nicht ein Lagerbestand. Wird funktionieren ist aber nicht sauber.

Fireplayer schrieb:
Aber ich brauch ne Kundennummer/Interne Nummer auf dem Bon. Damit ich den Kunde den richtigen Bon zuweisen kann.
Gelöst mit deiner neuen Struktur

Fireplayer schrieb:
Die artikelnr(Artikel) ist doch mit artikelnr(Lager) verknüpft, oder meinst du die komplette Table?
Gelöst mit deiner neuen Struktur[/QUOTE]
Gelöst mit deiner neuen Struktur

Fireplayer schrieb:
Okay, wenn ich mir das so ansehe hast du recht, dazu brauch ich dann aber noch ne bonnr. da die vkid auf einen Verkauf darstellt.
Wir verkaufen nur in 4-5 Wochen im Jahr und eine vkid soll einen Verkauf darstenne. zB 1 Woche/Januar VKID=1, 2Woche/März VKID=2, ...
Gelöst mit deiner neuen Struktur

Fireplayer schrieb:
Es werden keine Preise geändert, und wenn doch, wird dies über den Rabatt gelöst und bekommt eine neue Artikelnummer.
Das nennt man Redudanz und ist nicht sauber.
Ergänzung ()

Also nur umklar zustellen. Deine Stuktur sollte so funktionieren (neues Model)
Ist nur nicht optimal in der hinsicht dass nicht sehr flexible sein wirds mit deinen Daten (beispiel Preise und Rabatte)
 
Vielen Dank!
das mit den Rabatten ist komisch zu erklären.
Beispiel: Artikel beshcädigt, wird vor Verkauf schon rabattiert.
Aus der Db ziehen wir uns auch den Barcode für die Artikel,
z.B. normaler Artikel = 00123 | rabattierter Artikel = 50123 (50%)
100% rabatt wird es nicht geben daher die 00,10,...

Wie komm ich nun an die Rabattartikel?
hätte da jemand einen Befehl dafür?
 
Zuletzt bearbeitet:
select *
from artikel inner join rabatt on artikel.artikelnummer = rabatt.rabatartikelnummer
Ergänzung ()

das was du suchst?
 
und ein insert befehl? stehe grad echt aufm schlauch
 
Welche DB benutzt du.
Am einfachtsten ist es die Tabelle im Editmodus aufzumachen.
Dann kannst du die Werte eintragen wie in Excel.
Alternative

insert into tabelname
(
feldname1,
feldname2,
feldname3 ...

)
values
(
Wert1,
wert2,
wert3...

)

musst du für jede Tabelle benutzen, (Artikel, Rabatt, Lager...)
 
Hallo,

ich bin ein Kollege von Fireplayer und auch vertraut mit dem Thema.
Die Frage ist speziell für die Tabelle "rabatt", da beim Insert-Befehl (wie du ihn beschrieben hast)
folgende Fehlermeldung kommt:
Code:
insert into rabatt(rabattartikelnr, preis, wg, rabatthoehe, rabattcode, datum) values (50001, 1.40, 130, 30, 30, '2016-10-06');

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`rabatt`, CONSTRAINT `rabatt_ibfk_1` FOREIGN KEY (`rabattartikelnr`) REFERENCES `artikel` (`artikelnr`))

Vielen Dank

Gruß DenSe
 
Existiert Artikel 50001 in der Artikeltabelle?
 
Nein war er nicht. Hab ich kurz danach auch herausgefunden.
Wie kann ich Rabatte jetzt besser ausweisen?
 
Das soll was heissen?
 
Ich wollte fragen, wie ich am besten die Rabatte von den normalen Artikeln trennen kann?
 
Zurück
Oben