Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage mittels SQL - Ergebnis? (https://www.delphipraxis.net/210414-abfrage-mittels-sql-ergebnis.html)

NoGAD 21. Apr 2022 08:43

Datenbank: ABSDatabase • Version: 7.93 • Zugriff über: ABSQuery

Abfrage mittels SQL - Ergebnis?
 
Hallo.

Wenn ich eine SQL Abfrage ausführen lasse, wie komme ich dann an das Ergebnis der "Suche"?

Bsp:

Delphi-Quellcode:
  ABSQuery1.SQL.Text := 'SELECT MAX(KUNDENNUMMER) from dbKunden;';
  ABSQuery1.Open;
  // Hier benötige ich nun den Datensatz, der gefunden wurde
  // Ich benutze kein visuelles Element, um die Daten anzuzeigen
  // weil ich nur den RecNo und die Daten des aktuellen Record benötige
ABSQuery1 ist kompatibel zur BDE. (http://www.componentace.com/help/abs...fromthebde.htm)

Danke.

stifflersmom 21. Apr 2022 08:46

AW: Abfrage mittels SQL - Ergebnis?
 
MIt FieldByName
Absquery1.FieldByName(Spaltenname).Asxxx

mkinzler 21. Apr 2022 08:57

AW: Abfrage mittels SQL - Ergebnis?
 
da das Ergebnis aus nur einem Feld besteht:

Delphi-Quellcode:
ABSQuery1.Fields[0].Value

Maliko 21. Apr 2022 10:56

AW: Abfrage mittels SQL - Ergebnis?
 
Wie sieht das in dem Fall eigentlich aus, weil da ja ne Aggregatfunktion ist? Ich verpasse dem dann immer nen Alias, daher hab ich da bisher nicht groß nachgedacht, aber was ist jetzt eigentlich der Spaltenname wenn ich mit FieldByName den Wert abfrage? kundennummer oder max(kundennummer)?

mkinzler 21. Apr 2022 10:59

AW: Abfrage mittels SQL - Ergebnis?
 
Deshalb ja mein Vorschlag über den Index 0. Sonst auf jeden fall einen Alias vergeben, den der automatische vergebene Namen für das Aggregat unterscheidet sich je nach Zugriffsbibliothek (DBMS).

stifflersmom 21. Apr 2022 10:59

AW: Abfrage mittels SQL - Ergebnis?
 
sinnvollerweise verpasst Du der Aggregatergebnis einen Alias.
Code:
select sum(netto) as Nettoumsatz von irgendwas
Dann funktioniert ein FieldbyName über den Alias hier: Nettoumsatz.
Sonst über Fields[0].

Union 21. Apr 2022 14:00

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von NoGAD (Beitrag 1504822)
ABSQuery1 ist kompatibel zur BDE. (http://www.componentace.com/help/abs...fromthebde.htm)

Hoffentlich nicht. Vielleicht meintest Du dass es sich von TDataSet ableitet, aber eben nicht von TQuery. Steht ja in dem Link auch überall, "BDE Replacement".

NoGAD 21. Apr 2022 15:15

AW: Abfrage mittels SQL - Ergebnis?
 
Danke für die Antworten.


Delphi-Quellcode:
ABSQuery1.Fields[0].Value
Das ergibt dann also den einzelnen gefundenen Wert. Aber einen Zugriff auf die anderen Daten dieses Records bekomme ich damit nicht?

LG

Uwe Raabe 21. Apr 2022 15:23

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von NoGAD (Beitrag 1504876)
Das ergibt dann also den einzelnen gefundenen Wert. Aber einen Zugriff auf die anderen Daten dieses Records bekomme ich damit nicht?

Ein
SQL-Code:
SELECT MAX(KUNDENNUMMER) from dbKunden;
liefert eben keinen Record, sondern lediglich das Maximum eines Feldwerts. Wenn alle Feldwerte den selben Wert haben, dann wäre auch der das Maximum. Welche anderen Daten welchen Records würdest du dann erwarten?

Wenn die Kundennummer eindeutig ist, kannst du das Ergebnis ja als Parameter einer anderen Query
SQL-Code:
SELECT * FROM dbKunden WHERE KUNDENNUMMER = :KdNr
verwenden, die dir dann alle Felder dieses Records liefert.

NoGAD 21. Apr 2022 15:32

AW: Abfrage mittels SQL - Ergebnis?
 
Hallo lieber Uwe,

vielen Dank für den Hinweis.

Datenbanken sind für mich ein Gräuel, damit hadere ich seit Jahren herum, weil sich mir die Prinzipien nicht erklären.

LG :-)

hoika 21. Apr 2022 16:00

AW: Abfrage mittels SQL - Ergebnis?
 
Hallo,
liefert eben keinen Record

Doch, genau einen Rekord mit einem Feld.

*krümelkacker" aus ;)

NoGAD 21. Apr 2022 16:14

AW: Abfrage mittels SQL - Ergebnis?
 
Die Lösung von Uwe hat mir sehrr geholfen.

Dadurch kann ich nun auf den kompletten Record zugreifen.

Ich wusste einfach nicht, dass nach einem Select MAX(... der Record nicht alle Spalten ermöglicht.

Bisher hatte ich immer mit ABSTable gearbeitet.

LG

Uwe Raabe 21. Apr 2022 17:07

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von NoGAD (Beitrag 1504887)
Bisher hatte ich immer mit ABSTable gearbeitet.

Und wie hast du es da gemacht?

mkinzler 21. Apr 2022 17:19

AW: Abfrage mittels SQL - Ergebnis?
 
SQL-Code:
select top 1,1 * from dbKunden order by KUNDENNUMMER desc;

NoGAD 21. Apr 2022 21:29

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1504890)
Zitat:

Zitat von NoGAD (Beitrag 1504887)
Bisher hatte ich immer mit ABSTable gearbeitet.

Und wie hast du es da gemacht?

Mittels ABSTable1.Locate('KUNDEN', 'SUCHSTRING', []);

Dann hatte ich den Datensatz, den ich benötigte.

LG

NoGAD 21. Apr 2022 21:30

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von mkinzler (Beitrag 1504891)
SQL-Code:
select top 1,1 * from dbKunden order by KUNDENNUMMER desc;

Hallo Markus, kannst Du mir das bitte erklären, was diese Abfrage macht?

LG :-)

Uwe Raabe 21. Apr 2022 21:54

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von NoGAD (Beitrag 1504920)
Mittels ABSTable1.Locate('KUNDEN', 'SUCHSTRING', []);

Dann hatte ich den Datensatz, den ich benötigte.

Ich vermute mal, KUNDEN steht für KUNDENNUMMER und SUCHSTRING für die höchste Kundennummer? Dann musst du aber diese ja auch irgendwie ermitteln, oder?

Aber egal. Wenn die Query
SQL-Code:
SELECT * FROM dbKUNDEN
ist, dann funktioniert das Locate dort auch so. Bei
SQL-Code:
SELECT * FROM dbKUNDEN ORDER BY KUNDENNUMMER
kommen die Daten sogar sortiert an. Dann wäre ein
Delphi-Quellcode:
ABSQuery1.Last
ausreichend um den Datensatz mit der höchsten Kundennummer auszuwählen.

NoGAD 21. Apr 2022 22:54

AW: Abfrage mittels SQL - Ergebnis?
 
Hallo uwe,

danke für Deine Erklärung.

Mir ist ein Fehler bei meiner Antwort unterlaufen.

Bisher hatte ich das natürlich nicht mittels Locate gemacht, sondern ich bin alle Datensätze durchgegangen und habe mit dem jeweils nächsten abgeglichen und dann immer die höhere Kundennummer als neue Referenz benutzt:

Delphi-Quellcode:
var
 Dummy_MaxStr : String;
 Dummy_MaxInt: Integer;
begin

 Dummy_MaxInt := 0;
 ABSTable1.Open;
 ABSTable1.First;
 repeat
  Dummy_MaxStr := ABSTable.FieldByName('KUNDENNUMMER').AsString;
  if isinteger(Dummy_MaxStr) then
   if Dummy_MaxStr.ToInteger > Dummy_MaxInt then
    Dummy_MaxInt := Dummy_MaxStr.ToInteger;
  ABSTable.Next;
 until ABSTable1.EOF;

 ShowMessage(Dummy_MaxInt.ToString);


Das hatte ich bisher in etwa so gemacht, hatte aber bei einer großen Datenbank lange gedauert.

LG :-)

