SQL und wxWidgets

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich habe eine Untertabelle auftragsart. In dieser Tabelle gibt es zwei Spalten, in der ersten steht der Index und in der zweiten Spalte, die Auftragsbezeichnung. Die Auftragsbezeichnungen lese ich komplett aus und fülle damit eine wxComboBox. Nun stehen in der wxComboBox untereinander meine Auftragsbezeichnungen.
Allerdings sind die dann unbrauchbar wenn ich die Value von der wxComboBox auslesen muß denn ich bekomme ja nicht den Index wieder den ich auch in meiner Tabelle stehen habe. Ich frage mich also, ob ich beim füllen der wxComboBox auch meine Indexe aus der Tabelle mitgeben kann, damit ich den Eintrag besser in meinen SQL-Anweisungen packen kann.

Code: Alles auswählen

        '''
....
        ergebnis = cursor.execute ("""insert into auftraege 
            (uhrzeit, startdatum, serverip, auftragsname, verzloeschen,
            verznach, verzvon, auftragsart, intervall)
            values (?,?,?,?,?,?,?,?,?,?)""",
            (self.text_uhrzeit.GetValue (), self.text_startdatum.GetValue (),
            self.combo_serverip.GetValue ()) # serverip kommt aus einer untertabelle
        ''' 
...
Denn ich möchte in meiner Mastertabelle den Index (Schlüssel) von der Untertabelle (auftragsart) speichern und natürlich nicht den Klartext, die mir die wxComboBox in der Value zurück gibt. Im großen und ganzen würde ich eben dieser wxComboBox eine Art Index mit geben, aus meiner Untertabelle. ist so was möglich?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du bräuchtest einfach ein Model, welches neben den zu visualisierenden Daten auch den Key / Index enthält. Dies Models kannst Du dann z.B. in einer Liste verwalten und die Auswahl aus der ComboBox dann über den Index mit dem Datenobjekt in der Liste verknüpfen.

Kann man der ComboBox alternativ auch so ein generisches Model übergeben und das anzuzeigende Datenelement definieren? Ich kenne mich da mit wx im Speziellen nicht aus.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

ja genau, so was suche ich um den Schlüssel mitzugeben. Weiß allerdings auch nicht genau, wie und ob das in wx geht. Daher ja auch meine Frage ;)
Kennt denn jemand eine Lösung?
BlackJack

@The Hit-Man: Du kannst jedem Element auch noch ein Datum zuordnen. Das Strichwort ist "ClientData". Ich weiss gerade nicht aus dem Kopf, ob die Python-Anbindung da jedes Objekt erlaubt, oder ob Du die Daten in eine bestimmte Klasse verpacken musst.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

hmmm, so schwierig hatte ich mir das gar nicht vorgestellt. Ich dachte eher, das ich dem Objekt eine Art Array oder Liste zukommen lassen kann. Irgendwo, hatte ich doch auch gelesen, das ich einem ListControl ein Dictionary übergeben konnte. Aber nen ListControl ist ja irgendwo auch was ganz anderes.
BlackJack

@The Hit-Man: Was ist denn daran schwierig? Du übergibst beim `Append()` halt nicht nur den Text, sondern auch noch die Daten die dazugehören und lässt Dir dann später nicht den Text geben sondern den ausgewählten Index und dazu dann die Daten die dazu gehören.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

kann mir gerade nicht vorstellen, wie das aus sehen soll. den Append (), natürlich kenne ich. Sitze gerade nicht an dem Programmierrechner.
Würde das so aussehen?

Code: Alles auswählen

Append (index, "eintrag")
BlackJack

@The Hit-Man: Das würde eher so aussehen wie in der API-Dokumentation beschrieben:

wxPython: http://www.wxpython.org/docs/api/wx.Ite ... tml#Append
wxWidgets: http://docs.wxwidgets.org/stable/wx_wxc ... temsappend
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Sieht so aus, als hätte ich es dann hinbekommen:

Code: Alles auswählen

    def button_1_clicked(self, event): # wxGlade: MyDialog.<event_handler>
        self.combo_box_1.Append ("test", 1)
        #self.combo_box_1.SetClientData (1)

        self.combo_box_1.Append ("test2", 2)
        #self.combo_box_1.SetClientData (1)
        event.Skip()

    def button_2_clicked(self, event): # wxGlade: MyDialog.<event_handler>
        print self.combo_box_1.GetValue ()
        print self.combo_box_1.GetClientData (self.combo_box_1.GetSelection ())
        event.Skip()
Muß ich nur noch in eine Schleife packen, und mit Werten aus der Datenbank füllen. Sollte doch auch mit nem Listfeld gehen usw.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

