AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indexfehler ??

Ein Thema von Fritz01 · begonnen am 27. Nov 2007 · letzter Beitrag vom 2. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#1

Indexfehler ??

  Alt 27. Nov 2007, 19:17
Datenbank: Absolute Database • Version: 5.14 • Zugriff über: Table / DataSource
Hallo,
in meinem Prog. werden im Grid Daten angezeigt, die mit onTitleClick einen Index erhalten und sortiert im Grid erscheinen.
Delphi-Quellcode:
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
Die neu erzeugten Indizies werden in einer Liste ‚gesammelt’.
Damit die Tabelle nicht geändert wird, werden die neu erstellten Indizies gemäß dieser Liste wieder gelöscht.
Delphi-Quellcode:
Table.DeleteIndex(sIndexList[cnt]); // index aus table
   sIndexList.Delete(cnt); // index aus stringlist
   Table.IndexDefs.Update; // indexdefinition aktualisieren
   Table.StoreDefs := False;
Das ist auch soweit OK.
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:
SelectTable(TreeView.Selected.Text);
    Table.Close; // active Table schließen
    Table.TableName := TreeView.Selected.Text; // neue Tabelle
    Table.Open;
Warum wird da ein nicht mehr vorhandenr Index gesucht, wo liegt da eventuell der Fehler?
Habe schon einige Zeit mit Fehlersuche verbracht und nichts gefunden, vielleicht hat ja von Euch eine eine hilfreiche Idee dazu. Danke
Fritz aus Ahlhorn
Fritz
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#2

Re: Indexfehler ??

  Alt 27. Nov 2007, 21:33
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:
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;
Da muß doch noch ein Index der alten Tabelle sein, der in der neuen Tabelle nicht vorhanden ist.
Wie kriege ich den da weg, was muß ich da machen?
Fritz
Fritz
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#3

Re: Indexfehler ??

  Alt 27. Nov 2007, 22:19
Zitat von Fritz01:
Da muß doch noch ein Index der alten Tabelle sein, der in der neuen Tabelle nicht vorhanden ist.
Wie kriege ich den da weg, was muß ich da machen?Fritz
Nach dem Table.Close auf jeden Fall Table.IndexName := '' setzen

Delphi-Quellcode:
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;
Was verbirgt sich hinter der Funktion/Prozedur SelectTable()?
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#4

Re: Indexfehler ??

  Alt 28. Nov 2007, 00:26
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:
Was verbirgt sich hinter der Funktion/Prozedur SelectTable()?
Delphi-Quellcode:
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;
Erst mal genug für heute, morgen werde ich weitersehen.
Fritz
Fritz
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Indexfehler ??

  Alt 28. Nov 2007, 09:28
Hallo Fritz,

vom Prinzip her solltest du folgende Struktur verwenden können:

Delphi-Quellcode:
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.
Getippt und nicht getestet.

Freundliche Grüße
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#6

Re: Indexfehler ??

  Alt 28. Nov 2007, 13:39
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
Fritz
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#7

Re: Indexfehler ??

  Alt 28. Nov 2007, 19:17
@ 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:
begin
* if TreeView.Selected.IsFirstNode then exit
* else
  begin
    with Table do
Bei 'SwitchIndex' kann ich nur bereits vorhandene Indizies nutzen! (Aber der Tabellenwechsel ist OK.)
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
Fritz
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Indexfehler ??

  Alt 28. Nov 2007, 19:30
Ich würde die Logik umdrehen:
Delphi-Quellcode:
if not TreeView.Selected.IsFirstNode then
begin
   ...
end;
Markus Kinzler
  Mit Zitat antworten Zitat
Fritz01

Registriert seit: 22. Mär 2006
Ort: Großenkneten
181 Beiträge
 
Delphi 7 Professional
 
#9

Re: Indexfehler ??

  Alt 28. Nov 2007, 19:44
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
Fritz
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Indexfehler ??

  Alt 29. Nov 2007, 11:03
Hallo,

du darfst Table.Refresh nicht vergessen vor dem Table.Open.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:01 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