Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Grösste Kundennummer per SELECT wählen (https://www.delphipraxis.net/45869-groesste-kundennummer-per-select-waehlen.html)

hsbc 13. Mai 2005 11:19

Datenbank: Firebird • Version: 1.5.2 • Zugriff über: Delphi 7 Professional + Zeos-Lib.

Grösste Kundennummer per SELECT wählen
 
Hallo allerseits,

Gibt es eine Möglichkeit, per SELECT z.B. die größte Kunden-Nummer zu wählen. Ich probierte es wie folgt, aber leider klappt das nicht.

Delphi-Quellcode:
  T_KUNDEN.SQL.Text := 'SELECT * FROM KUNDEN WHERE KUNDENNR = ' +
    IntToStr(MAX(T_KUNDENKUNDENNR)) + ' ORDER BY KUNDENNR';
Ich habe irgendwo gelesen, dass es mit MAX funktionieren soll, aber leider. Wahrscheinlich kennt Firebird diese Funktion nicht.
Ich würde eine Möglichkeit suchen, die sowohl für Firebird, als auch für MSSQL funktioniert. Ich will aber nicht SELECT * verwenden, da es sich um mehrere Tausend Datensätze handeln kann.

Wenn es nichts passendes gibt, müsste ich wahrscheinlich mit SELECT ??? irgendeinen Datensatz anwählen und dann mit KUNDEN.Last zum letzten Datensatz gelangen.

mfg
Herbert

marabu 13. Mai 2005 11:22

Re: Grösste Kundennummer per SELECT wählen
 
Besser so:
SQL-Code:
T_KUNDEN.SQL.Text := 'SELECT MAX(KundenNr) AS MaxNr FROM Kunden'
Grüße vom marabu

phlux 13. Mai 2005 11:25

Re: Grösste Kundennummer per SELECT wählen
 
Hi!

Versuchs mal mit:
SQL-Code:
SELECT MAX(KUNDENNR) as 'Hoechste KundenNr' FROM KUNDEN GROUP BY KUNDENNR
MAX() geht nur zusammen mit GROUP BY meine ich mich zu erinnern.

mfg phlux :hi:

Stevie 13. Mai 2005 11:32

Re: Grösste Kundennummer per SELECT wählen
 
Zitat:

Zitat von phlux
MAX() geht nur zusammen mit GROUP BY meine ich mich zu erinnern.

Falsch erinnert. ;-)
Deine Abfrage würde alle Kundennummern zurückliefern, weil sich Max auf jede Gruppe bezieht und du nach Kundennummern gruppiert hast - welche mit Sicherheit unique sind.

MfG
Stevie

hsbc 13. Mai 2005 11:56

Re: Grösste Kundennummer per SELECT wählen
 
Hallo nochmals,

jetzt dürfte er zwar MAX kennen, aber jetzt kommt folgende Fehlermeldung:

Das Feld 'KUNDENNR' wurde nicht gefunden

obwohl KUNDENNR auch der PrimärIndex in der Tabelle T_KUNDEN ist.

Wie kann es so etwas geben?

mfg
Herbert

phlux 13. Mai 2005 12:17

Re: Grösste Kundennummer per SELECT wählen
 
Zitat:

Zitat von Stevie
Zitat:

Zitat von phlux
MAX() geht nur zusammen mit GROUP BY meine ich mich zu erinnern.

Falsch erinnert. ;-)
Deine Abfrage würde alle Kundennummern zurückliefern, weil sich Max auf jede Gruppe bezieht und du nach Kundennummern gruppiert hast - welche mit Sicherheit unique sind.

MfG
Stevie

ach ja stimmt, hab einfach übersehn, dass das feld unique ist.

@hsbc: cAsE SenSitiVe?

Edit: Ach ja wenn die Tabelle T_KUNDEN heißt, dann heißts natürlich ... FROM T_KUNDEN

Albi 13. Mai 2005 12:19

Re: Grösste Kundennummer per SELECT wählen
 
Hallo,