The Hit-Man hat geschrieben:Muß ich nur noch in eine Schleife packen, und mit Werten aus der Datenbank füllen. Sollte doch auch mit nem Listfeld gehen usw.
Ich kenne mich mit WX nicht aus, aber bei Qt wird (vornehmlich) bei Listen und Tabellen zwischen item- und modelbasierten Views unterschieden. Erstere sind eigentlich nur für reine Stringdaten, ohne komplexes Objekt dahinter, geeignet. Letztere schöpfen das das MVC-Konzept voll aus und bieten sich daher prädestiniert für Probleme Deiner Art an. Man braucht da eben keine "Verrenkungen" a la "Indexübergabe fürs Mapping" mehr, sondern bastelt sich ein passendes Model, welches der View dann automatisch ohne weiteres Zutun korrekt darstellen und per Controller verwalten kann.

Evtl. gibt es so etwas auch bei WX - würde mich fast wundern, wenn dem nicht so ist. Evtl. schaust Du bei Listen und ähnlichen UI-Elementen erst einmal nach einer modelbasierten Lösung, bevor Du da etwas umständliches implementierst.

Qt bietet speziell für Datenbanken auch bereits spezialisierte Modelle an. Das ist natürlich extrem praktisch und evtl. gibt es für WX da ja auch Ansätze? (Ok, Qt hat ja eben auch ein eigenes SQL-Modul; es ist eben mehr als ein reines GUI-Toolkit)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Mit diesem MVC_Konzept habe ich noch nie etwas gemacht. Würde allerdings Sinn machen wenn man mit Datenbanken arbeitet. Muß aber ehrlich gestehen, habe mich damit nie wirklich auseinander gesetzt, oder sagen wir besser, ich habe es nie wirklich verstanden. Es gibt ja auch einige Toolkits für die Webprogrammierung und genau die, arbeiten nach diesem Prinzip, aber wie gesagt, habe das nie wirklich verstanden :(
Für die kleine Sache hier, komme ich wohl auch ohne aus.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Das hat doch nicht hin gehauen :(
def button_1_clicked(self, event): # wxGlade: MyDialog.<event_handler>
self.combo_box_1.Append ("test", 1)
#self.combo_box_1.SetClientData (1)

self.combo_box_1.Append ("test2", 2)
#self.combo_box_1.SetClientData (1)
event.Skip()

def button_2_clicked(self, event): # wxGlade: MyDialog.<event_handler>
print self.combo_box_1.GetValue ()
print self.combo_box_1.GetClientData (self.combo_box_1.GetSelection ())
event.Skip()
Ich finde allerdings auch keine Dokus über das ClientData. Kann mir da jemand weiter helfen?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Hier ist die API-Dokumentation: wx.ItemContainer.SetClientData()
ja, da war ich schon. Ich verstehe das nur nicht so ganz und hatte versucht ein Beispiel zu finden. Ich bin ja so weit gekommen. So fülle ich meine ComboBox:

Code: Alles auswählen

        # combobox intervall fuellen
        ergebnis = cursor.execute ("""select intervall_id, bezeichnung
            from intervall""")
        for row in ergebnis:
            self.combo_intervall.Append (row[1], row [0])
So, bekomme ich den Index-Wert zurück wenn ich etwas in der ComboBox gewählt habe, also, die intervall_id:

Code: Alles auswählen

print self.combo_intervall.GetClientData(self.combo_intervall.GetSelection())
das was mir jetzt noch fehlt ist, das nach dem Füllen auch der richtige Eintrag in der ComboBox angezeigt wird und genau das bekomme ich nicht hin. Mit einem SetSelection (x) funkioniert es leider nicht, da ich bei einem SetSelection (x), nicht meinen eigenen Index ansprechen kann :(
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

hmmm, niemand nen Vorschlag oder nen Beispiel? Wäre ja auch ne geniale Sache wenn man gleich das Result einer SQL Abfrage da rein packen könnte.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich habs dann mit sub-selects hin bekommen. Das ist zwar etwas umständlicher, aber muß ja fertig werden.

Code: Alles auswählen

"""insert into auftraege 
            (startuhrzeit, startdatum, serverip, auftragsname, verzloeschen,
            verznach, verzvon, auftragsart, intervall, max_dates, nextuhrzeit, nextdatum) 
            values 
            (?,?,
            (select id from esx_server where esx_server.server_ip=?),
            ?,?,?,?,
            (select auftragsart.auftragsart_id from auftragsart where auftragsart.bezeichnung=?),
            (select intervall.intervall_id from intervall where intervall.bezeichnung=?),
            ?,?,?)"""
Antworten