AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Nächsten freien Wert eines Feldes ermitteln ? Wie am besten?
Thema durchsuchen
Ansicht
Themen-Optionen

Nächsten freien Wert eines Feldes ermitteln ? Wie am besten?

Ein Thema von tekkyeah · begonnen am 5. Feb 2006 · letzter Beitrag vom 5. Feb 2006
Antwort Antwort
tekkyeah

Registriert seit: 24. Nov 2003
27 Beiträge
 
Delphi 2006 Professional
 
#1

Nächsten freien Wert eines Feldes ermitteln ? Wie am besten?

  Alt 5. Feb 2006, 13:07
Datenbank: MSDE • Zugriff über: ADO
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
Holger
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Nächsten freien Wert eines Feldes ermitteln ? Wie am bes

  Alt 5. Feb 2006, 14:34
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]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
tekkyeah

Registriert seit: 24. Nov 2003
27 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Nächsten freien Wert eines Feldes ermitteln ? Wie am bes

  Alt 5. Feb 2006, 14:51
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
Holger
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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