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:
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;
Die TMS-Variante wäre:
Code:
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;
Hier kommt dann der gleiche Fehler auch wieder bei
Code:
Form2.AccStatesTable.IndexName := ixName;
Kann das erstens sein, dass diese Entwicklerversion von Interbase nur eine bestimmte Anzahl von Indizes zuläßt?
Wieso bringt mir das Ding weder bei
Code:
ixDef := Form2.AccStatesTable.IndexDefs.AddIndexDef;
, noch bei
Code:
Form2.AccStatesTable.AddIndex('',aField.Name,'',[],ixName,'',False)
weder Fehlermeldung noch Ergebnis?