Problem funktion "find(Hersteller,Art.......)" in Teilekatalog

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.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Sirius es geht um folgende Zeile aus einem tutorial welche ich nicht verstehe:

csv.writer(ofile, delimiter='', quotechar='"', quoting=csv.QUOTE_ALL)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: erstens, warum interessiert Dich diese Zeile und zweitens, was verstehst Du daran nicht?
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Hallo Leute. Das verständniss Problem ist in den hintergrund gerückt sirius3. es gingm mir um die Bedeutunge dieses Kontrukts "delimiter='', quotechar='"', quoting=csv.QUOTE_ALL".
Was bedeutet delimiter, quotechar und QUOTE_ALL?

Meine aktuelle Fassung sieht folgendermasen aus:

Code: Alles auswählen

def new(datenbank, hersteller,artikelnummer,artikelbezeichnung,preisEK,gewinn=1.10,mwst=1.19):
    for index in range(0,len(datenbank)):
        if artikelnummer in datenbank[index]:
            return datenbank
    
    datenbank.append([hersteller,str(artikelnummer),artikelbezeichnung,str(preisEK),str((preisEK*mwst+preisEK*gewinn+preisEK))])
    return datenbank

def search(datenbank, suchbegriff):
    ergebnisse=[]
    for index in range(0,len(datenbank)):
        for index2 in range(0,4):
            if suchbegriff in datenbank[index][index2]:
                ergebnisse.append(datenbank[index])


    return ergebnisse

def delete(datenbank, artikelnummer):
    for index in range(0,len(datenbank)):
        if str(artikelnummer) in datenbank[index]:
            datenbank.pop(index)
            break
        
    return datenbank
    
def readfile(pfad):
        datenbank=[]
        with open(pfad, "r") as f:
            daten = csv.reader(f)
            for row in daten:
                datenbank.append(row)

        return datenbank

def savefile(pfad,datenbank):
        with open(pfad, "w") as f:
            output = csv.writer(f)
            for row in datenbank:
                output.writerow(row)
        return datenbank
Ich habe versucht die Funktionsbeschreibungen möglichst exakt zu halten was mir bis auf new() denke ich auch einigermaßen gelungen ist. new prüft ob ein Eintrag bereits vorhanden ist und fügt ein vorhandenes Element nicht erneut hinzu.
Auch habe ich versucht das speichern und lesen in CSV Dateien zu implementieren was ebenfalls funktioniert.
Nun dar das hinzufügen, löschen, suchen und das speichern und wieder einlesen funktioniert würde ich gerne noch folgende Funktionen hinzufügen:

Ändern von Einträgen:
Hier fehlt mir ein Gedankenansatz wie dies zu lösen wäre. Würde folgendes Funktionieren oder bin ich hier auf dem Holzweg:
Ich möchte die bestehenden Funktionierenden Funktionen ungern wieder zerlegen oder erweitern. Den bis jetzt bin ich durch das ewige erweitern immer wieder an meine Grenzen gestoßen und habe von neuem b begonnen weil ich den Wald vor lauter Bäumen nicht mehr gesehen habe.

Eine Funktion schreiben welche wie del den Eintrag sucht ihn entfernt aber in einer variable zwischenspeichert. Der Funktion wird der zu ändernde Teil mitgeteilt und dessen Ersatz. Dann wird das Element eben entfernt und ersetzt und der Datensatz wieder an die Liste angehängt. Allerdings weis ich nicht wie ich das ganze umsetzen sollte......

Importieren aus Datei:
Eine Funktion welche eine CSV Datei einließt prüft ob das Format passt(5 Zeilen) dann Eintrag für Eintrag hinzufügt mit "new()". Dar new sowieso überprüft ob eine Artikelnummer bereits vorhanden ist gäbe es keine Probleme mit doppelten Einträgen. Allerdings würde eine importierte Tabelle welche mit der geladenen zusammengeführt wird bei nicht Einhaltung der Reihenfolge Hersteller Bezeichnung Artikelnummer zu einem Riesen Chaos führen und alles zerstören... Wie man dem entgegen wirken könnte wäre zu überlegen..

