![]() |
Temporäres TDataset
Hallo!
Ich will eine Datenbank etwa so abfragen (Vereinfacht):
Code:
Ich bin mir im klaren das:
{Query ist vom Typ TQuery}
Query.Sql:= 'SELECT ID, Abteilung FROM Abteilungen'; Query.ExecSql; Query.First; While not Query.EOF do begin Query.Sql:= 'SELECT Name, idAbteilung FROM Arbeiter WHERE idAbteilung='+Query.FielByName('ID').AsString; Query.ExecSql; { Werte benutzen } Query.Next; end; -Dieses beispiel mit Join gelöst werden könnte, -Die Prozedur nicht funktioniert, weil die Datenmenge des Querys in der Schlaufe geändert wird. Jetzt meine Frage: Wie kann ich ein "Temporäres" TDataset erzeugen? Denn so würde die Abfrage ja funktionieren:
Code:
Wie ist das zu realisieren?
{Query ist vom Typ TQuery}
{Dataset ist vom Typ TDataset} Query.Sql:= 'SELECT ID, Abteilung FROM Abteilungen'; Query.ExecSql; Dataset.Assign(Query); //<-- Geht nicht! Query.First; While not Dataset.EOF do begin Query.Sql:= 'SELECT Name, idAbteilung FROM Arbeiter WHERE idAbteilung='+Query.FielByName('ID').AsInteger; Query.ExecSql; { Werte benutzen } Dataset.Next; end; Oder gehe ich das Problem ganz falsch an? Hoffe wieder mal auf gute Tips :angle2: :stupid: |
Re: Temporäres TDataset
Hallo Fellmer LLoyd!
Funktioniert es nicht, wenn Du Dir eine neues (temporäres) TQuery erstellst und diesem das TQuery "Query" zuweist und das temporäre TQuery nach Gebrauch wieder freigibst? Etwa so:
Code:
Oder hab' ich trotz Planhirn das Thema verfehlt? Wenn nicht, und mein Vorschlag Dich weiter bringt, dann freut es mich, einem Alt-Mutanten geholfen zu haben... :mrgreen:
MyQuery := TQuery.Create(..);
: // Query vorbereiten und ausführen : MyQuery := Query; : // Deine Verarbeitung i. d. Schleife -> "Dataset" entspricht "MyQuery" : MyQuery.Free; Ad Astra! |
Re: Temporäres TDataset
Hmm... wird nicht einfach der Zeiger auf die selbe Adresse "gesetzt"?
Und müssen da unbedingt 10 Query's im Speicher liegen? :? Danke für den Tip! Fellmer :zwinker: |
Re: Temporäres TDataset
Zitat:
und eine für Tabelle Arbeiter. Es gibt keinen vernünftigen Grund hier eine temporäre Query zu verwenden, denn dann verzichtest auf alle Vorteile der "Klickedi-Klick" Programmierung. Also einfach 2 Queries (QryAbteilungen & QryArbeiter) aufs Formular/Datenmodul. Die QryArbeiter in der Schleife kannst du ja immer wieder neu verwenden oder noch besser mit einem Parameter versehen, den Parameter befüllen und erneut öffnen. |
Re: Temporäres TDataset
Das Beispiel ist stark vereinfacht.
Es ist also für jede "unterschlaufe" ein Query notwendig. Hmm, schade. |
Re: Temporäres TDataset
Zitat:
Deine Queries spiegeln die Struktur und Beziehungen deiner Datenbank wieder. In "meiner" Datenbank gibt es z.B. eine Mastertabelle mit 6 weiteren Detailtabellen. Also brauche ich 7 Queries, die in einander verschachtelt durchlaufen werden, um z.B. eine Ausgabedatei im XML oder EDIFACT Format zu erzeugen. Falls du mehrere Tabellen mit gleicher (oder fast gleicher) Struktur in deiner Datenbank hast, dann müssen bei dir allerdings die Alarmglocken läuten, da dein DB-Design dann falsch wäre. |
Re: Temporäres TDataset
Hmm...ich dachte nur der Geschwindigkeit wegen ginge es schneller :wink:
Da ich endlich einen anständigen DB-Server einsetze (MySQL), will ich auch alles richtig machen :thuimb: Aber wenn das^der richtige Weg ist :arrow: OK! |
Re: Temporäres TDataset
Etwas ist mir immer noch nicht ganz klar.
Funktioniert das so? (Das Query der Prozedur wird freigegeben)
Delphi-Quellcode:
Hoffe auf Aufklärung :warn:
{ Abfrageprozedur }
function Abfrageirgendwas: TDataSet; var Query: TQuery; begin Query:= TQuery.Create(Nil); try //Abfrage ausführen Result:= Query; finally Query.Free; end; end; procedure TFormMain.ButtonAbfrageClick(Sender: TObject); var Query: TQuery; begin Query:= TQuery.Create(Nil); try Query:= Abfrageirgendwas; { Enthält das Query immenoch die Daten? } finally Query.Free; end; end; |
Re: Temporäres TDataset
Hi Fellmer,
sorry für die Verspätung, mir kam 'ne Drangwäsche dazwischen :mrgreen: Zu Deiner letzten Frage: Ich denke, nein, denn das Result der Funktion ist zum Ersten lokal in der Funktion definiert und zum Zweiten schießt Du's ja im finally weg! Wäre es nicht besser, die temporären Queries global zu halten? :gruebel: Ich weiß: globale Definitionen sind immer wenig elegant, aber in diesem Fall (denke ich) angebracht. |
Re: Temporäres TDataset
Dann bräuchte ich ja ein dynamisches, globales Array von TQuerys, dass noch über mehrere Units :pale:
Wibt es keine Möglichkeit das Query zu "kopieren"? Query.Assign funktioniert ja auch nicht :| { Och ned schon wieder Drangwäsche, Tolotos :wink: } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz