![]() |
AW: Sortieren im Clientdataset nach ID(autoinc)
Moin,
wenn auch 11 Jahre alt, dieser Tröt war einer, der sich mit Datenbank-Sortieren beschäftigt. Deshalb kram ich den noch mal raus. Ich habe Interbase XE7, bzw. mir gestern die 2020-Version runtergladen. Diese Entwicklerversion, mit der man wohl kein selbstgemachtes Programm ohne IDE starten kann. Dazu Delphi 11 und da mit FireDac. Nun hab ich mir da was zusammengebastelt, in dem ich mit verscheidenen Tabellen und einder ganzen menge Feldern arbeiten muß. Ich habe die VCL-Komponenten von TMS, da dass DBAdvGrid und mich darüber wiederum nach der Sortiererei erkundigt. Da kommt man über ein Beispielprogramm darauf, dass man -wenn man auf einen Spaltenkopf clickt- das Event abfangen und da reinprgogrammieren kann, dass er sich von zur Entwurfszeit festgelegten Indizes einen raussuchen,den im DataSet unter IndexName eintragen soll. Das funktionierte auch. So habe ich für jedes Feld einen incrementalen und einen decrementalen Index gemacht. Was deren Zahl natürlich mächtig bläht. Bei einem Index der ersten tabelle, den ich hier ziemlich zuletzt gemacht habe, bringt er mir zur Laufzeit aber eine Fehlermeldung, dass er diesen Index nicht finden könne. Der ist zur Entwurfszeit aber da. Bei der zweiten Tabelle funktioniert von 52 Indizes gleiche mal kein einziger. Ich wurde auch auf den Gedanken gebracht, die Indizes ohnehin erst zur Laufzeit anzulegen. Nur, das krieg ich trotz punktgenauen Abschreibens von diversen Vorlagen(einmal aus dem TMS-Beispiel und einmal aus diesen Tröt hier) nicht hin. Das Ding kompiliert, zur Laufzeit kann man sich über den Befehl zur Erstellung des Indexes hindebuggen. Aber wenn man den IndexName in das Property IndexName eintragen will, kommt eine Fehlermeldung, der sei nicht zu finden.
Code:
Die TMS-Variante wäre:
procedure Sort(aField: TField; desc: Boolean);
// create or set clientdataset index on field var ixName: string; ixDef: TIndexDef; function ExistsIndex(const aName: string): Boolean; var i: Integer; begin for i := 0 to Form2.AccStatesTable.IndexDefs.Count - 1 do begin if Form2.AccStatesTable.IndexDefs[i].Name = aName then begin Result := True; Exit; end; end; Result := False; end; begin ixName := aField.FieldName + '_IX'; if desc then ixName := ixName + '_D'; // if index exists switch to that index if not ExistsIndex(ixName) then begin if desc then Form2.AccStatesTable.AddIndex('',aField.Name,'',[],ixName,'',False) else Form2.AccStatesTable.AddIndex(ixName,aField.Name,'',[],'','',False); ==>> hier kommt der Fehler: Form2.AccStatesTable.IndexName := ixName; Form2.AccStatesTable.First; end else begin Form2.AccStatesTable.IndexName := ixName; Form2.AccStatesTable.First; end; end;
Code:
Hier kommt dann der gleiche Fehler auch wieder bei
procedure SwitchBiolifeIndex(aField: TField; desc: Boolean);
// create or set clientdataset index on field var ixName: string; ixDef: TIndexDef; function ExistsIndex(const aName: string): Boolean; var i: Integer; begin for i := 0 to Form2.AccStatesTable.IndexDefs.Count - 1 do begin if Form2.AccStatesTable.IndexDefs[i].Name = aName then begin Result := True; Exit; end; end; Result := False; end; begin ixName := aField.FieldName + '_IX'; if desc then ixName := ixName + '_D'; // if index exists switch to that index if not ExistsIndex(ixName) then begin ixDef := Form2.AccStatesTable.IndexDefs.AddIndexDef; ixDef.Fields := aField.FieldName; ixDef.Name := ixName; if desc then ixDef.DescFields := aField.FieldName;} end; Form2.AccStatesTable.IndexName := ixName; Form2.AccStatesTable.First; end;
Code:
Kann das erstens sein, dass diese Entwicklerversion von Interbase nur eine bestimmte Anzahl von Indizes zuläßt?
Form2.AccStatesTable.IndexName := ixName;
Wieso bringt mir das Ding weder bei
Code:
, noch bei
ixDef := Form2.AccStatesTable.IndexDefs.AddIndexDef;
Code:
weder Fehlermeldung noch Ergebnis?
Form2.AccStatesTable.AddIndex('',aField.Name,'',[],ixName,'',False)
|
AW: Sortieren im Clientdataset nach ID(autoinc)
Müsste die ClientDataSet Variante nicht so aussehen?
Delphi-Quellcode:
Der 1. Parameter ist der Name des Indexes.
if desc then
Form2.AccStatesTable.AddIndex(ixName,'',[],aField.Name,'',False) else Form2.AccStatesTable.AddIndex(ixName,aField.Name,'',[],'','',False); Der 2. die Liste der Ascending Fields. Der 4. die Liste der Descending Fields. ![]() Gruß Ralf |
AW: Sortieren im Clientdataset nach ID(autoinc)
Nee, das ist leider auch nicht richtig. Der DataSet ist eine TFDQuery und für diese wäre das hier zuständig.
![]() Nun ist es aber komischerweise generell so, dass ich -egal, was und wie- nur Indizes verwenden kann, die ich vor Tagen zur Entwurfszeit angelegt hatte. Lösch ich einen, nimmt der den zur Laufzeit nicht mehr. Wie verhext. Wenn ich zur Laufzeit einen Index anlege, macht Delphi das zwar. Ich kann mir den IndexCount anzeigen lassen und sehe, wie der sich erhöht. Aber es läßt sich ein solcher Indesx nicht in das Property IndexName eintragen. Dann kommt die Fehlermeldung, er fände den nicht. Gleiches geschieht mit Indizes, die ich zur Entwurfszeit anlege. Die will der weder zur Entwurfszeit, noch zur Laufzeit finden, obwohl sie definitiv vereinbart sind. Es ist nochwas anderes komisch: Wenn ich zur Entwurfszeit einen Index anlege und die Option 'soDescendig' setze, hat das mal funktioniert. Setze ich im Code aber ein 'soDescending' in die entsprechende eckige Klammer, will der Compiler die Bezeichnung soDescending nicht kennen und meckert "inkompatible Typen 'TFDSortOptions' und 'Set'" an. Nun hab ich gegoogelt, unter TFDSortOptions findet man wirklich 'soDescending' etc.. Irgendwie ist hier vollständig der Wurm drin. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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