Produkt und Kategorie erstellen und löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

Hallo an alle Python-Programmierer,

ich beschäftige mich erst seit kurzer Zeit mit Python, von daher seht mir gewisse "dumme Fragen" bitte nach.

Ich habe mir vorgenommen ein kleines Programm zu schreiben, mit dem man ganz bequem verschiedenste Kuchen (lecker) bestellen kann.
1. sucht man sich den Kuchen seiner Wahl aus
2. um die Bestellung perfekt zu machen, muss der Käufer natürlich Name und Adresse agegeben
3. die Bestellung, bestehend aus Kuchen, Name/Adresse des Käufers, sowie Bestelldatum und Abholungsdatum soll in eine Datenbank überführt werden, damit man anschließend verschiedene Auswertungen fahren kann(bsp. welche Kuchen am meisten verkauft wurden, durch wen, wann, etc.)

zu1. Ich habe alle Kuchen in einer Liste aufgeführt und wollte diese nun verschiedenen Kategorien zuordnen.
-Schokoladenkuchen = Kategorie Schokolade
= Kategorie Geburtstagskuchen

Dabei stellt sich mir folgende Frage:
Nehmen wir an, der Kuchen wurde zwar vereinzelt verkauft, wird aber wegen Erfolgslosikeit eingestellt. Damit die Übersicht gewahrt bleibt, wird der Kuchen aus der Angebotsliste gestrichen.
Wie unter Punkt 3 beschrieben, wird der Kuchen in der Verkaufsliste geführt. Wenn ich den Schokoladenkuchen nun lösche, wird der sicherlich auch aus der Verkaufsliste gestrichen. ODER?
Bzw. wie kann ich vermeiden, dass genau das passiert. Kann man beispielsweise Produkte(das gleiche gilt für Kategorien) auf aktiv und inaktiv setzen? Ich will ja schließlich meine Verkaufsliste nicht manipulieren können.

Ich hoffe Ihr könnt mir in diesem Punkt helfen.

Freundlichen Dank vorab.
Dan
BlackJack

@danwilliams: Man führt entweder eine zusätzliche Spalte für aktiv/inaktiv ein oder eine Tabelle in der die IDs von aktiven Kuchen gespeichert werden.
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

Vielen Dank, mal schauen wie ich das aufbauen kann.

Ich hoffe Ihr könnt bei einer weiteren Frage helfen:
Wie genau stellt man es am besten an, dass eine "Bestellung", also die Auswahl eines Kuchens mit dem Namen des dazugehörigen Käufers + Datum des aktuellen Tages automatisch in einer separaten Liste/Datenbank abgelegt wird. Dahingehend habe ich leider überhaupt keine Ahnung, wie man soetwas realisieren kann.

Vielen Dank Euch vorab.
Dan
BlackJack

@danwilliams: Die Frage ist etwas unspezifisch. Man tut das einfach. Also nichts „automatisches” sondern Du schreibst Code der die Daten in die Tabelle einträgt. Wobei vom Kunden dort sicher nur die ID landen wird, denn für Kunden hast Du doch sicher eine eigene Tabelle. Für Anschriften braucht man auch eine, denn die Anschrift kann sich ja ändern, man möchte bei alten Bestellungen aber immer noch auf die alte Anschrift verweisen.
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

@BlackJack: Sorry für unspezifische Ausdrücke, werde mich dahingehend bessern :-)
Wie genau sieht so ein Übergabe-Code aus? Kannst du mir ein Beispiel geben?

get Kuchen-ID
get Kunden-ID
schreibe beides in Bestell-Liste ???
BlackJack

@danwilliams: Ich bin jetzt ein wenig verwirrt. Was hast Du denn schon an Quelltext? Wie sieht der Datenbankentwurf aus? Welche Datenbanksoftware verwendest Du? Womit hast Du die Python-Grundlagen und relationale Datenbanken gelernt?
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

@BlackJack

ich bin gerade dabei die Website http://openbook.galileocomputing.de/python/ durchzuarbeiten.

