Announcement

Collapse
No announcement yet.

gelöschte Sätze in DBase Tabelle erkennen/bearbeiten

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

  • gelöschte Sätze in DBase Tabelle erkennen/bearbeiten

    Hallo,

    ich habe unter D5 eine DBase Tabelle. Mit locate will ich nun einen Datensatz suchen. Wird dieser gefunden will ich überprüfen, ob der Satz gelöscht ist.
    Nun habe ich folgende Probleme:

    1. Der Datensatz wird überhaupt nicht gefunden, obwohl er mit Löschkennung vorhanden ist.
    2. Wenn Punkt 1 gelöst und der Satz gefunden wird, wie kann ich erkennen ob in einer DBase Tabelle der entsprechende Datensatz eine Löschkennung besitzt.
    3. wenn der Satz gelöscht ist, wie kann ich den Satz wiederherstellen?

    gibt es hierzu eine Möglichkeit?

    Thomas

  • #2
    Hallo,

    das folgende (etwas betagte) Beispiel demonstriert den Zugriff auf "gelöschte" dBASE-Datensätze. Das Programm nutzt ein berechnetes Feld (siehe <i>Feld-Editor</i>), um über die IDAPI-Funktion <b>DbiGetRecord</b> das zusätzliche Attribut <b>bDeleteFlag</b> des aktuellen Datensatzes auszulesen. Allerdings muss das Programm die BDE vorher davon informieren (<b>DbiSetProp</b> + <b>curSOFTDELETEON</b>), dass diese Daten benötigt werden:
    <pre>
    { ************************************************** **************
    Source File Name : ShowDelF.PAS
    Typ : Form-Unit
    Autor : Andreas Kosch
    Erstellt am : 09.04.1996
    Compiler : Delphi 2.0
    Betriebssystem : Windows 95

    Beschreibung : Demonstriert das wahlweise Anzeigen von
    gelöschten dBASE-Datensätzen (dBASE setzt
    jeweils beim Löschen eines Datensatzen nur
    eine Löschmarkierung).

    Revisionen : -
    ************************************************** ************** }

    unit ShowDelF;

    interface

    uses
    SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
    DBTables, DB, StdCtrls, ExtCtrls, Grids, DBGrids, DBCtrls, Buttons,
    ComCtrls;

    type
    TFormMain = class(TForm)
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    RadioGroup1: TRadioGroup;
    RadioButtonYes: TRadioButton;
    RadioButtonNo: TRadioButton;
    Table1: TTable;
    DataSource1: TDataSource;
    Table1RECNR: TFloatField;
    Table1VORNAME: TStringField;
    Table1NACHNAME: TStringField;
    Table1DEL: TStringField;
    StatusBar1: TStatusBar;
    BitBtnClose: TBitBtn;
    procedure Table1CalcFields(DataSet: TDataSet);
    procedure RadioButtonYesClick(Sender: TObject);
    procedure RadioButtonNoClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BitBtnCloseClick(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    FormMain: TFormMain;

    implementation

    uses BDE; // BDE-Unit für die IDAPI-Aufrufe

    {$R *.DFM}

    (* Ereignisbehandlungsmethode auf das OnCalcField-Ereignis der
    TTable-Komponente. Damit eine Auswertung hier möglich wird,
    muß beim Einrichten des berechneten Feldes »Table1DEL« das
    Auswahlfeld »Calculated« ausgewählt werden. *)

    procedure TFormMain.Table1CalcFields(DataSet: TDataSet);
    var
    aRecProps : RECProps; // IDAPI-Struktur
    begin
    if RadioButtonYes.Checked then // Ja-Radiobutton aktiv
    begin
    with Table1 do
    begin
    // Datensatzeigenschaften per IDAPI auslesen
    Check(DbiGetRecord(Handle, DbiNoLock, nil, @aRecProps));
    // Feldinhalt des berechneten Feldes setzen
    if aRecProps.bDeleteFlag then Table1DEL.Value := '#'
    else Table1DEL.Value := ''
    end
    end
    end;

    (* Anzeige der gelöschten Datensätze aktivieren *)

    procedure TFormMain.RadioButtonYesClick(Sender: TObject);
    begin
    with Table1 do
    begin
    DisableControls; // kosmetische Aktion
    try
    // Tabellencursor-Eigenschaft setzen
    Check(DbiSetProp(hDbiObj(Handle), curSOFTDELETEON, 1))
    finally
    Refresh; // Tabelleninhalt auffrischen
    EnableControls
    end
    end
    end;

    (* Anzeige der gelöschten Datensätze deaktivieren *)

    procedure TFormMain.RadioButtonNoClick(Sender: TObject);
    begin
    with Table1 do
    begin
    DisableControls;
    try
    // BDE-Tabellencursor synchronisieren
    UpdateCursorPos;
    // Tabellencursor-Eigenschaft setzen
    Check(DbiSetProp(hDbiObj(Handle), curSOFTDELETEON, 0))
    finally
    Refresh; // Tabelleninhalt auffrischen
    EnableControls
    end
    end
    end;

    (* Tabellenname in der Statuszeile anzeigen *)

    procedure TFormMain.FormCreate(Sender: TObject);
    begin
    StatusBar1.SimpleText := Table1.TableName
    end;

    procedure TFormMain.BitBtnCloseClick(Sender: TObject);
    begin
    Close
    end;

    end.
    </pre&gt

    Comment


    • #3
      Vielen herzlichen Dank Hr. Kosch, funktioniert super

      Comment

      Working...
      X