![]() |
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:
Funktioniert aber nicht weil die Tabelle nach dem Feld Clientdataset1Feld1 sortiert wirdClientdataset1Nr.asinteger := Clientdataset1.recno ; und dann die Nummern durcheinander geraten. |
Re: Datensatznummern für ein DBGrid
Benutze die ID-Spalte in deiner Tabelle. Wenn du keine hast, hast du das grundlegende Datenbankdesign nicht verstanden.
|
Re: Datensatznummern für ein DBGrid
Delphi-Quellcode:
meinst du das ?
Clientdataset2.Indexdefs
Default_Order Changeindex Wahrscheinlich mit ChangeIndex , oder ? |
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:
Eine Sortierung wird dann folgendermaßen möglich...
procedure TForm.ClientDataSet1CalcFields(DataSet: TDataSet);
begin DataSet.FieldByName('id').AsInteger:=ClientDataSet1.RecNo; end;
Delphi-Quellcode:
Trotzdem ist mein erster Vorschlag sinnvoller...
ClientDataSet2.IndexFieldNames:='id';
|
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; |
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.
|
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. |
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.... |
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