hast Du einfach mal

SQL-Code:
Select Max(KuNr) From DB
Bei mir läuft das so ohne Probleme.

hsbc 13. Mai 2005 12:26

Re: Grösste Kundennummer per SELECT wählen
 
CaseSensitive habe ich beachtet,
T_Kunden ist auch klar,

es ist momentan überhaupt ein sonderbares Verhalten, das ich noch nicht kenne:

SELECT * FROM KUNDEN - funktioniert, liefert alle Felder einwandfrei zurück
SELECT KUNDENNR FROM KUNDEN - Fehlermeldung: Das Feld (nächstes Feld) wurde nicht gefunden - Ich will ja nur die KundenNr
SELECT MAX(KUNDENNR) AS MaxNr FROM KUNDEN - Fehlermeldung: Das Feld KUNDENNR wurde nicht gefunden.
SELECT * FROM KUNDEN WHERE KUNDENNR = 12345 - funktioniert auch

Im Feldeditor sind ALLE Felder eingetragen.
Im TZQuery ist RequestLive auf TRUE gestellt.

Was kann ich da noch versuchen - vor allem wundert mich SELECT KUNDENNR FROM KUNDEN

mfg
Herbert

Stevie 13. Mai 2005 12:36

Re: Grösste Kundennummer per SELECT wählen
 
Zitat:

Zitat von hsbc
Im Feldeditor sind ALLE Felder eingetragen.

Willst du damit sagen, dass du alle Felder der Tabelle eingetragen hast?
Dann ist klar, woher der Fehler kommt! In der Abfrage müssen dann auch alle Felder zurückgeliefert werden, die dort eingetragen sind.

Zitat:

SELECT * FROM KUNDEN - funktioniert, liefert alle Felder einwandfrei zurück
SELECT KUNDENNR FROM KUNDEN - Fehlermeldung: Das Feld (nächstes Feld) wurde nicht gefunden - Ich will ja nur die KundenNr
SELECT MAX(KUNDENNR) AS MaxNr FROM KUNDEN - Fehlermeldung: Das Feld KUNDENNR wurde nicht gefunden.
SELECT * FROM KUNDEN WHERE KUNDENNR = 12345 - funktioniert auch
1. Klar, alle Felder werden ja auch zurückgeliefert.
2. In den Fields des Datasets ist das nächste Feld eingetragen, wird aber von deiner Datenmenge nicht zurückgeliefert.
3. Kundennummer ist das Field des Datasets und wird nicht gefunden, weil es ja nicht von der Datenmenge geliefert wird (dort wird ja nur das "Feld" MaxNr geliefert.
4. Klar, wie bei 1...

Also: Deine Fehler sind keine Datenbank- bzw SQL-Fehler, sondern Delphi-Fehler! ;-)

Lösung: Nur die Felder in dem DataSet (bzw der davon abgeleiteten Kompo, also deiner TZQuery) eintragen, die auch tatsächlich zurückgeliefert werden.

MfG
Stevie

hsbc 13. Mai 2005 13:14

Re: Grösste Kundennummer per SELECT wählen
 
Hallo nochmals,

ok - so funktioniert es, Stevie, obwohl es mir im Moment noch nicht ganz klar ist.

Demzufolge brauche ich z.B. 2 Query's, wenn ich einmal wie oben beschrieben, die letzte Kundennummer abfrage und andererseits die anderen Kundendaten selbst ändere.

Dementsprechend müsste auch folgende Abfrage funktionieren:

SELECT KUNDENNR FROM KUNDEN ( wenn im Feldeditor nur KUNDENNR eingetragen ist )
Dies funktioniert aber auch nicht, kommt ebenfalls die Fehlermeldung: KUNDENNR wurde nicht gefunden.
Oder habe ich da noch etwas falsch verstanden. Aber egal, die Abfrage nach der letzten Kundennummer funktioniert jetzt mal.

Jedenfalls recht herzlichen Dank für die Hilfe.

mfg
Herbert


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