Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatznummern für ein DBGrid (https://www.delphipraxis.net/120799-datensatznummern-fuer-ein-dbgrid.html)

Thomas F 16. Sep 2008 23:42

Datenbank: MYBase • Version: ? • Zugriff über: Clientdataset

Datensatznummern für ein DBGrid
 
Wie kann man jedem Eintrag in einer DBGrid chronologisch eine Nummer geben

Mit dem Code hab ich es probiert

Delphi-Quellcode:

Clientdataset1Nr.asinteger := Clientdataset1.recno ;
Funktioniert aber nicht weil die Tabelle nach dem Feld Clientdataset1Feld1 sortiert wird

und dann die Nummern durcheinander geraten.

omata 16. Sep 2008 23:46

Re: Datensatznummern für ein DBGrid
 
Benutze die ID-Spalte in deiner Tabelle. Wenn du keine hast, hast du das grundlegende Datenbankdesign nicht verstanden.

Thomas F 16. Sep 2008 23:53

Re: Datensatznummern für ein DBGrid
 
Delphi-Quellcode:
Clientdataset2.Indexdefs

Default_Order

Changeindex
meinst du das ?

Wahrscheinlich mit ChangeIndex , oder ?

omata 16. Sep 2008 23:55

Re: Datensatznummern für ein DBGrid
 
Ne, ich meine das du einfach eine Spalte in deine Tabelle aufnehmen sollst, die eine Zahl enthält. Das sollte dann vielleicht auch dein Primary-Key sein und eventuell ein Autofeld.

Edit...
So ich habe nochmal etwas ausprobiert.

Bei folgender Kette:
Connection->SQLDataSet->DataProvider1->ClientDataSet1->DataProvider2->ClientDataSet2->DataSource->DBGrid
kann das RecNo verwendet und ein neues Feld in die Anzeigemenge einführt werden.

Im ClientDataSet2 kann dann ein neues Feld angelegt werden (ID, Zahl) und folgendermaßen initialisiert werden...
Delphi-Quellcode:
procedure TForm.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('id').AsInteger:=ClientDataSet1.RecNo;
end;
Eine Sortierung wird dann folgendermaßen möglich...
Delphi-Quellcode:
  ClientDataSet2.IndexFieldNames:='id';
Trotzdem ist mein erster Vorschlag sinnvoller...

Thomas F 17. Sep 2008 07:49

Re: Datensatznummern für ein DBGrid
 
So hab ich das bis jetzt auch hinbekommen.

Das ist aber falsch !

Wenn nämlich Einträge geändert oder gelöscht werden, dann stimmts nicht mehr.

Ich habs jetzt, so funktioniert es......

Delphi-Quellcode:
procedure Tform1.Zeilennummern_eingeben;
var i:Integer;
begin
for i := 1 to Form1.Clientdataset2.recordcount do
begin
  form1.ClientDataSet2.Recno := i;
 form1.ClientDataSet2.Edit;
form1.ClientDataSet2Nr.AsInteger:= form1.ClientDataSet2.Recno ;
end;
end;

Billa 17. Sep 2008 08:59

Re: Datensatznummern für ein DBGrid
 
@Thomas F: Im Gegenteil, ich denke, daß Deine Lösung "fasch" ist. Was Du in Deinem Beispiel erhältst, ist lediglich eine Zeilennummerierung, aber keine eindeutige Identifizierung der Datensätze (über mehrere Aufrufe hinweg). Schon allein deshalb, weil die Nummer sich bei jedem Aufruf ändern kann. Das sind zwei verschiedene Dinge. Es lohnt sich wirklich, über omatas Anregung nachzudenken. Wenn es für Dich so funktioniert, ok. Aber bereits bei konkurrierenden Zugriffen und/oder Transaktionen bekommt man evtl. große Probleme, die man durch besseres Design von vornherein vermeiden kann. Natürlich KANN man eine ID zur Sortierung benutzen. Sollte man aber besser nicht.

Thomas F 17. Sep 2008 10:31

Re: Datensatznummern für ein DBGrid
 
Ich lass die Zeilennummern weg :shock:

Irgendwie bekomm ich das nicht hin

Es funktioniert nur solange man keine Datensätze ändert oder löscht,

dann kommt alles durcheinander.

Und wenn die Zeilennummern durcheinander sind , dann bringt es auch nichts.

Billa 17. Sep 2008 10:52

Re: Datensatznummern für ein DBGrid
 
Hmm ... so schnell habe ich das nicht erwartet.

Also:

Wenn ich das richtig verstanden habe, hast Du ZWEI Aufgaben:

1. Identifikation und
2. Sortierung

Für beide Zwecke führst Du jeweils ein eigenes Feld in Deiner Datenstruktur.

1. die ID
ein eigener Zähler, der unabhängig von allen anderen Operationen immer nur hochgezählt wird.
Manche Datenbanken bieten dafür als Datentyp autoincrement o.ä. an.
Wenn Du den Datensatz ansprichst, dann am Besten über diese ID, die NIEMALS verändert werden darf

2. die Ordnungsnummer
beim Anlegen des Datensatzes kann man die ruhig auf dienselben Wert setzen, wie die ID, dadurch ist gewährleistet, daß sie noch nicht vorkommt. Später kannst Du diese Ordnungsnummer aber ändern (z.B. tauschen, um zwei Sätzen in der DARSTELLUNG zu vertauschen). Damit wird aber die ID nicht verändert. Der Datensatz bleibt eindeutig aber beliebig sortierbar.

Es ist keine gute Idee, die Datenstruktur oder die Identifikation für eine Darstellung zu verändern. Das ist imho, was omata mit "Design" meinte.


Beispiel

FILM_ID integer (eindeutig, wird nur angelegt, nie verändert)
FILM_ORDER integer
FILM_NAME char(50)
...


So eine Struktur macht es leicht, später z.B. abhängige Tabellen hinzuzufügen, weil eine eindeutige Zuordnung über die FILM_ID möglich ist...

Lies mal z.B. Andreas Kosch: Interbase Datenbankentwicklung mit Delphi, nicht mehr besonders aktuell, aber an den Prinzipien guten Designs hat sich nichts geändert....

Thomas F 17. Sep 2008 11:38

Re: Datensatznummern für ein DBGrid
 
Danke, für deine Antwort

Ich hab jetzt ein Feld 'Nr' hinzugefügt mit dem Datentyp 'AutoInc'

Zählt jeden Datensatz um eins nach oben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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 by Thomas Breitkreuz