Von dieser Seite habe ich bis jetzt alles Wissenswerte für mich zusammengestellt, d.h.,
ich habe bis jetzt drei listen (lst1(kuchen), lst2(name), lst3(Adresse) erstellt.
Um jeweils einzelne Elemente in den Listen zu ändern lese bzw. ersetze ich diese mit getter/setter. (wie auf der Website unter Punkt 12 Objektorientierung beschrieben)

Leider habe ich noch kein Beispiel ausfindig machen können, in dem aufgezeigt wird, man man vorgeht, um jeweils 1 Element aus unterschiedlichen Listen zu nehmen und diese gemeinsam in eine separate Liste zu schreiben.
Bis jetzt bin ich davon ausgegangen, dass man auch hier die getter-Methode zum Aufruf nutzt, weiß dann allerdings nicht weiter.
Genau aus diesem Grund habe ich mich voller Hoffnung an Euch/dieses Forum gewendet, da Ihr mir hier sicherlich weiterhelfen könnt.

Gruß Dan
BlackJack

@danwilliams: Weil Du von Datenbank gesprochen hast, dachte ich es wäre tatsächlich eine relationale Datenbank im Spiel. Jetzt klingt es eher nur nach Objekten im Arbeitsspeicher.

Das Buch ist gerade was das Kapitel zur Objektorientierung angeht *nicht* zu empfehlen. Da steht einiges was in Python nicht wirklich zutrifft, beziehungsweise was Python-Programmierer *so* nicht machen würden.

Triviale Getter und Setter zum Beispiel oder die doppelten führenden Unterstriche um etwas ”privat” zu machen sind in Python unüblich, um es mal vorsichtig auszudrücken. Das machen nur Leute die von anderen Sprachen wie beispielsweise Java kommen und versuchen „javaesquen” Code in Python zu schreiben.

Warum schreibst Du `lst1`, `lst2`, und `lst3`? Das sind hoffentlich keine tatsächlich im Quelltext verwendeten Namen‽ Namen sollen dem Leser vermitteln was die Werte die daran gebunden sind, im Kontext des Programms bedeuten, damit er versteht was das Programm macht. Durchnummerierte, allgemeine, und dann auch noch so verstümmelte Namen tun das überhaupt nicht. Namen sollte man weder abkürzen, ausser wenn es sich um allgemein bekannte Abkürzungen handelt, noch mit laufenden Nummern versehen. Ebenfalls sollten sie den konkreten Datentyp nicht enthalten, solange der nicht wirklich wichtig ist um die Bedeutung zu vermitteln. Durchnummerieren ist oft ein Zeichen dafür, dass man die Werte eigentlich in einer Datenstruktur zusammenfassen möchte. Meistens eine Liste. Hier natürlich nicht weil die drei Listen komplett unterschiedliche Dinge enthalten. Bessere Namen wären `cakes`, `names`, und `addresses`. Bei Containerdatentypen wird üblicherweise die Mehrzahl von dem genommen mit dem man ein einzelnes Element bezeichnen würde. An der Stelle hat Englisch übrigens den Vorteil, dass in aller Regel Einzahl und Mehrzahl unterschiedlich bezeichnet wird. Da kann man im Deutschen Probleme bekommen. Zum Beispiel bei „Kuchen”. Bei Wörterbüchern (`dict`) wird oft ein zusammengesetzter Name verwendet, der aus Bezeichnern für Schlüssel und Wert besteht die mit `2` oder `_to_` zusammengesetzt sind. Also Beispielsweise `name2cake` für ein Wörterbuch welches Kuchennamen auf Kuchenobjekte abbildet.

Wenn es sich jetzt gar nicht um einen Datenbankentwurf sondern um objektorientierte Programmierung (OOP) geht, dann sind IDs und Attribute für aktiv/inaktiv eher nicht die richtige Antwort. Kunden möchte man vielleicht trotzdem noch eine ID verpassen, aber ob ein Objekt noch irgendwo verwendet wird oder ob es komplett gelöscht werden kann, ist eine Entscheidung die von der automatischen Speicherverwaltung schon entschieden wird. Solange irgendein Kuchenobjekt noch bezug auf eine Kategorie nimmt, wird das Objekt welches die Kategorie beschreibt auch nicht aus dem Speicher entfernt.

Wie man das ganze jetzt konkret als Objekte/Objektverbund modelliert kann man ohne weitere Informationen nicht sagen. Hier kommt es darauf an was überhaupt von dem System geleistet werden soll. Man muss also im ersten Schritt überlegen was genau an Anwendungsfällen abgedeckt werden soll. Welche Benutzer gibt es (Bäcker, Verkäufer, Kunde, Buchhalter, …), und was genau erwarten die von dem Programm. Welche Arbeitsschritte führen sie durch und welche Informationen sind dafür als Ein- und Ausgabe nötig. An anhand dieser Informationen kann man dann entscheiden wie die Datenstrukturen am günstigsten aufgebaut werden. Ob man etwas in Listen, Wörterbücher, oder Mengen (`set`) steckt und welche Eigenschaften die selbst geschriebenen Datentypen haben müssen.
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

@BlackJack
@all

vielen Dank für die vielen guten Ratschläge. Gibt es Websites/Tutorials die du für Python 3 "mehr" empfehlen würdest? Wenn man eine neue Programmiersprache lernt, will man es ja auch richtig machen.

Natürlich möchte ich mein vorgeschlagenes Projekt bestmöglichst allein erstellen, eine kleine Hilfe vor Dir/Usern dieses Forums, wie man grundsätzlich soetwas aufzieht, wäre allerdings sehr hilfreich, da ich soetwas noch nie gemacht habe.

Um eine bessere Übersicht zu bekommen, was das Ziel darstellt, folgende Übersicht:

1. Der Kunde soll über vers. Kategorien (Schokolade, Obst, ...) einen Kuchen auswählen.
2a. Danach soll der Kunden seinen Namen, Adresse, Lieferadresse bzw. selbstabholung, sowie das Lieferdatum/Fertigstellungsdatum des Kuchens angeben.
2b. 1.+2. muss anschließend für den Tätigkeitsnachweis/Auswertungen/etc. in eine extra Datei/Liste/DB (was ist hier am besten?) gespeichert werden. Worauf dabei zu achten ist, das sowohl Namen, Adressen, Kuchen, Kategorien nachträglich in den jeweiligen Listen geändert bzw. gelöscht werden können. Diese Änderungen dürfen sich gern in der Tätigkeitsnachweisliste auswirken, auf keinen Fall darf aber ein Datensatz gelöscht werden. (daher meine Frage nach aktiv/inaktiv)
3. Die "Bestellung" möchte ich mit allen erforderlichen Daten ausdrucken und zusätzlich als E-Mail verschicken können.
4. Damit der Bäcker nun weiß, welche Kuchen er backen soll, muss es eine separate Übersicht geben, in dem der Bäcker das jeweilige Datum aussucht. Anschließend soll ihm die Liste der zu diesem Datum bestellten Kuchen angezeigt werden.
5. Schön wäre es, wenn der Bäcker nach erfolgreichem Backvorgang den jeweils fertigen Kuchen in der Liste von 4. "abhaken" also auf "Fertig" stellen könnte. Das gleiche gilt natürlich für den Verkäufer -> hier kann man sicherlich Bäcker und Verkäufer die gleiche Liste geben, um zusätzliche Arbeit eines Abgleichs beider Listen zu vermeiden.

Das wars eigentlich schon. Ich hoffe das ist für den Anfang nicht gleich zu viel. Aber man soll sich ja Ziele setzen. :-)