Regelmäßiges Backup:
Ein Gedankenansatz meinerseits wäre hier am Anfang der CSV Datei 1,2 Reihen hinzuzufügen mit dem Erstellungsdatum der Datei(wie finde ich das heraus???Den der csv.writer legt eine Datei ja Automatisch an wenn sie nicht vorhanden ist und überschreibt sie jedes mal komplett) und Änderungsdatum...
wurde die Datei geändert werden die vorhergehenden Datenstände in .....5 Backups gespeichert um eine Art Undo mit zu implementieren welche einem den Aller wertesten rettet sollte eine Fehlbedienung statt finden...

Dar das ganze am Ende eine Gui bekommen soll stellen sich mir noch ein paar fragen:
Ich habe mich bereits in tkinter etwas eingearbeitet.. Wäre es nicht sinnvoll die Datenverarbeitung und Gui in Klassen zu unterteilen? Wie realisiere ich eine Art Autofill Funktion für Hersteller und artikelbezeichnung?

Wie bereits erwähnt besteht bei mir ein erhebliches Defizit in der OOP...
Auch färe Programmiertechnisch eine:

daten.new(bliblablub) natürlich schöner als jedes mal den Returnwert abzufragen ala

daten = new(daten, bliblablub)

Ich danke schon ein mal jedem der sich das ganze hier durchließt und mir seinen Zeit widmet.

mfg Daniel

PS: Dar ich das ganze abschließend im dauereinsatz haben werde und auch ein bekannter interesse an dem Projekt für private Zwecke hat, möchte ich natürlich eine möglichst perfekte Lösung zaubern
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@dannyboy385: Deine Probleme würden sich großteils in Luft auflösen, wenn du, wie schon mehrfach empfohlen, einfach SQLite verwenden würdest.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: eine Liste ist der falsche Datentyp für einen Eintrag, nimm Namedtuple, Wörterbücher oder ähnliches. Wenn artikelnummer, preisEK oder preisVK Zahlen sind, dann speicherst Du sie intern auch als Zahlen. Übrigens, preisVK = preisEK * (1 + gewinn) * mwst oder preisVK = preisEK * (1 + gewinn * mwst), je nachdem ob preisEK mit oder ohne Verbrauchssteuern ist. Wenn Du dann an anderer Stelle Probleme bekommst (search, readfile, etc) dann mußt Du die dort lösen und nicht durch eine unsinnige Datenhaltung. `new` bekommt die Liste datenbank als Argument und gibt sie auch wieder als Rückgabewert zurück. Das ist in manchen Sprachen üblich (chaining) in Python aber verpönt, weil es falsche Erwartungen an die Funktion erzeugt, nämlich, dass das Übergebene datenbank NICHT verändert wird. `for index ...` ist ein Anti-Pattern, heißt, soll man nicht machen; man kann direkt über die Listenelemente iterieren. `search` liefert unter Umständen ungewollte Ergebnisse.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Sirius3 hat geschrieben:@dannyboy385: eine Liste ist der falsche Datentyp für einen Eintrag, nimm Namedtuple, Wörterbücher oder ähnliches. Wenn artikelnummer, preisEK oder preisVK Zahlen sind, dann speicherst Du sie intern auch als Zahlen. Übrigens, preisVK = preisEK * (1 + gewinn) * mwst oder preisVK = preisEK * (1 + gewinn * mwst), je nachdem ob preisEK mit oder ohne Verbrauchssteuern ist. Wenn Du dann an anderer Stelle Probleme bekommst (search, readfile, etc) dann mußt Du die dort lösen und nicht durch eine unsinnige Datenhaltung. `new` bekommt die Liste datenbank als Argument und gibt sie auch wieder als Rückgabewert zurück. Das ist in manchen Sprachen üblich (chaining) in Python aber verpönt, weil es falsche Erwartungen an die Funktion erzeugt, nämlich, dass das Übergebene datenbank NICHT verändert wird. `for index ...` ist ein Anti-Pattern, heißt, soll man nicht machen; man kann direkt über die Listenelemente iterieren. `search` liefert unter Umständen ungewollte Ergebnisse.
Der Preis/artikelnummer habe ich als str gespeichert dar mir search sonst eine exception schmeist dar ich ja nach einem teilstring in den einträgen der listen Suche aber ein string nicht teil einer integer oder float sein kann.

