AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Lücken in fortlaufender Nummerierung finden
Thema durchsuchen
Ansicht
Themen-Optionen

Lücken in fortlaufender Nummerierung finden

Ein Thema von noisy_master · begonnen am 16. Feb 2016 · letzter Beitrag vom 16. Feb 2016
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.878 Beiträge
 
Delphi 13 Florence
 
#1

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 14:18
Da hier ja sowieso kein potenter SQL-Server zum qualmen gebracht werden soll, würde ich hier den Heimvorteil der BDE/Paradox-Kombination ausnutzen: Was spricht denn gegen ein sequentiuelles Durchlaufen der Tabelle. Dabei kannst du doch die Lücken direkt erkennen und auflisten. Das hier unbeding mit SQL zu vergewaltigen ist doch gar nicht zielführend.

Delphi-Quellcode:
procedure FindGaps(DataSet: TDataSet; FieldName: string; Target: TStrings; CheckFirst: Boolean);

  procedure AddGap(von, bis: Integer);
  var
    S: string;
  begin
    if von < bis then begin
      S := Format('%d-%d', [von, bis]);
    end
    else begin
      S := Format('%d', [von]);
    end;
    Target.Add(S);
  end;

var
  fld: TField;
  id: Integer;
  nextId: Integer;
  S: string;
begin
  Target.BeginUpdate;
  try
    DataSet.Active := true;
    if DataSet.IsEmpty then
      Exit;
    { DataSet muss nach FieldName sortiert sein }
    fld := DataSet.FieldByName(FieldName);
    DataSet.First;
    if CheckFirst then begin
      nextId := 1;
    end
    else begin
      nextId := fld.AsInteger;
    end;
    repeat
      id := fld.AsInteger;
      if nextId < id then begin
        AddGap(nextId, id - 1);
      end;
      nextId := id + 1;
      DataSet.Next;
    until DataSet.Eof;
  finally
    Target.EndUpdate;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (16. Feb 2016 um 15:06 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 14:21
Genau, der TE wollte zwar SQL, aber Dein Vorschlag finde ich hier auch am sinnvollsten!
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 14:26
Würde es für Paradox ne SQL-Lösung geben wäre die auch sehr wahrscheinlich schneller als eine in Delphi.
War also keine schlechte Idee nach SQL zu fragen bzw. es mit SQL zu versuchen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
263 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 14:35
Mann oh mann, ich hätte nicht gedacht, dass dazu SO viele Antworten kommen... Danke erst mal an alle

Dass das Ganze "von Hand" geht(durchgehen nach Uwe's Vorschlag) war mir auch klar, und ist definitiv die übersichtlichste und "flexibelste" Variante, da dort auch größere Lücken auffindbar sind. Ich hatte halt nur auf eine "einfache elegante" Variante per SQL gehofft....

Aber ich habe alles an Antworten bekommen, was man sich so wünschen kann...

Werde es mal mit Uwe's "durchgehen" versuchen...wird zwar nicht schnell sein, aber erstmal egal
Dirk
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 14:36
ot
Würde es für Paradox ne SQL-Lösung geben wäre die auch sehr wahrscheinlich schneller als eine in Delphi.
War also keine schlechte Idee nach SQL zu fragen bzw. es mit SQL zu versuchen.
Ich denke, das ist genau das Problem, auf das Uwe hinweisen wollte. Der "Server" von Paradox ist immer(!) der eigene PC. Idealerweise liegt das Datenfile lokal und es gibt keinen Netzwerkzugriff /-transport.
Das SQL wird vermutlich eh von der BDE in sequentielle Zugriffe umgebaut, mein eigener Hinweis bezüglich not exists versus outer join ist ja auch fragwürdig bei dieser Art File DB.

SQL=schneller als per Clientprogrammierung finde ich auch immer eine gute Idee, gilt m.E. nur wenn tatsächlich ein echter Server im Spiel ist.
/ot
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.878 Beiträge
 
Delphi 13 Florence
 
#6

AW: Lücken in fortlaufender Nummerierung finden

  Alt 16. Feb 2016, 15:11
Ich habe den Code nochmal etwas umgebaut, da der erste Datensatz überflüssigerweise zweimal überprüft wurde. Zusätzlich habe ich noch ein Begin/Endupdate auf Target eingebaut.

Leider habe ich gerade keine richtig große Paradox-Tabelle da, aber auf meinem System schafft diese Methode die 4500 Sätze in 5 ms.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 23:07 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