Gruß
Dan
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Dan,

das hört sich sehr nach einer Datenbank an. Was Du also als erstes brauchst ist ein vernünftiger Datenbankentwurf. Der ist erstmal von der Programmiersprache unabhängig. Für die Umsetzung wird oft SQAlchemy empfohlen, da es unabhängig von der Konkreten SQL-Datenbank ist.
BlackJack

@danwilliams: In der Python-Dokumentation befindet sich ein Tutorial das man IMHO mal durchgearbeitet haben sollte, da es einen guten „Rundgang” durch die grundlegenden Spracheigenschaften und Datentypen bietet. Also Programmieranfänger empfiehlt sich vorher vielleicht etwas was weiter unten ansetzt wie Learn Python The Hard Way. Nicht vom Namen irritieren lassen. ;-)

Also für mich klingt das für den Anfang zu viel. Sogar viel zu viel.

Und es irritiert mich immer noch, dass es sich teilweise so anhört als bräuchte man eine Datenbank. Dann ist der Entwurf aber deutlich anders, denn dann würde man nicht zuerst objektorientiert entwerfen sondern in erster Linie erst einmal den relationalen Datenbankentwurf machen. Dann kommt noch eine ganze Menge mehr dazu was man lernen muss, nämlich relationale Datenbanken und SQL als zusätzliche Sprache.

Ansonsten müsste man sich um die Persistenz der Daten andere Gedanken machen, wobei dann auch das Problem von mehreren Benutzern die das System gleichzeitig benutzen irgendwie zu lösen ist und man sicher irgendwann anfängt selber eine (relationale) Datenbank zu programmieren.

Ich persönlich würde bei echten Anwendungen auch noch bei Python 2.7 bleiben. Dann ist die Auswahl an Modulen von Drittanbietern grösser.
danwilliams
User
Beiträge: 6
Registriert: Freitag 22. November 2013, 11:20

@BlackJack
@Sirius3

Oha, das hätte ich jetzt nicht erwartet. Braucht es für dieses Vorhaben denn unbedingt eine DB, vor allem wenn mehrere gleichzeitig das nutzen wollen, oder geht es auch ohne?
(Wenn man unbedingt eine braucht, gut, dann muss ich das eben lernen)

Bzw. wenn man so ein DB-Modell hat, kann man dann leicht darauf mit Python aufsetzen? Also anschließend mit den Vorgaben aus der DB wieder in Python einsteigen und den "Rest" programmieren?
BlackJack

@danwilliams: Ich denke man braucht hier eine Datenbank. Ansonsten muss man sich selber eine programmieren und für die Datenkonsistenz bei mehreren Benutzern sorgen, was die Sache nicht einfacher macht.

Sirius3 hat ja SQLAlchemy schon erwähnt. Damit kann man sowohl Datenbankabfragen programmatisch und unabhängig von einem der unterstützten konkreten Datenbanksysteme erstellen, also auch Datenbankeinträge auf Objekte abbilden („object relational mapper”, ORM).
Antworten