Einzelnen Beitrag anzeigen

BergLoewe

Registriert seit: 20. Nov 2005
37 Beiträge
 
Delphi 11 Alexandria
 
#31

AW: Sortieren im Clientdataset nach ID(autoinc)

  Alt 2. Mai 2024, 17:58
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?
  Mit Zitat antworten Zitat