![]() |
Datenbank: db • Version: ? • Zugriff über: BDE TQuery
TDataSet, TQuery -- wie auf Zellen zugreifen?
Hallo! Eine kurze Frage eines absoluten Datenbank-Neulings: Kann man auf die Ergebnistabelle einer TQuery wirklich nur mit First, Next, Field usw zugreifen? Gibt es keine Möglichkeit, direkt wie in einem TSTringGrid mit Cells[x,y] zuzugreifen? Oder bin ich nur zu blöd? Ist ja super unpraktisch, sich mit dem First, Next durchzuhangeln...
Derzeit schaue ich mir die Ergebnisse in einem DBGrid an, aber sehe ich das richtig, daß man für nicht-visuellen Zugriff nur ein TQuery-Objekt braucht und das bereits auf eine Datenbank zugeifen, SQL ausführen und die Ergebnisse zur Verfügung stellen kann? Grüße, Frederika |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Zitat:
im Notfall kann man ja einen Filter verwenden. Zitat:
|
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Zitat:
Aha... :-( Hm, sagt mir jetzt nichts. Werde ich mir morgen früh dann anschauen. Ich dachte, daß man diesen ConnectionString einfach in der TADOQuery eintragen kann? Und was macht die Database-Komponente? Ist mir noch gar nicht begegnet. Na, ich lese jetzt erst einmal und spiele ein wenig rum, dann komme ich wieder! |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Wenn mehrere Zugriffskomponenten verwendet werden ist es sinnvoll die Datenbankverbindung zentral aufzubauen und nicht für jede Zugriffskomponente. Hierfür gibt es spezielle Komponenten. Bei Ado heisst sie m.W. TADOConnection
|
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Es ist sehr sehr selten nötig, aus unterschiedlichen Zeilen einer Datenmenge Informationen zu extrahieren. Fast immer interessiert dich immer nur eine Zeile (das ist der 'aktuelle Datensatz'). Wieso sollte man also in einer solchen Klasse die 'Matrixdarstellung' bereitstellen?
Im Übrigen kannst Du diese Zeile direkt durch setzen der Eigenschaft 'RecNo' anspringen, sodaß damit fast deinem Wunsch entsprochen wird. Du benötigt also kein First/Next. Trotzdem wirst Du nur selten finden, das mit einer For-Schleife durch eine Datenmenge iteriert wird. Ob man nun
Delphi-Quellcode:
oder
For i:=1 to Dataset.RecordCount do
Work (Dataset.Record[i,'Fieldname']) // <<--- fiktive Eigenschaft
Delphi-Quellcode:
schreibe, ist doch egal (bis auf die Anzahl der Codezeilen).
Dataset.first;
While not Dataset.Eof do Begin Work (Dataset['Fieldname']); Dataset.Next; End; Wenn Du partout als Matrix auf eine Datenmenge zugreifen willst, erstelle Dir eine eigene Klassenwrapper, der diese Funktionalität bereitstellt:
Delphi-Quellcode:
Ob Dir das etwas bringt, sei mal dahingestellt.
Type
TDatasetAsMatrix = Class (TDataset) private function GetAsMatrix(RecordNumber: Integer; Fieldname: String): Variant; procedure SetAsMatrix(RecordNumber: Integer; Fieldname: String; const Value: Variant); Public Property AsMatrix [RecordNumber : Integer; Fieldname : String] : Variant Read GetAsMatrix Write SetAsMatrix; End; function TDatasetAsMatrix.GetAsMatrix(RecordNumber: Integer; Fieldname: String): Variant; begin Self.RecNo := RecordNumber; Result := Self[Fieldname]; end; procedure TDatasetAsMatrix.SetAsMatrix(RecordNumber: Integer; Fieldname: String; const Value: Variant); begin Self.RecNo := RecordNumber; Self[Fieldname] := Value; end; // Zugriff geht über Typecast: Begin ShowMessage (TDatasetAsMatrix(MyQuery).AsMatrix[5,'MyFieldName']); End; |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Zitat:
Zitat:
Für mein Projekt muß ich einfach nur die Ergebnisdatenmenge komplett in eigene Objektstrukturen umwandeln. Ich greife wohl also zeilenweise einfach auf alle Datensätze zu (Deine while-Schleife) und erzeuge dabei eigene Objekte, die ich dann wieder wie gewohnt handhaben kann. Schnell ans rettende Ufer sozusagen... Danke! |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
sehe ich das richtig, dass du viel rechnen musst mit den Inhalten deines Grids?
Falls das so sein sollte, du also beispielsweise Matrixberechnungen durchführen musst, darfst du dich nicht zeilenweise durcharbeiten, das geht voll auf die Laufzeit. Und am schlimmsten ist es, wenn man dann noch die ach so einfache DBGrid-Darstellung wählt. Da wird dann auch noch Zeit damit verbraten, die Darstellung jeweils neu anzupassen, wenn man den Datensatz wechselt. Stattdessen ist es besser, mit dynamischen Arrays zu arbeiten. Da lassen sich dann alle Elemente direkt ansprechen. |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Ich glaube, es ist eine Umstellung eine Tabelle als Folge von in sich isolierten Zeilen (=Datensätze, Records) zu sehen, das ist alles. Frederika hatte wohl noch nicht all zu viel mit Datenmengen am Hut, aber irgendwann muss die Säge sägen. Die Zeilen werden ja in Objekte eingelesen. Schrieb sie zumindest.
|
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
was ich gesagt habe, gilt auch nur für den Fall, dass viel gerechnet werden muss, die Daten also beispielsweise irgendwelche Matrixinhalte darstellen.
Matrizen werden zwar auch in Zeilen und Spalten dargestellt, aber da braucht man den direkten Zugriff. Und wenn es langwierige Berechnungen sind, lässt man am besten auch alle Objekte außen vor. Geht aber wunderbar in Delphi! Einmal in dynamische Arrays eingelesen, und alles klappt. |
Re: TDataSet, TQuery -- wie auf Zellen zugreifen?
Zitat:
Du bekommst über TADOQuery auch die Feldnamen mitgeteilt, wissen musst du allerdings, was der Feldname bzw. das Feld/der Feldinhalt bedeuten soll ;) Mit dieser Funktion bekommst Du alle Feldnamen einer übergebenen Datenmenge geliefert. Als Parameter übergibst Du einfach Deine TADOQuery. Stör Dich nicht daran, dass Deine Abfrage ja gar nicht vom Typ TDataSet ist, diese wird aber davon abgeleitet und daher funktioniert das (OOP sei Dank).
Delphi-Quellcode:
// Akzeptiert als Parameter auch alles, was ein Nachfahr von TDataSet ist
// Beispiel-Aufruf: // ShowMessage( ListFieldNames( ADOQuery1 ) ); function ListFieldNames( DataSet : TDataSet ) : string; var FieldIndex : Integer; begin Result := ''; if DataSet.Active then // nur wenn die Datenmenge geöffnet ist! // Wir lesen jetzt mal alle vorhandenen Felder der Reihe nach aus for FieldIndex := 0 to DataSet.FieldCount - 1 do begin // Ist nur für die Kosmetik if ( FieldIndex > 0 ) then Result := Result + ';'; // Hier passiert es jetzt Result := Result + DataSet.Fields.FieldByNumber( FieldIndex ).FieldName; // <-- Da wird der Feldname geholt end; end; Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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