mkinzler 22. Apr 2022 06:41

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von NoGAD (Beitrag 1504921)
Zitat:

Zitat von mkinzler (Beitrag 1504891)
SQL-Code:
select top 1,1 * from dbKunden order by KUNDENNUMMER desc;

Hallo Markus, kannst Du mir das bitte erklären, was diese Abfrage macht?

LG :-)

Es sortiert die Kundennummern von groß nach klein und liefert dann den 1. Datensatz (höchster Wert)

Frickler 22. Apr 2022 08:16

AW: Abfrage mittels SQL - Ergebnis?
 
Da wäre es ja wesentlich einfacher (und vermutlich auch schneller) gewesen, einen Index auf die Kundennummer zu setzen und dann zum letzten Datensatz zu springen.

mkinzler 22. Apr 2022 08:29

AW: Abfrage mittels SQL - Ergebnis?
 
Zitat:

Zitat von Frickler (Beitrag 1504941)
Da wäre es ja wesentlich einfacher (und vermutlich auch schneller) gewesen, einen Index auf die Kundennummer zu setzen und dann zum letzten Datensatz zu springen.

In diesem fall schon. Ich vermute mal bei der Kundennummer ist dies schon der Fall. Aber allgemien macht es u.U. nicht unbedingt Sinn extra einen Index anzulegen.

NoGAD 22. Apr 2022 10:34

AW: Abfrage mittels SQL - Ergebnis?
 
Wegen des Index muss ich dich zugeben, dass ich noch nicht weiß, was dies bewirkt, noch wie die Struktur korrekt eingesetzt werden kann.

mkinzler 22. Apr 2022 10:38

AW: Abfrage mittels SQL - Ergebnis?
 
Ein Index beschleunigt die Suche. Ist wie ein Inhaltsverzeichnis über Spalteninformationen.

Dieser wird bei Abfragen verwendet. Bei "klassischen tabellenbasierten" datenbanksystemen war die Reighenfolge in der Tabelle in der Reihenfolge des Primärschlüssels.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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