Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Nächsten freien Wert eines Feldes ermitteln ? Wie am besten? (https://www.delphipraxis.net/62478-naechsten-freien-wert-eines-feldes-ermitteln-wie-am-besten.html)

tekkyeah 5. Feb 2006 12:07

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

alzaimar 5. Feb 2006 13:34

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:
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
Erzeugt eine Liste aller Kundennummern, für die es keinen Kunden mit der Nummer 'KuNr+1' gibt und liefert das kleinste Element zurück.
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:
select min (orNumber+1) from [order] o
 where not exists (
    select * from [order] o1 where o1.orNumber = o.ornumber+1
    )
[/edit]

tekkyeah 5. Feb 2006 13:51

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:
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;
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...
Geht echt schnell...

Lieber Gruß
Holger


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