AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Sortieren im Clientdataset nach ID(autoinc)
Thema durchsuchen
Ansicht
Themen-Optionen

Sortieren im Clientdataset nach ID(autoinc)

Ein Thema von Natcree · begonnen am 14. Nov 2013 · letzter Beitrag vom 4. Mai 2024
Antwort Antwort
Seite 4 von 4   « Erste     234   
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
Benutzerbild von ergeka
ergeka

Registriert seit: 5. Mär 2010
Ort: Karlsruhe
33 Beiträge
 
Delphi 12 Athens
 
#32

AW: Sortieren im Clientdataset nach ID(autoinc)

  Alt 2. Mai 2024, 18:52
Müsste die ClientDataSet Variante nicht so aussehen?
Delphi-Quellcode:
if desc then
  Form2.AccStatesTable.AddIndex(ixName,'',[],aField.Name,'',False)
else
  Form2.AccStatesTable.AddIndex(ixName,aField.Name,'',[],'','',False);
Der 1. Parameter ist der Name des Indexes.
Der 2. die Liste der Ascending Fields.
Der 4. die Liste der Descending Fields.

https://docwiki.embarcadero.com/Libr...taSet.AddIndex


Gruß

Ralf
  Mit Zitat antworten Zitat
BergLoewe

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

AW: Sortieren im Clientdataset nach ID(autoinc)

  Alt 4. Mai 2024, 10:12
Nee, das ist leider auch nicht richtig. Der DataSet ist eine TFDQuery und für diese wäre das hier zuständig.

https://docwiki.embarcadero.com/Libr...taSet.AddIndex

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.

Geändert von BergLoewe ( 4. Mai 2024 um 10:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz