Verknüpfung zweier DataSources



  • Hi,

    wenn ich zwei TTables habe, kann ich die eine ja automatisch mit der anderen durch MasterSource verbinden.

    Nun habe ich aber zwei TQuerys. Wie funktioniert es da? Da habe ich kein Mastersource. Auch wenn ich ein TQuery und ein TTable verwende, kann ich in dem TTable nicht das Query als MasterSource verwenden.

    WIe kann ich also zwei Tabellen verknüpfen, wobei eine Komponente ein Query ist?

    DANKE!

    strauberry



  • Ist die Frage unklar?



  • strauberry schrieb:

    Ist die Frage unklar?

    Scheint so...

    Gruß,

    Alexander



  • Ok dann versuche ich es mal etwas ausführlicher:

    Ich habe zwei verschiedene Tabellen (DB-Dateien). Die eine enthält Personendaten und hat ein Feld ID_PERSONENDATEN.

    Die andere Datei enthält Informationen zu den einzelnen Personen. Diese Tabelle hat ebenfalls ein Feld ID_PERSONENDATEN, mit dem die Daten später den oben genannten Personendaten zugeordnet werden wollen.

    Soweit die Situation.

    Nun kann ich das entweder so machen, dass ich das bei jedem Wechsel mittels DBNavigator (also beim "Weiterschalten" zum nächsten Datensatz) manuell auslese oder aber - und darum dreht sich meine Frage - ich mache es automatisch (Bei DBNavigator nbNext werden automatisch die dazugehörigen Dateien angezeigt).

    Wenn ich zwei TTable verwende, kann ich in einem TTable die andere als MasterSource angeben. Über MasterFields kann ich dann die Indexes, die ich bei der Personen-DB eingerichtet habe dafür verwenden, die beiden zu Verknüpfen.
    Schalte ich dann per DBNavigator bei den Personendaten weiter, wird bei den Zusatzinfos automatisch alles zu der jeweiligen Person angezeigt (ist ja auch über ID_PERSONENDATEN verknüpft).

    Wenn ich jetzt aber eine Query mit im Spiel habe, funktioniert das leider nicht mehr... Ein MasterSource gibt es nicht und die Indexes, die ich bei den tabellen erstellt habe, kann ich auch nicht verwenden.

    Ist Params dabei eine Lösung?

    DANKE!!!



  • Wenn ich Dich jetzt richtig verstanden habe, hast Du zwei Tabellen die in einer Master-Detail-Beziehung stehen.
    Ich weiß nicht, ob es ein Möglichkeit gibt die beiden Queries über eine graphische Programmierung miteinander zu verbinden.
    Mein Weg wäre im AfterScroll-Ereignis der Master-Query das Detail-Query nachzuziehen. Dabei könntest Du auch Parameter verwenden.
    Irgendwo - entweder in der IDE oder im Code - sollte dem DetailQuery ein Statement in der Form

    SELECT * FROM <meine_detail_tabelle> WHERE id_personendaten = :PARAM_ID_PERSONENDATEN
    

    stehen. Prepared sollte dann auch auf true stehen.
    In der AfterScroll-Methode könnte dann so etwas stehen:

    void __fastcall TWasWeissIchWas::MasterQueryAfterScroll(TDataSet* DataSet)
    {
       DetailQuery->Active = false;
       DetailQuery->ParamByName("PARAM_ID_PERSONENDATEN")->AsInteger = MasterQuery->FieldByName("ID_PERSONENDATEN")->AsInteger;
       DetailQuery->Active = true;
    }
    

    Wenn Du beispielsweise nur ein Feld aus einer anderen Tabelle anzeigen willst, z.B. Deine Master-Tabelle hat ein Feld vom Typ int
    und Deine andere Tabelle hat zu jedem int-Wert eine Bezeichnung als String gespeichert, kannst Du auch persistente Felder verwenden.
    Mit einem Lookup-Feld kannst Du dann sozusagen eine Übersetzung der int-Wert auf Texte vornehmen. Das geht übrigens auch zur Lauf-
    zeit.

    Gruß,

    Alexander



  • Hi,

    genau sowas hatte ich gesucht, danke 🙂

    Jetzt gibt es nur noch ein Problem beim Compilieren...

    Im DetailQuery habe ich zur Entwicklungszeit folgendes SQL:

    SELECT * FROM DetailQuery WHERE ID_PERSONENDATEN = :PARAM_ID_PERSONENDATEN

    Im DetailQuery finde ich im Objekt-Inspektor unter "Params" folgendes:
    PARAM_ID_PERSONENDATEN
    Als DataType integer und ParamType Input (Wieso kann ich hier eigentlich zur Entwicklungszeit keine neuen anlegen?)

    In das AfterScroll-Event des Master habe ich folgendes gepackt:

    Detail->Active = false;
       Detail->ParamByName("PARAM_ID_PERSONENDATEN")->AsInteger = Query_Personendaten->FieldByName("ID_PERSONENDATEN")->AsInteger;
       Detail->Active = true;
    

    Wenn ich jetzt aber compiliere, erscheint eine BDEException:

    Detail: Parameter "PARAM_ID_PERSONENDATEN" nicht gefunden

    Was ist noch falsch?



  • Vielleicht hilft es, Prepared auf true zu setzen oder wahlweise Prepare() aufzurufen.
    Ansonsten wäre es natürlich noch möglich, dass Deine verwendete Datenbank parametrisierte Statements nicht unterstützt.
    Dann könntest Du Dir immen noch helfen, indem Du das Statemtent jedes mal neu zusammenbaust, was bei integer-Feldern nicht so kritisch ist.
    Bei String-Feldern kann es da schon eher zu Problemen kommen (z.B. mit Hochkommas im String).

    Das mit dem Prepare() könnte so aussehen:

    Detail->Active = false;
       Detail->Prepare();
       Detail->ParamByName("PARAM_ID_PERSONENDATEN")->AsInteger = Query_Personendaten->FieldByName("ID_PERSONENDATEN")->AsInteger;
       Detail->Active = true;
    

    Du kannst natürlich auch mal im Debugger schauen, ob die Parameter überhaupt angelegt wurden.

    Gruß,

    Alexander


Anmelden zum Antworten