Announcement

Collapse
No announcement yet.

Phänomene in der BDE ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Phänomene in der BDE ?

    Hallo alle zusammen.

    Ich versuch gerade mit der Filterfunktion der TTable zurechtzukommen.
    Dabei tauchen einige merkwürdige Phänome auf. Vielleicht hat ja jemand
    einen Tip für mich.

    Entwicklungsumgebung: Delphi 3.0, Paradox 7.0, Windows NT.

    <b>1. Suchen von Text mit * geht nicht</b>

    Eine Tabelle enthält eine Reihe von Strings. In diesen String möchte
    ich Zeilen suchen, die einen bestimmten Teilstring enthalten. Über
    einen SQL Befehl ist das kein Problem, ausser das hier mit einem %
    gesucht wird:

    SELECT DateTime,MsgStr FROM MsgHis.db WHERE Upper(MsgStr) LIKE 'Error%'

    Per Filter funktion der TTable will das überhaupt nicht funktionieren:

    xTable.Filter := 'MsgStr = ''Error*''';
    xTable.Filtered := true;

    Ich bekomme immer eine leere Menge ins DBGrid zurück. Nur wenn ich den
    kompletten Inhalt eines Tabelleneintrages übergebe, bekomme ich ihn
    auch ordentlich zurück.

    Was ist da los?

    <b>2. Funktioniert .Filtered := false nicht ?</b<

    Folgender Ablauf wurde programmiert:

    Einer Tabelle wird ein TableName := 'Table1' zugewiesen
    Der Tabelle wird ein Filter := 'Hallo < 4' zugewiesen
    Die Tabelle wird geöffnet
    Der Filter wird enabled
    Der Zugrif ist erfolgreich
    Der Filter wird disabled
    Die Tabelle wird geschlossen
    Der Tabelle wird ein TableName := 'Table2' zugewiesen
    Die Tabelle wird geöffnet

    Obwohl die Filterfunktion disabled ist, wird mit der Filtereinstellung
    gearbeitet und es kommt zu einem Fehler, weil die Filterbedingung für
    eine andere Tabelle natürlich nicht erfüllt werden kann.

    Das Problem konnte nur folgendermassen gelöst werden:

    Der Tabelle wird ein TableName := 'Table2' zugewiesen
    Dem Filter wird ein Leerstring zugewiesen: Filter := ''
    Die Tabelle wird geöffnet
    Der Zugrif ist erfolgreich
    Die Tabelle wird geschlossen

    Was ist da los? Das Ausschalten des Filters scheint nicht zu funktionieren.

    <b>3. Paradox File Format</b>

    Nachdem ich mir eine Paradox Tabelle zerlegt habe, die auch nicht mit dem
    Paradox eigenen Reparaturprogramm wiederhergestellt werden konnte, habe
    ich nach Informationen im Internet gesucht und auch gefunden. Damit
    konnte ich tatsächlich die Tabelle mit einem Hexeditor erfolgreich
    restaurieren. Ich habe die Informationen zusammengeführt, übersetzt
    und um einige Kleinigkeiten erweitert.
    Wer interesse daran hat, kann sie bei mir per E-Mail anfordern. Es sind
    6 RTF Dateien (gezipt ca. 22kB): FileDB.rtf, FileMB.rtf, FilePX.rtf,
    FileXxx.rtf, FileYxx.rtf und Allgemeines.rtf.

    [email protected]

    Gruß an Alle.

  • #2
    Hallo,

    die Effekte kann ich (mit Delphi 5) nicht nachvollziehen. Mit der Delphi-Beispieldatenbank DBDEMOS kann die Tabelle COUNTRY nach dem Anfangsbuchstaben des Landes gefiltert werden. Im Eingabefeld <i>EditFilter</i> wird dazu die Filterbedingung <b>Name = 'B*'</b> eingetragen und kann zur Laufzeit durch andere Buchstaben ersetzt werden. Nach dem erneuten Klick auf den Button zeigt die Datenmenge die korrekten Daten an:

    <pre>
    procedure TForm1.ButtonFilterOffClick(Sender: TObject);
    begin
    with TableCOUNTRY do
    begin
    Active := False;
    Filtered := False;
    Filter := '';
    end;
    end;

    procedure TForm1.ButtonFilterOnClick(Sender: TObject);
    begin
    with TableCOUNTRY do
    begin
    Active := False;
    Filter := EditFilter.Text; // In EditFilter steht: Name = 'B*'
    Filtered := True;
    Active := True;
    end;
    end;
    </pre>

    Das Eingabefeld <i>EditFilter</i> wird im Objektinspektor vorbelegt:
    <pre>
    object EditFilter: TEdit
    Left = 24
    Top = 200
    Width = 105
    Height = 21
    TabOrder = 3
    Text = 'Name = '#39'B*'#39
    end
    </pre>

    Wenn man sich den Source-Code der VCL (Unit DBTables) einmal anschaut, findet man auch den Grund, warum die Eigenschaft <b>Filter</b> explizit immer dann geleert werden muss, wenn eine andere (!) Tabelle geöffnet werden soll. Für die Filterung ist nicht die VCL, sondern ausschliesslich die BDE zuständig. Somit wird beim folgenden Beispiel auch nach dem Tabellenwechsel der vollständige (ungefilterte) Datenbestand angezeigt:

    <pre>
    procedure TForm1.ButtonChangeTableClick(Sender: TObject);
    begin
    with TableCOUNTRY do
    begin
    Active := False;
    Filtered := False;
    Filter := '';
    TableName := 'CLIENTS.DBF';
    Active := True;
    end;
    end;
    </pre>
    &#10

    Comment


    • #3
      Hallo Herr Kosch

      Die Filterfunktion funktioniert jetzt, aber erst nachdem ich die TTable und TDataSource Komponente gelöscht und wieder neu eingefügt habe. Das Warum ist mir jedoch noch ein Rätsel.
      Dabei ist mir jedoch aufgefallen, das die Vergleiche immer ab Zeilenanfang stattfinden. Gibt es eine Möglichkeit einen Vergleich an beliebiger Stringposition durchzuführen, also ein *Nam* ?

      Vielen Dank für ihre schnelle Hilfe ... Uwe Mnic

      Comment

      Working...
      X