Verständnisfrage: DBGrid und Anzeige der Daten im seperaten Forum (Ergänzt)
-
Hi,
vorweg: Ich möchte mir eine Film Verwaltung bauen. Dazu habe ich eine Datenbank mit mehreren Tabellen.
DB Tabellen
1.) "Profil"
2.) "Sub-Profile"
3.) "Video Kategorie"
4.) "Sub-Videos"Die Tabellen indexiere ich via "ID"s, bzw. ich in den Tabellen weiß, welche Daten zu welchem Profil bzw. Kategorie gehört.
Das "Profil" kann man sich als eine Art "Multiuser" vorstellen.
1.) Dem "Profil" kann man mehrere "Sub-Profile" zuweisen.
2.) Dem "Sub-Profile" weise ich x Videokategorien zu.
3.) Den Videokategorien weise ich x Videos zu.
4.) Den Videos weise ich zusätzliche Daten zu. (stehen in einer seperaten Tabelle)Beispiel anhand Serien zur Veranschauung.
Profile 1: Deutsch
Profile 2: EnglischProfile 1 weise ich Subs zu: Serien (Sub1)
Profile 2 weise ich Subs zu: Serien (Sub2)Also insgesamt 2 Sub-Profile. (wegen Beispiel nur 2 zur vereinfachung)
Sub1 weise ich Video-Kategorie zu: Seifen (Kategorie1)
Sub2 weise ich Video-Kategorie zu: Action (Kategorie2)Video-Kategorie1 weise ich "Lindenstraße" zu. (das ist nur ein Beispiel, ich schau das nicht! :D)
Video-Kategorie2 weise ich "Breaking Bad" zu.Wegen vereinfachnung nur 2 Kategorien bzw. Serien.
Den Serien weise ich dann die einzelnen Episoden zu.
Ich hoffe, du konntest mir bis hierhin folgen
So...
Im Hauptformular habe ich ein DBGrid das via DataSet/SQL Query gefüllt wird. Dabei wird gleichzeitig auch sortiert. Dieses DBGrid enthält eine Liste aller Serien, unabhängig dem Profile bzw. Sub-Profile. Im Beispiel oben wären das also zwei Serien (Lindenstraße + Breaking Bad).
Im DBGrid habe ich zwei Datenfelder. "ID" und "Video Name". Das Feld für "ID" wird nicht angezeigt und die vertikale Scrollbar wird auageblendet. Im Hauptformular habe ich auch ein ListView im Icon Modus, das wird anhand den Daten des DBGrids gefüllt. Wenn ich im DBgrid einen Eintrag auswähle, wird der Eintrag im Listview ebenfalls ausgewählt bzw. hervorgehoben. Deswegen habe ich auch im DBGrid die versteckte "ID", weil ich nicht weiß, wie ich sonst an die eigentliche ID in der DB rankomme, weil die Ausgabe ja sortiert wird. Die Lösung erschien mir als die einfachste, ohne das ich immer wieder in der DB nach dem Video-Titel suchen muss, also anstatt per Schleife durch die DB zu gehen oder "Locate" zu benutzen. Wie macht das?
Wenn ich im DBGrid einen Doppelklick mache, möchte ich ein Fenster öffnen, welches die Stammdaten zu "Breaking Bad" anzeigt, dazu möchte ich ein Tabsheet benutzen. Das zur Laufzeit zu füllen, ist kein Problem - in der Theorie.
Mein Problem liegt beim öffnen des seperaten Fensters, da ich nicht weiß, bzw. nicht verstehe, wie ich das machen muss, damit ich die Daten auch gleichzeitig bearbeiten kann - sofern notwendig. Wenn ich 2 Query's benutze, kann ich zwar das ergebnis auslesen und die einzelnen Tabs generieren, aber wenn ich dann Daten ändern will.... ->
Was ich meine ist: Wie muss ich das machen, damit ich das Fenster mit "Breaking Bad" öffnen kann wegen der verknüpften ID?
Ich habe ja die Tabellen via IDs verknüpft, also ich habe in den Tabellen Felder für IDs. Muss man das wie bei einem Nested ClientDataset verknüpfen? Das habe ich mal vor paar Jahren mit einem ClientDataset ausprobiert. Allerdings benutze ich die AbsoluteDatabase von ComponentAce.
Hoffe es ist einigermaßen klar was ich erreichen möchte!
Vielen Dank im voraus!
-
Nee, so wirklich klar geworden ist mir nicht, wo das Problem ist...
Aber falls ich es richtig verstehe, könnte die Lösung die Verwendung von Update-/Insert-Statements sein.
-
Anders ansgedrückt: (runtergebrochen auf das minimalste, ohne Profil etc., weil das scheinbar verwirrt)
Ich habe eine Datenbank mit mehreren Tabellen: bspw. für Serien
- Tabelle 1 "Serien " mit Feldern: ID, Video_Titel, Seasons
- Tabelle 2 "Staffeln" mit Feldern: ID, SerienID, Season, EpisodeAnzahl
- Tabelle 3 "Episoden" mit Feldern: ID, SeasonID, FolgenTitel und diverse andereEingetragene Serien, bspw:
- Breaking Bad
- Supernatural
- Akte XMainForm enthält:
- ABSTable1->MasterSource = DataSource_Profile;
- Diverse weitere Table und DataSource die miteinander verknüpft sind (an der Stelle egal, weil es dem selben Prinzip folgt (Serie->Staffel->Folge(n))
- DataSource_Alle_Serien->DataSet = Tabelle1;
- Query1->DataSource = DataSource_Alle_Serien;
- DataSource1->DataSet = Query1;
- DBGrid1->DataSource = DataSource1;
DetailForm enthält:
DBEdit1->DataSource = DataSource_Alle_Serien;
DBEdit1->DataField = Video_Titel;DBEdit2->DataSource = DataSource1;
DBEdit2->DataField = Video_Titel;Im MainForm habe ich einen Query, der holt sich die Daten aus Tabelle1 (Serien), sortiert sie, angezeigt werden sie im DBGrid.
Doppelklick auf einen Eintrag im DBGrid öffnet das DetailForm.
Im Detailform will ich anzeigen: (in einzelnen Tabs)
Serienname und die erfassten Stammdaten
DBEdit1 funktioniert und der Serienname wird angezeigt. Allerdings kann ich den Text nicht bearbeiten, was wohl am Query liegen dürfte.
Hier brauche ich wohl ein Update-Statement, oder? Kann man das auch direkt verknüpfen? Wenn ich die Tabelle direkt öffne, kann ich das Feld zwar bearbeiten und es wird auch gespeichert (sofern ich Post() aufrufe), allerdings wird nicht der Datensatz angezeigt den ich will.
Möchte ich bspw. die Stammdaten von "Supernatural" anzeigen/bearbeiten, wird mir "Breaking Bad" angezeigt.
Habe in dem Fall nur das Feld der "ID" welche vergeben wird, wenn die Serie eingetragen wird (ID hat AutoInc). Diese "ID" lese ich via DBGrid (DBGrid1->Fields[ 0 ]->AsInteger) aus, weil ich es nicht anders hinbekommen habe. Die Spalte wird im DBgrid nicht angezeigt. Diese ID stimmt natürlich nicht mit dem RecNo? der Datenbanktabelle überein (via DataSource->DataSet->RecordNo kann man den ja auslesen)
DBEdit2 ist nicht editierbar, dafür wird die richtige Serie angezeigt.
Hoffe das es jetzt klar ist...