DBLookUpComboBoc + DBLookUpListBox



  • Hallo,
    nachdem ich nun schon ewig or diesem Problem verbracht habe und es noch immer nicht verstehe, hofe ich jemanden hier zu finden, der mir weiterhelfen kann.

    Ich habe drei Tabellen:

    1. Tabelle Kunden (mit Kunden_Nr + Detail Infos zu Kunden)
    2. Tabelle Listen (mit Listen_Nr + Details zu Listen)
    3. Tabelle Kunden_Nr, Listen_Nr mit Foreign Keys auf die erste und zweite Tabelle (welcher Kunde dar mit welcher Liste arbeiten)

    Nun möchte ich gerne in einer DBLookUpComboBox den Kunden auswählen und dazu gehörig alle diesem Kunden gehörenden Listen in einer DBLookUpListBox angezeigt bekommen.

    Ich habe nun schon ewig darn gesessen und es funktioniert einfach nicht richtigm die logische Verknüpfung zu hinterlgen in den beiden Komponenten.

    Kann mir jemand sagen, wie ich Listsource, ListField, KeyField, Daasource, DataField, MasterSource, Masterfield defenieren muss, damit s funktoniert.

    Ich habe nun auch schon die Hilfe x mal durchgelesen, deren kurze Erläuterung bringt mir die Funktionsweise aber nach wie vor nicht ans Licht.



  • Also ich habe von DBLookUpListBox keine Ahnung, kann aber zwei Wege angeben, wie ich es immer löse.
    1. Wenn es nicht zuviele Listen gibt, wäre es vllt einfacher, alle Listen aller Kunden in einem zweiten DataSet zu laden und bei Auswahl eines Kunden nach diesen in der Listenmenge zu filtern. Wenn beispielsweise zwei Combolistboxen Kunde, Liste exisieren, könnte man im DropDown-Ereignis der Listen-Combobox schauen ob ein Kunde gewählt ist und dann in der Listdatenmenge nach diesem filtern. Also bei TSQLClientDataSet Filtered = true; Filter = "kunde=" + kundennr; ImCloseUp-Ereignis dann den Filter entfernen.
    Jetzt ist es natürlich problematisch, dass diese Relationen in n:m-Beziehung stehen. Hierzu könnte man - falls tatsächlich sich mehrere Kunden dieselben Listen teilen sollen und deshalb n:m gewählt wurde - im Anwendungsprogramm oder in einer Stored Function in der DB - die dazugehörigen Kundenschlüsselwerte in die Liste nachtragen:

    listid  listname  kundenreferenz
    ----------------------------------
      2     Liste 1   .12.13.17.20.
      5     Liste 2   ..
      6     Liste 3   .12.17.
    

    Also die Fremdschlüssel des Kunden, die diese Liste besitzen, programmtechnisch als String dranbauen. Dann kann als Filter sowas wie kundenreferenz LIKE '%.12.%' gewählt werden.

    2. Man kann diesen Master/Detail-Lookup auch den DataSets aufdrücken (ich kenne das aber nur mit TSQLClientDataSet). Das scheint aber fehlerhaft zu sein (VCL in BCB6) und muss mit einem Workaround verwendet werden. Das Detail-TSQLClientDataSet bekommt als MasterSource eine TDateSource, dessen DataSet das Master-TSQLClientDataSet ist. Dann kann die Property MasterFields zugewiesen werden. Der Bug besteht nun darin, dass er den Primärschlüsselnamen mit den Fremdschlüsselnamen vertauscht, so dass eine DB-View erstellt werden muss, die den Schlüsselnamen entsprechend umbenennt, so dass ein Natural Join entsteht.



  • Hallo,
    danke für deine Antwort.

    Ich habe mir nun auch damit beholfen, dass ich es von Hand programmiere. Ich ermittle mittels eines SELECT statements die Daten und fülle die ListBox von Hand.

    Ich hatte gehofft, die Funktionalität von den DBLookUp Komponenten nutzen zu können. Aber irgendwie funktioniert das nicht.

    Aber egal. Ich komme jetzt wenigstens weiter.

    Gruss Christian



  • christian_gnoth schrieb:

    Ich habe mir nun auch damit beholfen, dass ich es von Hand programmiere. Ich ermittle mittels eines SELECT statements die Daten und fülle die ListBox von Hand.

    Ja, dürfte auf Dauer auf die zuverlässigere Methode sein. Insbesondere wenn die Datenbestände großer werden, können solche mehrfach abhängigen Tabellen sehr langsam beim Datensatzwechsel werden.
    Wenn Du es manuell machst, kannst Du die abhängigen Tabellen einfacher abhängen und zB verzögert wieder anhängen. Oder dem User die Möglichkeit geben, zu entscheiden, ob er zur Zeit die Detaildatensätze sehen will, oder nicht.

    christian_gnoth schrieb:

    Ich hatte gehofft, die Funktionalität von den DBLookUp Komponenten nutzen zu können. Aber irgendwie funktioniert das nicht.

    Nein, das funktioniert ganz und gar nicht wie erwartet. Ehrlich gesagt habe ich dies in der von Dir gewünschten Form ebenfalls nicht realisieren können.


Log in to reply