AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TDataSet, TQuery -- wie auf Zellen zugreifen?
Thema durchsuchen
Ansicht
Themen-Optionen

TDataSet, TQuery -- wie auf Zellen zugreifen?

Ein Thema von Frederika · begonnen am 28. Jan 2009 · letzter Beitrag vom 30. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Frederika

Registriert seit: 28. Jan 2009
81 Beiträge
 
#1

TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 28. Jan 2009, 21:59
Datenbank: db • Version: ? • Zugriff über: BDE TQuery
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 28. Jan 2009, 22:04
Zitat:
Ist ja super unpraktisch, sich mit dem First, Next durchzuhangeln...
Es handelt sich nunmal ume eine (Daten-)Menge.
im Notfall kann man ja einen Filter verwenden.
Zitat:
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?
Und natürlich die DataBase oder Connection Komponente und je nach DBMS/Bibliothek noch Komponenten zur Transaktionssteuerung.
Markus Kinzler
  Mit Zitat antworten Zitat
Frederika

Registriert seit: 28. Jan 2009
81 Beiträge
 
#3

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 28. Jan 2009, 22:35
Zitat:
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?
Und natürlich die DataBase oder Connection Komponente und je nach DBMS/Bibliothek noch Komponenten zur Transaktionssteuerung.[/quote]
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 06:15
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
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 07:09
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:
For i:=1 to Dataset.RecordCount do
  Work (Dataset.Record[i,'Fieldname']) // <<--- fiktive Eigenschaft
oder
Delphi-Quellcode:
Dataset.first;
While not Dataset.Eof do Begin
  Work (Dataset['Fieldname']);
  Dataset.Next;
End;
schreibe, ist doch egal (bis auf die Anzahl der Codezeilen).

Wenn Du partout als Matrix auf eine Datenmenge zugreifen willst, erstelle Dir eine eigene Klassenwrapper, der diese Funktionalität bereitstellt:
Delphi-Quellcode:
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;
Ob Dir das etwas bringt, sei mal dahingestellt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Frederika

Registriert seit: 28. Jan 2009
81 Beiträge
 
#6

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 11:34
Zitat von alzaimar:
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?
Hm, na gut, wahrscheinlich stehe ich noch so weit außerhalb, daß ich noch nicht wie ein Datenbänkler denke. :-) Ich geh mal davon aus, daß sich das millionenfach bewährt hat und somit auch für mich Ok sein wird. Dennoch scheint es jeder normal zu finden, daß man TDataSet als TDBGrid darstellen kann, also visuell schon eine X,Y-Tabelle sieht, aber es scheint ziemlich außergewöhnlich zu sein, auch intern genau so zuzugreifen. Kommt mir seltsam vor, da ich mir die Daten immer als Tabelle vorstelle. Ich gebe aber zu, dass auch für meinen Zweck der zeilenweise Zugriff wohl völlig Ok ist. War ich wohl etwas verspannt...

Zitat:
Wenn Du partout als Matrix auf eine Datenmenge zugreifen willst, erstelle Dir eine eigene Klassenwrapper, der diese Funktionalität bereitstellt:
Danke für Deine Mühe. Ich sehe jetzt auf jeden Fall schon viel klarer, dass man zeilenweise einfach zugreifen kann und notfalls eben auch maxtrixähnlich. Wobei man scheinbar die Feldnamen irgendwoher wissen muß?

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!
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 19:35
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 21:55
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 22:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: TDataSet, TQuery -- wie auf Zellen zugreifen?

  Alt 29. Jan 2009, 23:36
Zitat von Frederika:
... Wobei man scheinbar die Feldnamen irgendwoher wissen muß? ...
Ja und Nein
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 von Frederika:
... 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...
So hatte ich Dich in dem anderen Thread (ODBC und SP) auch verstanden
Zitat von Frederika:
Danke!
you're welcome
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz