![]() |
Datenbank: Absolute Database • Version: 5.14 • Zugriff über: Table / DataSource
Indexfehler ??
Hallo,
in meinem Prog. werden im Grid Daten angezeigt, die mit onTitleClick einen Index erhalten und sortiert im Grid erscheinen.
Delphi-Quellcode:
Die neu erzeugten Indizies werden in einer Liste ‚gesammelt’.
Table.Close;
Table.Exclusive := true; Table.AddIndex(sName, sName,[]); // (IndexName, indiziertes Feld[optionen]); Table.IndexName := sName; Table.Exclusive := False; Table.Open; sIndexList.Add(sName); // neuer Index in StringListe Damit die Tabelle nicht geändert wird, werden die neu erstellten Indizies gemäß dieser Liste wieder gelöscht.
Delphi-Quellcode:
Das ist auch soweit OK.
Table.DeleteIndex(sIndexList[cnt]); // index aus table
sIndexList.Delete(cnt); // index aus stringlist Table.IndexDefs.Update; // indexdefinition aktualisieren Table.StoreDefs := False; Nun habe ich mein Prog. erweitert, die Table werden in TreeView dargestellt. Mit Click auf die entsprechende Tabelle wird die Table geöffnet, die Daten im Grid angezeigt und man kann so zwischen den Tabellen hin und her schalten. Auch OK. Aber clicke ich im Grid und erstelle so einen neuen Index zb. Name, der vor dem Tabellenwechsel wieder gelöscht wird, so erscheint bei Tabellenwechsel die Fehlermeldung Cannot find index NAME Der Tabellenwechsel: Index der aktiven Table löschen, aktive Tabelle schließen (Table.Close), neue Tabelle öffnen.
Delphi-Quellcode:
Warum wird da ein nicht mehr vorhandenr Index gesucht, wo liegt da eventuell der Fehler?
SelectTable(TreeView.Selected.Text);
Table.Close; // active Table schließen Table.TableName := TreeView.Selected.Text; // neue Tabelle Table.Open; Habe schon einige Zeit mit Fehlersuche verbracht und nichts gefunden, vielleicht hat ja von Euch eine eine hilfreiche Idee dazu. Danke Fritz aus Ahlhorn |
Re: Indexfehler ??
Hallo nochmal,
habe in der Zwischenzeit noch gesucht. Der Tabellenwechsel: Index der aktiven Table löschen, aktive Tabelle schließen (Table.Close), neue Tabelle öffnen.
Delphi-Quellcode:
Da muß doch noch ein Index der alten Tabelle sein, der in der neuen Tabelle nicht vorhanden ist.
procedure TfrmMain.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin if TreeView.Selected.IsFirstNode then exit else begin SelectTable(TreeView.Selected.Text); Table.Close; // active Table schließen Table.TableName := TreeView.Selected.Text; // neue TabellenName Table.Open; <================== Hier liegt der Fehler iRecordCount.Caption := IntToStr(Table.RecordCount); // Datensätze zählen und anzeigen end; end; Wie kriege ich den da weg, was muß ich da machen? Fritz |
Re: Indexfehler ??
Zitat:
Delphi-Quellcode:
Was verbirgt sich hinter der Funktion/Prozedur SelectTable()?
procedure TfrmMain.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin if TreeView.Selected.IsFirstNode then exit else begin SelectTable(TreeView.Selected.Text); Table.Close; // active Table schließen Table.IndexName := ''; // <<---hier könnte noch ein zugewiesener Index vom Vorgänger drin sein!Deswegen erstmal blank machen ;) Table.TableName := TreeView.Selected.Text; // neue TabellenName Table.Open; //--wird mit dem PrimärIndex(sofern vorhanden) geöffnet //--für die neue Tabelle sicherheitshalber mal die Indexliste aktualisieren Table.IndexDefs.Update; Table.StoreDefs := false; iRecordCount.Caption := IntToStr(Table.RecordCount); // Datensätze zählen und anzeigen end; end; |
Re: Indexfehler ??
Hallo,
ist schon spät geworden. Habe es mal so gemacht und es hat sich nur etwas verändert. Die erste Tabelle wird geöffnet, ein Index auf PLZ und Index gelöscht. Eine Andere läßt sich nun öffnen, aber kommt dann der Click für den Index kommt die Fehlermeldung: Zugriffsverletzung Ich kriegs nicht gebacken, aber nur nicht aufgeben! Zitat:
Delphi-Quellcode:
Erst mal genug für heute, morgen werde ich weitersehen.
procedure TfrmMain.SelectTable(Name: String='');
var i: Integer; begin if (name <> '') then for i:=1 to TreeView.Items.Count-1 do if AnsiUpperCase(TreeView.Items[i].Text) = AnsiUpperCase(Name) then begin TreeView.Selected := TreeView.Items[i]; Break; end; end; Fritz |
Re: Indexfehler ??
Hallo Fritz,
vom Prinzip her solltest du folgende Struktur verwenden können:
Delphi-Quellcode:
Getippt und nicht getestet.
unit DemoFrm;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ABSMain, Grids, DBGrids, ComCtrls; type TDemoForm = class(TForm) TreeView: TTreeView; DBGrid: TDBGrid; ABSDatabase: TABSDatabase; ABSTable: TABSTable; DataSource: TDataSource; procedure TreeViewChange(Sender: TObject; Node: TTreeNode); procedure DBGridTitleClick(Column: TColumn); private procedure SwitchTable(const tblName: string); procedure SwitchIndex(const idxName: string); end; var DemoForm: TDemoForm; implementation {$R *.dfm} uses StrUtils; procedure TDemoForm.SwitchIndex(const idxName: string); begin with AbsTable do if not SameText(idxName, IndexFieldNames) then begin DisableControls; try IndexFieldNames := idxName; finally EnableControls; end; end; end; procedure TDemoForm.SwitchTable(const tblName: string); begin with AbsTable do if not SameText(tblName, TableName) then begin DisableControls; try if Active then Close; SwitchIndex(''); TableName := tblName; if TableName <> '' then Open; finally EnableControls; end; end; end; procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode); begin SwitchTable(IfThen(Assigned(Node), Node.Text)); end; procedure TDemoForm.DBGridTitleClick(Column: TColumn); begin SwitchIndex(Column.FieldName); end; end. Freundliche Grüße |
Re: Indexfehler ??
Hallo marabu,
habe Deinen Text mal so übernommen um zu schauen was da passiert. Nach OpenDialog und procedure (siehe #4) erscheint in der TreeView 'Demo.Abs mit einem + davor. Mit dem ersten Click in TreeView erscheint die Fehlermeldung Table Demo.Abs not exists ABSDatabase hat den Namen Demo.abs, eine Table Demo.abs gibt es wirklich nicht. Was ist das ? Gruß Fritz |
Re: Indexfehler ??
@ marabu
Hallo Achim, habe Deinen Code versucht zu verstehen. Die mit * gezeichneten Zeilen habe ich bei 'SwitchTable' hinzu gefügt. Das ist nun OK, hat aber einen kleinen Schönheitsfehler: wenn zb. 3 Einträge in TreeView sind kann man den ersten Eintrag nicht öffnen. Clickt man den 2. oder den 3. Eintrag an, kann man danach auch den 1. öffnen. Mal sehen.Vielleicht finde ich da ja noch was.
Delphi-Quellcode:
Bei 'SwitchIndex' kann ich nur bereits vorhandene Indizies nutzen! (Aber der Tabellenwechsel ist OK.)
begin
* if TreeView.Selected.IsFirstNode then exit * else begin with Table do Clicke ich aber auf einen Titel, bei dem kein Index vorhanden ist wird das Prog mit eine Fehlermeldung beendet. Es sollte so sein: 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 muß der neu erstellte Index entweder mit dem nächsten TitleClick oder vor SwitchTable gelöscht werden. Weiß nich so recht wie ich das in SwitchTable unterbringen kann. Mal sehen. Mit den besten Grüßen aus Ahlhorn Fritz |
Re: Indexfehler ??
Ich würde die Logik umdrehen:
Delphi-Quellcode:
if not TreeView.Selected.IsFirstNode then
begin ... end; |
Re: Indexfehler ??
Hallo mkinzler,
danke für den Hinweis, aber was bringt das? Habs gemacht, sehe darin keinen Vorteil und ich muß trotzdem um den ersten Eintrag zu öffnen zuerst auf den 2. oder 3. Clicken. Danach geht alles. Vielleicht ein Tipp wie man sofort den ersten öffnen kann? Mit freundlichem Gruß Fritz |
Re: Indexfehler ??
Hallo,
du darfst Table.Refresh nicht vergessen vor dem Table.Open. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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