Was genau meinst du mit direkt über die Listen Elemente iterieren. Wie wäre hier ein passender Lösungsansatz? Die Problematik bei einigen anderen versuchen war ja immer das die liste listen enthält und der zugriff über den index reichlicher denksport war. Artikelnummer ist denke ich als string sinnvoll..den preis könnte man aus der Suche ausschöießen, dar sicher keiner nach "3.72" suchen wird.
Dictionaries brachten mich in eine anderen versuch halb zur verzweiflung. Sie sind ja immer eine zuordnung von key:value. Aber in wie fern wird diese zuordnung nützlich oder interessant? Habe soeben feierabend gemacht und werde mich noch einmal an einen versuch waagen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: genau das habe ich ja bereits geschrieben: die Datenhaltung soll sich nicht an irgendeine Suche anpassen müssen, sondern umgekehrt, verwende sinnvolle Datentypen, denn sobald Du den Gesamtpreis oder ähnliches Ausrechnen willst, was machst Du dann mit Deinen Strings?
Das iterieren meine ich, so wie Du es ja in readfile und savefile breits machst. Warum also nicht auch in search oder new?
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Nabend Sirius. Also auf dein anraten habe ich es einmal mit SQLite versucht. leider scheitere ich schon bei den ersten zweilen

Code: Alles auswählen

import sqlite3

connection = sqlite3.connect("Katalog.db")
cursor= connection.cursor()
sql_command = """
CREATE TABLE materialliste (
Artikelnummer INTEGER(15),
Hersteller VARCHAR(20),
Artikelbezeichnung VARCHAR(30),
PreisEK REAL,
PreisVK REAL
);"""

#cursor.execute(sql_command)



def new (datensatz):
    cursor.execute("""INSERT INTO materialliste (Artikelnummer,Hersteller,Artikelbezeichnung,PreisEK,PreisVK) VALUES (datensatz)""")
    connection.commit()
Ich baue eine verbindung zur datenbank "Katalog.db" auf erstelle einen Cursor und versuche per cursor.execute(???) SQL Befehle auszuführen.

Nun folgendes Problem dar sich SQL quer stellte eine Liste(welche ja eine feste Reihenfulge hat) der tabelle hinzuzufügen habe ich etwas gegoogelt und bin darauf gestoßen das man doch tuple übergeben solle..Nun ja. dann baute ich mir das unter new stehende Konstrukt zusammen.

Wenn ich das Programm ausführe und dann:

Code: Alles auswählen

