![]() |
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 ist kompatibel zur BDE. (
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 ![]() Danke. |
AW: Abfrage mittels SQL - Ergebnis?
MIt FieldByName
Absquery1.FieldByName(Spaltenname).Asxxx |
AW: Abfrage mittels SQL - Ergebnis?
da das Ergebnis aus nur einem Feld besteht:
Delphi-Quellcode:
ABSQuery1.Fields[0].Value
|
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)?
|
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).
|
AW: Abfrage mittels SQL - Ergebnis?
sinnvollerweise verpasst Du der Aggregatergebnis einen Alias.
Code:
Dann funktioniert ein FieldbyName über den Alias hier: Nettoumsatz.
select sum(netto) as Nettoumsatz von irgendwas
Sonst über Fields[0]. |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
|
AW: Abfrage mittels SQL - Ergebnis?
Danke für die Antworten.
Delphi-Quellcode:
Das ergibt dann also den einzelnen gefundenen Wert. Aber einen Zugriff auf die anderen Daten dieses Records bekomme ich damit nicht?
ABSQuery1.Fields[0].Value
LG |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
SQL-Code:
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?
SELECT MAX(KUNDENNUMMER) from dbKunden;
Wenn die Kundennummer eindeutig ist, kannst du das Ergebnis ja als Parameter einer anderen Query
SQL-Code:
verwenden, die dir dann alle Felder dieses Records liefert.
SELECT * FROM dbKunden WHERE KUNDENNUMMER = :KdNr
|
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 :-) |
AW: Abfrage mittels SQL - Ergebnis?
Hallo,
liefert eben keinen Record Doch, genau einen Rekord mit einem Feld. *krümelkacker" aus ;) |
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 |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
|
AW: Abfrage mittels SQL - Ergebnis?
SQL-Code:
select top 1,1 * from dbKunden order by KUNDENNUMMER desc;
|
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
Dann hatte ich den Datensatz, den ich benötigte. LG |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
LG :-) |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
Aber egal. Wenn die Query
SQL-Code:
ist, dann funktioniert das Locate dort auch so. Bei
SELECT * FROM dbKUNDEN
SQL-Code:
kommen die Daten sogar sortiert an. Dann wäre ein
SELECT * FROM dbKUNDEN ORDER BY KUNDENNUMMER
Delphi-Quellcode:
ausreichend um den Datensatz mit der höchsten Kundennummer auszuwählen.
ABSQuery1.Last
|
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 :-) |
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
|
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.
|
AW: Abfrage mittels SQL - Ergebnis?
Zitat:
|
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.
|
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 07:42 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