![]() |
Datenbank: MSDE • Zugriff über: ADO
Nächsten freien Wert eines Feldes ermitteln ? Wie am besten?
Hi,
ich habe folgendes Problem: In meiner Tabelle habe ich ein varchar-Feld mit Kundennummern. In diese Tabelle möchte ich einen neuen Datensatz einfügen. Dazu möchte ich eine neue Kundennummer generieren. Was ich nicht will, ist einfach die höchste Kundennummer filtern, und dann die nächste selbst generieren, sondern ich möchte schauen, ob es vielleicht innerhalb der Kundennummern eine nicht vergebene Nummer gibt, die ich dann verwenden möchte. Beispiel: 1000001 1000002 1000004 Ich will herausfinden, dass es 100003 noch nicht gibt, und dann verwenden. Mit einer Schleife könnte ich das sicher tun und jedesmal abfragen, ob die Kundennummer vorhanden ist. Da es aber in dieser Tabelle ca 7000 Einträge gibt, macht das aus Perfomancegründen keinen Sinn... Hat jemand eine Idee ? Gruß Holger |
Re: Nächsten freien Wert eines Feldes ermitteln ? Wie am bes
Hmm. normalerweise würde ich einen Zähler in einer getrennten Tabelle reservieren, und den einfach hochzählen. Dann gibt es zwar Lücken, aber das ist doch vollkommen egal.
Aber Du willst das eben nicht...
Delphi-Quellcode:
Erzeugt eine Liste aller Kundennummern, für die es keinen Kunden mit der Nummer 'KuNr+1' gibt und liefert das kleinste Element zurück.
select min (k.KuNr+1) As NeuKdNr
from Kunden k left join Kunden k1 on k.KuNr + 1 = k1.KuNr Where k1.KuNr is Null Bei 7000 Datensätzen ist das gerade noch vertretbar, zumal das Anlegen neuer Kunden nicht ständig vorkommt. [edit] Das hier ist laut Query Analyzer noch etwas schneller
Delphi-Quellcode:
[/edit]
select min (orNumber+1) from [order] o
where not exists ( select * from [order] o1 where o1.orNumber = o.ornumber+1 ) |
Re: Nächsten freien Wert eines Feldes ermitteln ? Wie am bes
Hallo, danke für die schnelle Antwort...
ich habe das jetzt so gelöst...
Delphi-Quellcode:
Damit habe ich zwar auch eine Schleife, aber ich muss mein DataSet nur einmal öffnen und nicht ständig neu öffnen um nach einem Wert zu suchen...
DataSet2.Active := False;
DataSet2.CommandText := 'SELECT (...) ;'; DataSet2.Active := True; AlterWert := '100001'; // ist mein Startwert while not DataSet2.Eof do begin try if StrToInt(DataSet2.FieldValues['c002'])-StrtoInt(AlterWert) > 1 then // Zwischenraum vorhanden begin KontoRG := IntToStr(StrToInt(AlterWert)+1); // Mein Neuer Wert für die Kontonummer break; end; AlterWert := DataSet2.FieldValues['c002']; except end; DataSet2.Next; end; DataSet2.Active := False; Geht echt schnell... Lieber Gruß Holger |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 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