new(datensatz=(23657236,"ABB","dbksdj",7.45,7.89)
Versuche hängt sich das Programm auf. Das heisst der Cursor blinkt aber es erscheint keine neue Zeile mit >>>
Exception wird aber auch keine geworfen.

Siehst du auf anhieb das Problem? Ich glaube ich stelle mich einfach an wie der Hund zum Eierlegen...
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: da fehlt eine schließende Klammer. Und warum denkst Du, dass das Wort »datensatz« in einem String auf magische Weise mit der Variable `datensatz`ersetzt wird?

Code: Alles auswählen

def new(connection, datensatz):
    cursor = connection.cursor()
    cursor.execute("""INSERT INTO materialliste (Artikelnummer,Hersteller,Artikelbezeichnung,PreisEK,PreisVK) VALUES (?, ?, ?, ?, ?)""", datensatz)
    connection.commit()
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Edit: jetzt funktioniert das hinzufügen zumindest einmal

Code: Alles auswählen


def new (datensatz):        #Funktioniert. Übergabewert muss ein tupel oder eine Liste sein
    if type(datensatz) == 'list':
        datensatz = tuple(datensatz)
    cursor.execute('INSERT INTO materialliste VALUES (?,?,?,?,?)', datensatz)
    connection.commit()
                      
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: es ist völlig egal, welche Sequenztyp als Parameter übergeben wird, Zeile 3 und 4 sind also unnötig.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@dannyboy385: Außerdem gibt `type` einen Wert vom Typ `type` zurück, nicht vom Typ `str`. Der Vergleich ergibt also immer `False`.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Code: Alles auswählen

def new (datensatz): 

    cursor.execute('INSERT INTO materialliste VALUES (?,?,?,?,?)', datensatz)
    connection.commit()


def databasesearch(suchbegriff):
    results=[]
    for x in cursor.execute("SELECT * FROM materialliste"):
        if suchbegriff in x:
            results.append(x)
    return results

def listsearch(liste, suchbegriff):
    results=[]
    for x in liste:
        if suchbegriff in x:
            results.append(x)
    return results
Also das erstellen neuer Einträge funktioniert, sowie das durchsuchen der Datenbank nach einem Begriff . Desweiteren habe ich noch eine Funktion mit der ich eventuelle listen noch einmal durchsuchen kann(spart zwar nurj eweils 2 Zeilen aber immer hin.. nĹeider hat das Suchen direkt in SQL nicht so funktioniert wie erwartet. ich wollte ein konstrukt ala
"SELECT * FROM materialliste WHERE Artikelnummer OR Hersteller OR Artickelbezeichnung LIKE (2)",suchgebgriff
bauen, Leider funktioniert das so einfach nicht., . . hat hierzu jemand einen Denkanstoß?.

Desweiteren bin ich noch nicht so weit gekommen wie ich jetzt einen Expliziten Eintrag löschen kann und Doppelte Einträge vermeiden kann..
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: der Tipp wäre ein SQL-Tutorial durchzuarbeiten.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Hallo Leute. Also nachdem ich jetzt etliche Beiträge gelesen habe zur thematik Durchsuchen von Datenbanken und Editieren von Datenbanken steh ich gewaltig auf dem Schlauch. Die SQL Syntax so einfach sie auch aussieht treibt mich in den wahnsinn. Unten Aktueller(schon etwas zerpflückter Code).

Zur Problematik:
Erstens würde ich gerne databasesearch(): so umbauen das die Suche nicht von Python in im Cursor erledigt wird sondern SQL mir die Ergebnisse zurück liefert... dar mir dieses For bla in cursor.execute .... irgendwie missfällt und sehr untypisch vorkommt.

2tens habe ich noch nicht geschafft LIKE zum laufen zu bekommen. Also eine Suche die nicht nach dem genauen Begriff sucht.... Was ich unter databaselike() versucht habe.

Code: Alles auswählen

>>> for row in databaselike("HAGER"):
	print(row)

	
(73476384, 'HAGER', 'Aufputzvertiler Volta48', 42.6, 45.0)
(23657236, 'ABB', 'dbksdj', 7.45, 7.89)
(12839729831, 'ABB', 'jdfkshfd', 4.32, 4.56)
(12839729831, 'ABB', 'jdfkshfd', 4.32, 4.56)
(12839729831, 'ABB', 'jdfkshfd', 4.32, 4.56)
(23657236, 'ABB', 'dbksdj', 7.45, 7.89)
>>> 
Das ist allerdings nicht das erwartete Ergebniss...

Ich stehe wirklich auf dem schlauch.

Das Editieren ist das nächste Thema. Dar das ganze ja später einmal eine GUI bekommen soll die in etwa so aussieht das oben ein Suchfeld ist drunter die Einträge und durch anklicken der Einträge die möglichkeiten des Löschens und Editierens erscheinen. Editieren in einem Popup in dem der Eintrag angezeigt, nach Lust und Liebe editiert und gespeichert werden kann) fehlt mir die Idee wie ich hierbei überhaupt anfangne soll...um die Funktionen später Efektiv nutzen zu können müsste ich den bestehenden Eintrag ja in einer Variable speichern, editieren und dann den alten in einer 2ten variable gesicherten Eintrag mit den neuen Werten an SQL übergeben. Ich habe wirklich keinen Aufriss mehr und das gefühl das das ganze mit SQL wesentlich schwieriger wird als mit csv oder einfach pickle Dateien... :/ :K

Code: Alles auswählen

import sqlite3

connection = sqlite3.connect("Katalog.db")
cursor= connection.cursor()
sql_command = """
CREATE TABLE materialliste (
Artikelnummer INTEGER(15),
Hersteller VARCHAR(20),
Artikelbezeichnung VARCHAR(30),
PreisEK REAL,
PreisVK REAL
);"""

#cursor.execute(sql_command)



def new (datensatz):        #Funktioniert. Übergabewert muss ein tupel oder eine Liste sein
    cursor.execute('INSERT INTO materialliste VALUES (?,?,?,?,?)', datensatz)
    connection.commit()


def databasesearch(suchbegriff):
    results=[]
    for x in cursor.execute("SELECT * FROM materialliste"):
        if suchbegriff in x:
            results.append(x)
    return results

def databaselike(suchbegriff):
    cursor.execute("""SELECT * FROM materialliste WHERE (Artikelnummer OR Hersteller = ?)""",(suchbegriff,))
    	


def listsearch(liste, suchbegriff):		#Durchsucht die unterlisten einer Liste
    results=[]
    for x in liste:
        if suchbegriff in x:
            results.append(x)
    return results

def databasedelete(Artikelnummer):               #Funktioniert Ebenfalls
    cursor.execute("DELETE FROM materialliste WHERE Artikelnummer = ?",(Artikelnummer,))
    connection.commit()

Ich wäre froh darüber wenn mir jemand eventuell Codebeispiele mit Ausführlicher Erklärung liefern könnte...den auch aus den ganzen Tutorials werde ich nicht schlau und egal was ich versuche es ist ein ewiges Syntax gebastel bis es funktioniert.. :?
Ich habe nicht einmal das gefühl dafür wann SQL eine Klammer oder ähnliches erwartet...

Das einzig positive das ich mom sehe ist die Speicherung in der Datenbank. Suche, Löschen und verändern erscheinen mir wesentlich aufwändiger.. und auch komplizierter...
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Hallo Leute nach einigen Kampf bin ich nun soweit das ich Einträge editieren kann welche ich per Artikelnummer identifiziere, Einträge Erstelle und Lösche, Die Datenbank nach einem Suchbegriff Durchsuche eine Neue Datenbank anlege aber vorher prüfe ob sie bereits besteht.

Jetzt würde ich euch bitten noch einmal über das ganze zu schaun und eventuelle Fehler anzusprechen.

Was mir selbst auffältt:
Das global in der Funktion open gefällt mir garnicht

Exceptions von SQLite werden noch nicht behandelt(Hier denke ich an eine folgenden Lösungsansatz:
Dar später das ganze eine GUI haben soll wäre es natürlich schön jede exceotion per try: .....
except(MESSagebox mit FEHLERBESCHREIBUNG)

Was fällt euch noch auf oder wäre einfacher zu lösen?

Code: Alles auswählen

import sqlite3
import os.path






def new (datensatz):        #Funktioniert. Übergabewert muss ein tupel oder eine Liste sein
    cursor.execute('INSERT INTO materialliste VALUES (?,?,?,?,?)', datensatz)
    connection.commit()

def databasesearch(suchbegriff):
    cursor.execute("SELECT * FROM materialliste WHERE Artikelbezeichnung LIKE (?) OR Hersteller LIKE (?) OR Artikelnummer LIKE (?)", (suchbegriff,suchbegriff,suchbegriff))
    	
def listsearch(liste, suchbegriff):		#Durchsucht die unterlisten einer Liste
    results=[]
    for x in liste:
        if suchbegriff in x:
            results.append(x)
    return results

def databasedelete(Artikelnummer):               #Funktioniert Ebenfalls
    cursor.execute("DELETE FROM materialliste WHERE Artikelnummer = ?",(Artikelnummer,))


def save():
    connection.commit()
    connection.close()

def donotsave():
    connection.close()

def createdatabase(name):
    if os.path.isfile(name) is True:
        return(1)
    else:
        connection = sqlite3.connect(name+".db")
        cursor= connection.cursor()
        sql_command = """
        CREATE TABLE IF NOT EXISTS materialliste (
        Artikelnummer INTEGER(15),
        Hersteller VARCHAR(20),
        Artikelbezeichnung VARCHAR(30),
        PreisEK REAL,
        PreisVK REAL
        );"""
        cursor.execute(sql_command)
        save()

def open(name):
    global connection
    connection = sqlite3.connect(name)
    global cursor
    cursor = connection.cursor()
    
    
def editdb(artikelnummer,Artikelbezeichnung=0,Hersteller=0,PreisEK=0,PreisVK=0):
    if Artikelbezeichnung != 0:
        cursor.execute("UPDATE materialliste SET Artikelbezeichnung = ? WHERE Artikelnummer = ?", (Artikelbezeichnung,artikelnummer))
    if Hersteller != 0:
        cursor.execute("UPDATE materialliste SET Hersteller = ? WHERE Artikelnummer = ?", (Hersteller,artikelnummer))
    if PreisEK != 0:
        cursor.execute("UPDATE materialliste SET PreisEK = ? WHERE Artikelnummer = ?", (PreisEK,artikelnummer))
    if PreisVK != 0:
        cursor.execute("UPDATE materialliste SET PreisVK = ? WHERE Artikelnummer = ?", (PreisVK,artikelnummer))

dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

natürlich funktionieren meine ersten Versuche der Gui bereits nicht....ich möchte einen Button Save welcher aber nur erscheint wenn einen Datenabnak geöffnet ist und folglichermassen Open in position und größe ersetzt... allein das funktioniert schon nicht. . .

Code: Alles auswählen

if "connection" not in dir(sqlite3):
    openbt=tkinter.Button(master=fenster, text="Open", command=lambda : tkinter.filedialog.askopenfilename())
    openbt.pack()
    if "connection" in dir(sqlite3):
        openbt.destroy()

if "connection" in dir(sqlite3):
    savebt=tkinter.Button(master=fenster, text="Save", command=save)
    savebt.pack(side="LEFT")

fenster.mainloop()
PS: Warum ist eigentlich die Zeit um Einträge zu editieren so kurz. könnte mnan das nicht einfach solange ermöglichen bis die nächste Antwort geschrieben wurde?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dannyboy385: Du benutzt in allen Deinen „Funktionen“ globale Variablen, nicht nur in »open«. In editdb benutzt Du 0 als Platzhalter für „keinen Wert“. Dafür gibt es aber schon None.
dannyboy385
User
Beiträge: 39
Registriert: Freitag 27. November 2015, 21:24

Sirius3 hat geschrieben:@dannyboy385: Du benutzt in allen Deinen „Funktionen“ globale Variablen, nicht nur in »open«. In editdb benutzt Du 0 als Platzhalter für „keinen Wert“. Dafür gibt es aber schon None.
Ok das habe ich im Code einmal geändert. Nur ist die verwendung von globalen Variablen doch eher unschön. Wie könnte man das vermeiden? Ich meinte damit auch die verwendung des befehls global. Das ganze ist ja leider alles andere als OO..
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das es nicht OO ist, ist doch deine Entscheidung. Das lässt sich doch alles problemlos in eine Klasse packen.
Antworten