hi Kollegen
Ich wollte eine procedure schreiben, die ein CDS sowohl aufsteigend als auch absteigend sortieren kann.
Dazu habe ich in diesem Forum Code gefunden und angepasst und es funktioniert auch einwandfrei.
Nun wollte ich aber die procedure weiter optimieren und habe einige Verständnisprobleme:
1.) Könnte mir jmd die Unterschiede zwischen
Delphi-Quellcode:
CDS.AddIndex
CDS.IndexFieldNames
// und
CDS.IndexDefs.Add
erläutern?
Ich benutze nun letzteres, aber habe ka, wieso eigentlich. ^^
2.)
CDS.IndexDefs.Update
Die delphi-Hilfe sagt dazu folgendes:
"Update wird aufgerufen, wenn die Indizes einer Datenmenge geändert wurden." Also NACHDEM sie geändert wurden.
Im darunter angegebenen Beispiel wird dieser Befehl aber VOR einer Änderung der Indexmenge aufgerufen, nicht danach. Bin ich nu blöde oder die? ^^
3.)
Delphi-Quellcode:
CDS.IndexDefs.Clear;
CDS.IndexDefs.Update;
CDS.Active war dabei auf true gesetzt, wodurch laut Hilfe Update automatisch 2 Felder (DEFAULT_ORDER und CHANGEINDEX) erstellt.
Ich hatte vorher 3, die 2 komischen ^^ und eins von meiner ersten Sortierung. Mit Clear habe ich alle 3 gelöscht und dachte nun, nach Update lediglich die 2 komischen wieder zu kriegen. Aber weit gefehlt, das 3. war auch wieder da und schon meckert er rum von wegen doppelt gemoppelt und ich habe ka, wieso...
Vielen Dank für eure Erklärungen schonmal!
mfg
Frank
edit:
Vlei kurz zur Erklärung: ich habe die procedure soweit optimiert, dass sie genau so funktioniert, wie ich es möchte, nur auf dem Weg dahin bin ich bald blöde geworden und würde das nun sozusagen im Nachhinein mal verstehen:
Delphi-Quellcode:
procedure TForm2.cds_sort(feldbez:string);
var
IndexName: String;
i:integer;
aufsteigend:boolean;
begin
indexname:=feldbez+'_id';
aufsteigend:=true;
for i := 0 to datamodule3.clientdataset1.IndexDefs.Count-1 do
if (datamodule3.clientdataset1.IndexDefs.Items[I].Fields = feldbez) then
aufsteigend:=false;
datamodule3.ClientDataSet1.active:=false;
datamodule3.ClientDataSet1.IndexDefs.Clear;
datamodule3.clientdataset1.IndexDefs.Update;
if Aufsteigend then
datamodule3.clientdataset1.IndexDefs.Add(IndexName, feldbez, [ixCaseInsensitive])
else
datamodule3.clientdataset1.IndexDefs.Add(IndexName, feldbez, [ixCaseInsensitive,
ixDescending]);
datamodule3.clientdataset1.IndexName := IndexName;
datamodule3.ClientDataSet1.Active:=true;
end;