Autor Beitrag
Tabakbrummel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124

win 7
Turbo Delphi, VS 20010 Express
BeitragVerfasst: Mi 30.11.11 18:09 
Hallo

Ich habe Tabelle mit der Spalte LfdNr da sollen die 1 2 3... gespeichert werden und wenn ein Datensatz gelöscht wird, soll die laufende Nummerierung bleiben.
z.b
1 M
2 B
3 Z
4 T

Datensatz gelöscht
1 M
2 B
3 T

Mein Problem ist das bei diesen Code immer 1 gespeichert wird?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 with Q do
  begin
    Close;
    SQL.Clear;
    SQL.Add('UPDATE Tabelle SET LfdNr =');
    SQL.Add('(SELECT Count(*) FROM Tabelle as t ');
    SQL.Add('WHERE t.id < id)+1');
    ExecSQL;
//  open;
  end;

_________________
MfG
Tabakbrummel
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 431
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 30.11.11 18:19 
evtl so?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 with Q do
  begin
    Close;
    SQL.Clear;
    SQL.Add('UPDATE Tabelle SET LfdNr = Lfdnr-1');
    SQL.Add('WHERE t.id > '+IntToStr (<ID_DES_GELÖSCHTEN_SATZES>);
    ExecSQL;
  end;


Zuletzt bearbeitet von mandras am Mi 30.11.11 18:26, insgesamt 1-mal bearbeitet
Tabakbrummel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124

win 7
Turbo Delphi, VS 20010 Express
BeitragVerfasst: Mi 30.11.11 18:24 
Hallo mandras

Nein Ich will erst mal das die nummerierung gespeichert wird. Aber leider kommen da nur
1
1
1.
Den Orginal Code habe von hier support.microsoft.com/kb/510041/de

_________________
MfG
Tabakbrummel
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 30.11.11 18:35 
ausblenden Delphi-Quelltext
1:
    SQL.Add('WHERE t.id < Tabelle.id)+1');					


funktioniert zwar, ist aber datenbanktechnisch Quark

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 431
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 30.11.11 18:54 
user profile iconTabakbrummel hat folgendes geschrieben Zum zitierten Posting springen:
Hallo mandras
Nein Ich will erst mal das die nummerierung gespeichert wird. Aber leider kommen da nur


ok, so hat es bei mir funktioniert:

ausblenden SQL-Anweisung
1:
2:
3:
update Tabelle 
set lfdnr = (select count(*)
 from Tabelle as t where t.lfdNr<= Tabelle.lfdNr)


Wobei ich mir bei Deinem Beispiel nicht ganz sicher bin wg. Feldern ID und LfdNr (war ID evtl. ein reserviertes Wort im Access-Beispiel von MS?) <- EDIT: ist es nicht wie ich grad kas
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 30.11.11 19:00 
nein, ich hatte den Teil aus dem Originalbeitrag kopiert und das fehlende eingefügt, zu testen hatte ich das:
ausblenden SQL-Anweisung
1:
Update lf set LFDNR = (Select Count(*) from lf lf2 where lf2.LFDNR < lf.LFDNR) + 1					

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 30.11.11 19:49 
Hallo,

ist es wirklich sinnvoll, die Nummer in die Datenbank zu schreiben? Das bedeutet ja, dass bei jeder Änderung der Datenbank jeder einzelne Datensatz aktualisiert werden muss. Das birgt einerseits Performanceprobleme wenn die Tabelle etwas größer wird, und auf der anderen Seite könnte es eine korrupte Tabelle geben, wenn z.B. das Programm mal abstürzt. Wenn möglich, würde ich die Nummer eher dynamisch generieren, wenn sie benötigt wird. Aber das hängt von der Anwendung ab.

Außerdem gilt es zu überlegen, nach welcher Ordnung die Datensätze durchnummeriert werden. Einige Datenbanken würfeln hin und wieder mal ein paar Datensätze durcheinander, um Speicherlücken aufzufüllen etc. Es ist also nötig, eine ORDER BY-Klausel einzubauen.

Grüße,
Yogu
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 431
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 30.11.11 19:56 
ups bummi,
hatten wir 2 die gleiche idee.

yogu:
Deine Einwände sind mehr als berechtigt. Solage das Daten"Ausgangsmaterial" in Ordnung ist klappt alles, aber wehe wenn nicht... (2 Lücken sind kein Problem, doppelt vergebene LfdNr schon)
Das mit dem Order By hilft jedoch nicht weiter - wenn alles ok ist ändert es nichts, wenn eine LfdNr doppelt vergeben ist hilft es auch nicht mehr.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 30.11.11 20:30 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Das mit dem Order By hilft jedoch nicht weiter - wenn alles ok ist ändert es nichts, wenn eine LfdNr doppelt vergeben ist hilft es auch nicht mehr.

Mit ORDER BY wollte nur zeigen, dass die Reihenfolge der Sortierung in allen oben genannten Queries vollkommen willkürlich ist. Meistens entspricht sie der Reihenfolge des Einfügens, manchmal aber auch nicht. Um das Problem zu lösen, sollte man die Datensätze z.B. nach Erstelldatum oder Auto-Inkrement-ID sortieren.