Announcement

Collapse
No announcement yet.

Fehlende, da gelöschte MDX-Datei verhindert neuen Index

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

  • Fehlende, da gelöschte MDX-Datei verhindert neuen Index

    Hallo!
    Ich kann während der Laufzeit einen Index für meine DBaseIV Tabelle erstellen. Wenn ich jedoch die Indexdatei lösche und die Anwendung neu starte, kann das Programm keinen neuen Index erstellen. Fehlermeldung: 'Index nicht vorhanden'

    Was muß ich tun um das zu verhindern?

    Vielen Dank im Voraus.

    Peter

  • #2
    Hallo,

    in diesem Fall muss im DBF-Header das MDX-Flag entfernt werden, damit die BDE nicht mehr nach einer Index-Datei sucht, die nicht mehr zur Verfügung steht. Ich habe hier nur das folgende Delphi 1-Beispiel zur Hand, das aus meinem 1995 erschienenen ersten Buch (<i>Delphi Lösungen</i>) stammt:
    <pre>
    unit Delmdxf;

    interface

    uses
    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
    Forms, Dialogs, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls, Menus;

    type
    TMainForm = class(TForm)
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    Table1: TTable;
    DataSource1: TDataSource;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    MDOpen: TMenuItem;
    N1: TMenuItem;
    MDExit: TMenuItem;
    Bearbeiten1: TMenuItem;
    MBDeleteFlag: TMenuItem;
    OpenDialog1: TOpenDialog;
    procedure MDOpenClick(Sender: TObject);
    procedure MDExitClick(Sender: TObject);
    private
    { Private-Deklarationen }
    procedure KillMDXFlag(sDBFName : String);
    public
    { Public-Deklarationen }
    end;

    var
    MainForm: TMainForm;

    implementation

    {$R *.DFM}

    (* dBase-Tabell öffnen *)

    procedure TMainForm.MDOpenClick(Sender: TObject);
    var
    sTableFile : String[80];
    sFileExt : String[4];
    begin
    if OpenDialog1.Execute then
    begin
    { ausgewählten Zieldateiname zuweisen }
    sTableFile := OpenDialog1.Filename;
    sFileExt := ExtractFileExt(sTableFile);
    { Sicherheitsabfrage }
    if (sFileExt <> '.DBF') then Abort;
    with Table1 do
    begin
    if Active then Active := False;
    TableName := sTableFile;
    try
    Active := True;
    DBGrid1.Visible := True
    except
    on E: EDBEngineError do
    begin
    { Original-Fehlertext ausgeben }
    ShowMessage(E.Message);
    { Beim MDX-Fehler Alternative aufzeigen }
    if MessageDlg('Soll das MDX-Flag beseitigt werden',
    mtWarning, [mbYes, mbNo], 0) = mrYes then
    { MDX-Flag in der Datei überschreiben !!! }
    KillMDXFlag(sTableFile);
    end { on E: EDBEngineError }
    end
    end { with Table 1 }
    end
    end;

    procedure TMainForm.MDExitClick(Sender: TObject);
    begin
    Close
    end;

    (* Brechstangenprinzip : Im Header der DBF-Datei wird
    das MDX-Flag überschrieben !
    DBF-Header ist 32 Bytes groß, das Byte 28 kann die
    folgenden Werte annehmen :
    0 = keinen MDX-Arbeitsindex verwenden
    1 = MDX-Arbeitsindex verwenden *)

    procedure TMainForm.KillMDXFlag(sDBFName : String);
    const
    byteNewValue : Byte = 0;
    var
    iFileHandle : Integer;
    szDBFName : array[0..255] of Char;
    byteOrgValue : Byte;
    begin
    StrPCopy(szDBFName, sDBFName);
    { Windows-API-Funktion zum Dateizugriff verwenden }
    iFileHandle:= _lopen(szDBFName, OF_READWRITE);
    try
    { Hexadezimalwert 1C entsprecht 28 }
    _llseek(iFileHandle, $1C, 0);
    _lread(iFileHandle, PChar(@byteOrgValue), 1);
    { wurde der Wert 1 = MDX vorgefunden ? }
    if byteOrgValue = 1 then
    begin
    { neuen Wert in die DBF-Datei schreiben }
    _llseek(iFileHandle, $1C, 0);
    _lwrite(iFileHandle, PChar(@byteNewValue), 1);
    { Benutzer informieren }
    ShowMessage('Tabelle bitte erneut öffnen')
    end
    else ShowMessage('Kein MDX-Flag in der DBF gefunden !');
    finally
    { DBF-Datei schließen }
    _lclose(iFileHandle)
    end
    end;

    end.
    </pre&gt

    Comment

    Working...
    X