Announcement

Collapse
No announcement yet.

Paradox TBatchMove ==> Fehler "Tabelle gesperrt...UserID..."

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

  • Paradox TBatchMove ==> Fehler "Tabelle gesperrt...UserID..."

    Hallo folgendes Problem:

    Eine Tabelle wird von User 1 geöffnet.
    User 2 möchte auf diese Tabelle einen BatchMove mit Mode batcopy durchführen. Da Batch.Execute zu einer Exception führt (Tabelle kann schließlich nicht gelöscht werden, da User1 die Tabelle benutzt), habe ich eine try .. except - Anweisung eingebaut.

    Nun erscheint zwar meine Fehlermeldung und das Programm stürzt auch nicht mehr ab, aber die Original-Fehlermeldung der Exception erscheint nicht mehr und man kann nicht mehr sehen, welcher User auf der Tabelle hängt.

    Wie kann ich in meinem Befehl einbauen, daß die UserID desjenigen sichtbar ist, der auf Tabelle hängt. Gibt es da spezielle Befehle für?

    Grüße,
    Carsten

  • #2
    Hallo, weiß hierzu kein Profi rat? Ich kann mir vorstellen, daß es irgendwie mit dem Abfangen der Exception was zu tun haben muß.

    Doch wie genau kann ich die Original-Fehlermeldung abfangen.
    Gibt es soetwas wie showmessage(OnEDatabaseError.Text). Wäre für jede Information von Hintergrundwissen dazu dankbar.

    Grüße,
    Carste

    Comment


    • #3
      Hallo,

      >Doch wie genau kann ich die Original-Fehlermeldung abfangen

      Borland hat zu Zeiten von Delphi 2 das folgende Beispiel veröffentlicht. Um diese Funktion in eigenen Projekten nachzurüsten, müssen Sie die Unit "DBEngine" in die USES-Klausel mit aufnehmen. Um den Exception-Handler zu aktivieren, wird die zu prüfende Aktion
      in aus einem TRY...EXCEPT-Block heraus aufgerufen.

      Beispiel:
      <pre>
      try
      Table1.Open
      except
      DBError.HandleException(Exception(ExceptObject));
      end;
      </pre>
      Unit:
      <pre>
      // Delphi 2 Database error handling example
      // Borland International 1996
      // Simply include this unit in your uses clause and call the HandleException
      // method when necessary.

      // 7.2.97 Kommentare aus dem Englischen übersetzt

      unit dbengine;

      interface

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

      type
      TDBError = class(TForm)
      Panel1: TPanel;
      Error1: TLabel;
      Error2: TLabel;
      Error3: TLabel;
      Error4: TLabel;
      Panel2: TPanel;
      NativeCode: TLabel;
      DoneBtn: TBitBtn;
      NatBtn: TBitBtn;
      procedure Button1Click(Sender: TObject);
      procedure SizeErrorDialog(MaxStringSize: integer; Errors: word);
      procedure NatBtnClick(Sender: TObject);
      private
      { Private declarations }
      procedure ResetControls(Title: string);
      procedure CreateDBEngineError(E: EDBEngineError);
      procedure ShowEDatabaseError(E: EDatabaseError);
      procedure EnableErrorBox(Count: integer; Enable, Visible: boolean);
      public
      { Public declarations }
      procedure HandleException(E: Exception);
      end;

      var
      DBError: TDBError;

      implementation

      {$R *.DFM}

      // Komponenten im Formular initialisieren
      procedure TDBError.ResetControls(Title: string);
      begin
      Error1.Visible := False;
      Error2.Visible := False;
      Error3.Visible := False;
      Error4.Visible := False;
      Error1.AutoSize := True;
      Error2.AutoSize := True;
      Error3.AutoSize := True;
      Error4.AutoSize := True;
      NatBtn.Enabled := False;
      Caption := Title;
      end;

      (* Diese Methode wird immer dann aufgerufen, wenn ein EDatabaseError
      auftrag. Der Hinweistext zum Fehler wird nur angezeigt. *)

      procedure TDBError.ShowEDatabaseError(E: EDatabaseError);
      var
      StringSize: integer;
      begin
      ResetControls('EDatabase-Fehler entdeckt');
      Error1.Caption := E.Message + '.';
      StringSize := Canvas.TextWidth(Error1.Caption);
      SizeErrorDialog(StringSize, 1);
      EnableErrorBox(1, True, False);
      end;

      (* Ermittelt, welcher Exception-Typ aufgetreten ist und ruft
      dann die entsprechende Methode auf. *)

      procedure TDBError.HandleException(E: Exception);
      begin
      if E is EDBEngineError then
      DBError.CreateDBEngineError(EDBEngineError(E))
      else
      if E is EDatabaseError
      then ShowEDatabaseError(EDatabaseError(E))
      else Application.ShowException(E);
      end;

      (* Je nach der Anzahl der Hinweise zum aufgetretenen Fehler wird
      das Fehler-Formular angepaßt und daraufhin angezeigt. *)

      procedure TDBError.EnableErrorBox(Count: integer; Enable, Visible: boolean);
      begin
      Error1.AutoSize := False;
      Error2.AutoSize := False;
      Error3.AutoSize := False;
      Error4.AutoSize := False;
      Error1.Height := 13;
      Error2.Height := 13;
      Error3.Height := 13;
      Error4.Height := 13;
      if Count >= 1 then Error1.Visible := True;
      if Count >= 2 then Error2.Visible := True;
      if Count >= 3 then Error3.Visible := True;
      if Count >= 4 then Error4.Visible := True;
      NatBtn.Enabled := Enable;
      NatBtn.Visible := Visible;
      ShowModal;
      end;

      (* Die Größe des Fehler-Formular wird so geändert, daß der komplette
      Hinweistext angezeigt wird. *)

      procedure TDBError.SizeErrorDialog(MaxStringSize: integer; Errors: word);
      begin
      NativeCode.Width := 0;
      Panel1.Width := MaxStringSize + 16;
      Width := MaxStringSize + 30;
      case Errors of
      1: Panel1.Height := 30;
      2: Panel1.Height := 44;
      3: Panel1.Height := 58;
      4: Panel1.Height := 72;
      end;
      Height := Panel1.Height + 63;
      DoneBtn.Top := Height - 53;
      NatBtn.Top := DoneBtn.Top;
      end;

      (* Hinweistext für EDBEngineError-Exception generieren. *)

      procedure TDBError.CreateDBEngineError(E: EDBEngineError);
      var
      StringSize : Integer;
      ButtonEnable : boolean;
      begin
      ResetControls('EDBEngine-Fehler entdeckt');
      ButtonEnable := False;
      Error1.Visible := False;
      Error2.Visible := False;
      Error3.Visible := False;
      Error4.Visible := False;
      NatBtn.Enabled := False;
      StringSize := 0;
      NativeCode.Caption := 'Fehlerursache: Code(s) ';
      if E.ErrorCount >= 1 then begin
      Error1.Caption := Format('Eintrag: 0, Fehlernummer: %d, %s',
      [E.Errors[0].ErrorCode, E.Errors[0].Message]);
      StringSize := Canvas.TextWidth(Error1.Caption);
      if E.Errors[0].NativeError <> 0 then begin
      ButtonEnable := True;
      NativeCode.Caption := Format('%s %d, %s',
      [NativeCode.Caption, E.Errors[0].NativeError, E.Errors[0].Message]);
      end;
      end;
      if E.ErrorCount >= 2 then begin
      Error2.Caption := Format('Eintrag: 1, Fehlernummer: %d, %s',
      [E.Errors[1].ErrorCode, E.Errors[1].Message]);
      if Canvas.TextWidth(Error2.Caption) > StringSize then
      StringSize := Canvas.TextWidth(Error2.Caption);
      if E.Errors[1].NativeError <> 0 then begin
      ButtonEnable := True;
      NativeCode.Caption := Format('%s %d, %s',
      [NativeCode.Caption, E.Errors[1].NativeError, E.Errors[1].Message]);
      end;
      end;
      if E.ErrorCount >= 3 then begin
      Error3.Caption := Format('Eintrag: 2, Fehlernummer: %d, %s',
      [E.Errors[2].ErrorCode, E.Errors[2].Message]);
      if Canvas.TextWidth(Error3.Caption) > StringSize then
      StringSize := Canvas.TextWidth(Error3.Caption);
      if E.Errors[2].NativeError <> 0 then begin
      ButtonEnable := True;
      NativeCode.Caption := Format('%s %d, %s',
      [NativeCode.Caption, E.Errors[2].NativeError, E.Errors[2].Message]);
      end;
      end;
      if E.ErrorCount >= 4 then begin
      Error4.Caption := Format('Eintrag: 3, Fehlernummer: %d, %s',
      [E.Errors[3].ErrorCode, E.Errors[3].Message]);
      if Canvas.TextWidth(Error4.Caption) > StringSize then
      StringSize := Canvas.TextWidth(Error4.Caption);
      if E.Errors[3].NativeError <> 0 then begin
      ButtonEnable := True;
      NativeCode.Caption := Format('%s %d, %s',
      [NativeCode.Caption, E.Errors[3].NativeError, E.Errors[3].Message]);
      end;
      end;
      SizeErrorDialog(StringSize, E.ErrorCount);
      EnableErrorBox(E.ErrorCount, ButtonEnable, True);
      end;

      (* Anwender will zusätzliche Fehlerinformationen -> das
      Formular vergrößern. *)

      procedure TDBError.NatBtnClick(Sender: TObject);
      begin
      NatBtn.Enabled := False;
      Panel2.Top := DoneBtn.Top + 31;
      Panel2.Width := Panel1.Width;
      Height := Height + 43;
      NativeCode.Width := Panel2.Width - 15;
      end;

      procedure TDBError.Button1Click(Sender: TObject);
      begin
      Close;
      end;

      (* Beim Programmstart wird gleich eine Instanz des Fehlerdialogs
      initialisiert. Der Eigentümer "Application" ist beim Programm-
      ende für das Abräumen der Ressourcen zuständig. *)

      initialization
      // Fehler-Formular erzeugen
      DBError := TDBError.Create(Application);
      end.
      </pre&gt

      Comment


      • #4
        Hallo Herr Kosch,

        vielen Dank für Ihren Tip. Doch leider ist in meiner Delphi 5 Enterprise Version Update Pack 1 die Unit "DBEngine" nicht vorhanden.

        Beim Versuch, aus Ihrem Quellcode heraus die o.a. Unit neu anzulegen erscheint beim Compilieren in Delphi der Fehler:
        "Datei nicht gefunden: 'dbengine.DFM' !!!

        Ist diese Datei nur bei Delphi 2 vorhanden oder ist an meiner Delphi-Installation etwas falsch

        Comment


        • #5
          Hallo,

          die Dateien müssen von der Download-Seite von Borland heruntergeladen werden (Developersupport-Bereich der BDE). Das folgende ZIP-Archiv für ein Beispiel hilft aber auch weiter

          Comment


          • #6
            Danke Koschi,

            genau das was ich suchte, Habe gestern noch versucht, selbst so ein Formular zu kreieren, aber bei der Fehlermeldung war die Formatierung meines Formulars nicht so schön, wie in Deinem jetzt angehangten Zip-File.

            Vielen Dank für Deine Hilfe. Deine Bücher sind echt spitze

            Comment

            Working...
            X