![]() |
Re: Indexfehler ??
Hallo,
die Sache mit dem in #7 genannten 'Schönheitsfehler' hat sich erledigt. Kann auch nicht nachvollziehen warum das nun so ist. Liegt auch nicht an Table.Refresh ! Bleibt 'nur' noch das Problem mit SwitchIndex wie in #7 schon beschrieben. Da komme ich einfach nicht weiter. Hoffe mal wieder auf Euere Hilfe. Übrigens: AbsoluteDatabase 5.15 ist verfügbar. Mit freundlichem Gruß Fritz |
Re: Indexfehler ??
Hallo Fritz,
ich hatte angenommen, dass beim Setzen von IndexFieldNames (anstelle von IndexName) das ständige Erzeugen und Vernichten von Index-Dateien entfallen kann. Wenn dem nicht so ist, dann muss ich die beiden Switch-Prozeduren noch etwas erweitern. Die Kunst dabei liegt darin es so zu tun, dass du den "unnötigen" Code beim Wechsel auf einen freien SQL-Server über bedingte Kompilierung abschalten kannst. Freundliche Grüße |
Re: Indexfehler ??
Hallo Achim,
habe schon in Sachen Index einige Zeit verbracht, alles vergeblich. Wie schon geschrieben: Ist ein Index vorhanden, diesen auch benutzen. Ist kein Index da, so sollte ein neuer Index für dieses Feld erstellt werden. Damit am Ende die Table nicht verändert ist müssen die neu erstellten Indizies vor oder in SwitchTable gelöscht werden. Für die Erweiterung der Proceduren wäre ich dankbar. Mit freundlichem Gruß Fritz |
Re: Indexfehler ??
Hallo schon wieder,
Neues von Fritz! Die Sache beschäftigt mich immer noch und auch mit Erfolg. Im Prinzip ist es eigentlich so geblieben. Schaut das doch bitte mal an. Wenn nicht vorhanden: Index neu
Delphi-Quellcode:
Wenn Index nicht mehr benötigt: Index erntfernen
//------------------- 2) Index nicht vorhanden
else // begin tTable.CLose; tTable.Exclusive := true; tTable.AddIndex(idxName, idxName,[]); tTable.IndexName := idxName; tTable.Exclusive := False; tTable.Open; label3.Caption := ''; label3.Caption := idxName; <- nur zur Anzeige sIndexList.Add(idxName); bIndexDelete.Enabled := True; //--internes Array mit den Indexdefinitionen aktualisieren tTable.IndexDefs.Update; //--evtl. Speichern der Definitionen verhindern tTable.StoreDefs := False; end; wird z.Zt. noch per Click gemacht
Delphi-Quellcode:
Das funktioniert auch wenn in TreeView Table gewechselt wird.
procedure TfrmMain.bIndexDeleteClick(Sender: TObject);
var cnt : integer; begin for cnt := ListBox.Count -1 downto 0 do begin tTable.DeleteIndex(sIndexList[cnt]); // index aus table sIndexList.Delete(cnt); // index aus stringlist tTable.IndexName := ''; // falls da noch was ist tTable.IndexDefs.Update; // indexdefinition aktualisieren tTable.StoreDefs := False; //speichern der definitionen verhindern bIndexDelete.Enabled := False; end; end;
Delphi-Quellcode:
Soviel dazu!
procedure TfrmMain.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin if TreeView.Selected.IsFirstNode then exit else begin // angeclickte Tabelle öffnen und Daten in Grid zeigen SelectTable(TreeView.Selected.Text); // neuer TableName // DisableControls; <-[Fehler] uMain.pas(147): Undefinierter Bezeichner: try tTable.Close; // active Table schließen // <========== hier sollte die procedure Index löschen eigefügt werden tTable.IndexName := ''; tTable.TableName := TreeView.Selected.Text; // neue Tabelle tTable.Open; finally // EnableControls; <-[Fehler] uMain.pas(147): Undefinierter Bezeichner: end; Label1.Caption:=TreeView.Selected.Text; tTable.IndexDefs.Update; tTable.StoreDefs := false; // neue Tabelle öffnen iRecordCount.Caption := IntToStr(tTable.RecordCount); // Datensätze zählen und anzeigen end; end; Und hier mein Anliegen 1) DisableControls / EnableControls gibt Fehlermeldung: undefinierter Bezeichner ??? 2) Die procedure bIndexDeleteClick würde ich gerne ind der procedure TreeViewChange unterbringen. wie geht das, habs noch nie gemacht! Danke Fritz |
Re: Indexfehler ??
zu 1) DisableControls bzw EnableControls ist eine Methode von TDataSet.
Das ständige Neuzeichnen der Bildschirmnanzeige von datensensitive Steuerlemeneten (DBGrid. DBEdit, etc) bei grossen Datenmengen ist zeitaufwändig; DisbaleControls 'friert' die Anzeige ein und nach dem Aktualisieren (in deinem Fall das Wechseln der Tabelle) wird durch EnableControls die Anzeige auf den neuesten Stand gebracht. zu 2)
Delphi-Quellcode:
Ich habe die Löschroutine stark vereinfacht (wie ich es ja schon mal vorgeschlagen habe ;) )
procedure TfrmMain.TreeViewChange(Sender: TObject; Node: TTreeNode);
var cnt: Integer; begin if TreeView.Selected.IsFirstNode then exit else begin // angeclickte Tabelle öffnen und Daten in Grid zeigen SelectTable(TreeView.Selected.Text); // neuer TableName //--Anzeige im Grid 'einfrieren DBGrid1.DataSource.DataSet.DisableControls; {oder vereinfacht:} tTable.DisableControls; try tTable.Close; // active Table schließen tTable.IndexName := ''; // falls da noch was ist //--alle Indizes löschen for cnt := sIndexList.Count -1 downto 0 do tTable.DeleteIndex(sIndexList[cnt]); // index aus table sIndexList.Clear; // stringliste komplett leeren tTable.IndexDefs.Update; // indexdefinition aktualisieren tTable.StoreDefs := False; //speichern der definitionen verhindern tTable.TableName := TreeView.Selected.Text; // neue Tabelle tTable.Open; finally DBGrid1.DataSource.DataSet.EnableControls; {oder vereinfacht:} tTable.EnableControls; end; Label1.Caption:=TreeView.Selected.Text; iRecordCount.Caption := IntToStr(tTable.RecordCount); // Datensätze zählen und anzeigen end; end; |
Re: Indexfehler ??
@ raiguen,
danke für Deine Mithilfe, das hat sich aber in der Zwischenzeit erledigt. Die Lösung sieht so aus, im Prinzip wie Dein Vorschlag:
Delphi-Quellcode:
und die procedure IndexDelete:
procedure TfrmMain.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin with tTable do if TreeView.Selected.IsFirstNode then exit else begin // angclickte Tabelle öffnen und Daten in Grid zeigen SelectTable(TreeView.Selected.Text); // neuer TableName DisableControls; try if Active then Close; // active Table schließen IndexDelete(sIndexList); // procedure IndexDelete TableName := TreeView.Selected.Text; // neue Tabelle If TableName <> '' then Open; finally EnableControls; end; Label1.Caption:=TreeView.Selected.Text; IndexDefs.Update; StoreDefs := false; // neue Tabelle öffnen iRecordCount.Caption := IntToStr(tTable.RecordCount); // Datensätze zählen und anzeigen end; end;
Delphi-Quellcode:
Weiter habe ich hinzugefügt:
procedure TfrmMain.IndexDelete(sIndexList: Tstringlist);
var cnt : integer; begin with tTable do for cnt := sIndexList.Count -1 downto 0 do begin //sIndexList DeleteIndex(sIndexList[cnt]); // index aus table (sIndexList[cnt]) tTable.IndexDefs.Update; // indexdefinition aktualisieren IndexFieldNames := ''; IndexName := ''; end; tTable.StoreDefs := False; //speichern der definitionen verhindern sIndexList.Clear; end;
Delphi-Quellcode:
So werden erstellte Indizies beim Beenden auch noch entfernt.
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin IndexDelete(sIndexList); // procedure IndexDelete end; Ich denke das Thema ist damit beendet. Nochmal danke für die Mithilfe und noch einen schönen Abend. Fritz |
Re: Indexfehler ??
Jo, wir helfen doch gerne, vor allem dann, wenn der Hilfesuchende auch aktiv an der Lösung seines Problems mitarbeitet :-D
Bezüglich deiner IndexLösch-Prozedure darf ich zum Anschluss noch eine Änderung anbringen (ich weiss, ich bin penetrant-nervig :roll: )
Delphi-Quellcode:
Ansonsten weiterhin viel Erfolg und einen schönen Rest-(1.Advents)Abend
procedure TfrmMain.IndexDelete(sIndexList: Tstringlist);
var cnt : integer; begin with tTable do IndexName := ''; {IndexName setzen reicht aus, da IndexName und IndexFieldName sich gegenseitig ausschliessen IndexFieldNames := '';} //** diese Minimalschleife ist ausreichend, alle temp. erstellten Indizes zu löschen for cnt := sIndexList.Count -1 downto 0 do //sIndexList DeleteIndex(sIndexList[cnt]); // index aus table (sIndexList[cnt]) ***// {in einer Schleife nicht sinnvoll, da JEDESMAL die Indizes neu ausgelesen werden, aber zum Schluss auf jeden Fall} IndexDefs.Update; // indexdefinition aktualisieren //--evtl. ist das hier auch möglich, da für die aktuelle Tabelle ja nicht mehr benötigt wird //-- und die Indizes für die neue Tabelle ja neu eingelesen werden IndexDefs.Clear {bin mir z.Zt. nicht ganz sicher, ob diese MEthode vorhanden ist} StoreDefs := False; //speichern der definitionen verhindern end; sIndexList.Clear; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 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-2025 by Thomas Breitkreuz