Announcement

Collapse
No announcement yet.

Exception abfangen!!

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

  • Exception abfangen!!

    Hi Delphianer!!

    Ich möchte eine Access2000 Exception abfangen!

    In meiner Access2000 Datenbank habe ich eine referentielle Integrität
    gesetzt (ohne Löschweitergabe).

    Mit der folgenden Procedure habe ich Schwierigkeiten, denn die deletequery
    soll er nur ausführen wenn er "etable.delete;" ausführen
    kann. Das ist nämlich das was eine Exception auslöst oder nicht.
    <pre>
    begin
    try
    akey:= AmesDataModule.Etable.FieldByName('E_bez').asstrin g;
    // Versuche aktuellen DS zu löschen
    etable.delete;
    etable.edit;
    // Und wenn das keine Exception auslöst dann
    // Datensätze die mit dem aktuellen Ds verknüpft sind LÖSCHEN
    deleteQuery.close;
    deleteQuery.Sql.Clear;
    deleteQuery.Sql.Add('DELETE FROM tabelle2);
    deleteQuery.Sql.Add(Format('WHERE (e_key= "%s")', [aKey]));
    deleteQuery.ExecSQL;
    finally
    begin
    MessageDlg ('Sie können ihn nicht löschen.'+#13#10+'Er
    wird verwendet!', mtinformation, [mbok],0);
    end;
    end;
    end;
    </pre>

  • #2
    Weiteres Problem sehe ich bei dem wenn keine Verknüpfung besteht, kann ich den dann löschen oder nicht???

    Außerdem fängt er die Exception nicht richtig ab ich bekomme trotzdem eine Meldung von Access2000, das eine Beziehung besteht und das ich dewegen nicht löschen kann.

    &#10

    Comment


    • #3
      Weiteres Problem sehe ich bei dem wenn keine Verknüpfung besteht, kann ich den dann löschen oder nicht???

      Außerdem fängt er die Exception nicht richtig ab ich bekomme trotzdem eine Meldung von Access2000, das eine Beziehung besteht und das ich dewegen nicht löschen kann

      Comment


      • #4
        Du müsstest try-except-end verwenden statt try-finally-end, dann müsste es nach deinen wünschen klappen...<p>
        Gruß,<br>
        Bernhar

        Comment


        • #5
          Morgen Bernhard!!

          Hab noch ein Problem:
          Wenn die Meldung kommt möchte ich einen anderen Datensatz auswählen doch ich bekomme die Fehlermeldung <b>" Das Zeilenhandle bezog sich auf eine gelöschte oder zum löschen markierte Zeile" </b>

          Ich muß irgendwie aus dem Löschmodus wieder raus!!! <b> Kannst du mir sagen wie? </b>

          BINE :_

          Comment


          • #6
            <p>Hallo Bine,<br>
            <br>
            wenn Du Dir nachfolgendes Codefragment einmal genauer anschaust, wirst Du erkennen, dass bereits Daten gelöscht wurden.<br>
            <br>
            <pre>
            // Versuche aktuellen DS zu löschen
            etable.delete;
            etable.edit;
            </pre>
            <br>
            Danach wird die SQL-Anweisung ausgeführt. Tritt dort ein Fehler auf, ist es zu spät, weil bereits gelöscht wurde. Außerdem ist die Tabelle auch noch im Edit-Modus?<br>
            <br>
            Gruß Thomas</p&gt

            Comment


            • #7
              Morgen Thomas!

              Das ist das was ich im Mail gemeint habe!!

              Außerdem habe ich noch ein Problem weil er, glaube ich, immer meckert (also ein exception auswirft) egal ob der aktuelle Datensatz mit einem Datensatz in der anderen Tabelle verknüpft ist, weil ja eine Beziehung besteht!! Ich möchte aber nur das er meckert wenn in der anderen Tabelle ein wert steht der mit dem aktuellen datensatz verknüpft ist.

              Ich habe versucht es einfach zu erklären, falls noch fragen sind <b>bitte fragen</b>

              BINE :_

              Comment


              • #8
                Hi Thomas!

                Das ist das was ich im Mail gemeint habe!!

                Wirft Access immer eine Exception aus egal ob der aktuelle Datensatz mit einem Datensatz in der anderen Tabelle verknüpft ist oder nicht??

                Eigentlich müßte er schon denn es besteht ja eine Beziehung oder?!!

                Ich möchte das er nur dann eine Meldung auswirft wenn der aktuellen datensatz den gleichen wert wie die Tabelle mit der eine Beziehung besteht.

                <b> Ich erklärs anhand eines Beispiel!! </b>

                Mal angenommen sie verwalten Stammdaten(z.b CD's) und Rechnungen.
                Und mal angenommmen sie wollen einen Artikel löschen weil es ihn nicht mehr gibt (oder sie haben sich verschrieben usw.)
                Nun soll das Programm prüfen (oder die Datenbank!) ob eine Rechnung mit dieser Cd existiert, denn dann kann er diese Cd nicht löschen!!

                Mal angenommen sie haben sich nur verschrieben oder er steht doppelt drinnen (halt anderes geschrieben!) dann soll er ihn löschen können!!

                Wie händle ich das?? Ich schätze das Access immer schreit oder??

                BINE :_

                Comment


                • #9
                  Hallo!

                  Hast du eine Lösung für mich??

                  Wie kann ich zuerst überprüfen ob ich löschen kann und dann wenn es geht erst löschen? Kannst du mir helfen?

                  Comment


                  • #10
                    Kann ich nicht abfragen

                    If (eine exception) then ...
                    else
                    blabla

                    Kann das so gehen??

                    <b>Oder</b>

                    Kann ich das Löschen nicht simulieren???
                    und dann die exeption abfangen??

                    Weiß den keiner Rat??

                    BINE :_

                    Comment


                    • #11
                      Hallo,

                      als Erstes würde ich mir einen Überblick verschaffen, <b>bei welchem</b> Aufruf die Exception ausgelöst wird (Delete oder Edit). Der Vorteil des Exception-Handling liegt ja gerade darin, dass lästige If-Abfragen (die eine Fehlersituation abprüfen sollen) vermieden werden. In einem TRY..EXCEPT-Block springt die Ausführung bei einer ausgelösten Exception sofort zur ersten EXCEPT-Zeile. Und dort kann man beim <b>Error</b>-Objekt von ADO nachfragen, was eigentlich passiert ist. Da hier auch die originalen Fehlernummern der Jet Engine vermerkt werden, kann das Programm spezifisch auf jede Fehlersituation reagieren. Das folgende Beispiel für eine SQL Server 7-Datenbank demonstriert das Auslesen des Error-Objekts:
                      <pre>
                      procedure TForm1.BitBtnErrorClick(Sender: TObject);
                      var
                      cValue : Currency;
                      iError : Integer;
                      sError : String;
                      begin
                      sError := '';
                      cValue := StrToFloat(EditDM.Text);
                      ADOConnection1.BeginTrans;
                      try
                      with ADOStoredProcTransfer do
                      begin
                      Parameters[1].Value := cValue;
                      Parameters[2].Value := ADOStoredProcAuswertungKdnNr.Value;
                      ExecProc;
                      end;
                      except
                      for iError := 0 to ADOConnection1.Errors.Count - 1 do
                      sError := sError + ADOConnection1.Errors[iError].Description + #10#13;
                      ShowMessage(sError);
                      if ADOConnection1.InTransaction then
                      ADOConnection1.RollbackTrans;
                      end;
                      if ADOConnection1.InTransaction then
                      ADOConnection1.CommitTrans;
                      ADOStoredProcAuswertung.Active := False;
                      ADOStoredProcAuswertung.Active := True;
                      end;
                      </pre>
                      Situationsbedingt kann man nun <br>
                      a) die TADOTable-Methode <b>Cancel</b> aufrufen, <br>
                      b) die TADOTable schliessen und neu öffnen <br>
                      c) das Error-Objekt über den Aufruf von <b>Clear</b> zurücksetzen.

                      P.S: Die von ADO erwartete Fehlerbehandlung kann im MDAC SDK auf der Seite <i>Errors Collection and Error Object </i> nachgelesen werden. Dort ist auch ein Beispiel für Visual Basic zu finden, das 1:1 in Delphi übernommen werden kann (da ja auch Delphi nur auf die ADO-Objekte von Microsoft aufsetzt).

                      Comment


                      • #12
                        Also ich habe mir den Code angesehen er springt bei<pre>etable.delete; </pre> auf die EXCEPT Anweisung

                        Comment


                        • #13
                          Hallo,

                          wunderbar, also funktioniert das Exception-Handling ;-)

                          Jetzt würde ich nur noch kontrollieren, aus welchem Grund (oder welchen Gründen) die Exception ausgelöst wurde, indem die Errors-Kollektion ausgelesen und angezeigt wird. Findet man dort keine unerwartete Fehlermeldung vor, kann über den Aufruf von <b>etable.Cancel</b> und <b>ADOConnection1.Errors.Clear</b> versucht werden, das Ganze zurückzusetzen

                          Comment


                          • #14
                            Folgendes problem habe ich noch immer:

                            Also das das Exception-Handling fkt wissen wir!!

                            Aber ein Problem habe ich noch bei der Ausführung der SQL Anweisung!!

                            Ich weiß nicht wie ich die verknüpften Details von der etable löschen kann. Wie Thomas Melcher schon beanstandet hat.

                            Das ist mein jetziger Code!

                            <pre>
                            begin
                            try
                            begin
                            akey:= Etable.FieldByName('E_key').asstring;
                            // Versuche aktuellen DS zu löschen
                            etable.delete;
                            etable.edit;
                            deleteQuery.close;
                            deleteQuery.Sql.Clear;
                            deleteQuery.Sql.Add('DELETE FROM tabelle2);
                            deleteQuery.Sql.Add(Format('WHERE (e_key= "%s")', [aKey]));
                            deleteQuery.ExecSQL;
                            setbuttons(0);
                            setrefresh(2);
                            end;
                            except
                            begin
                            MessageDlg ('Sie können ihn nicht löschen.'+#13#10+'Er wird verwendet!',
                            mtinformation, [mbok],0);
                            ADOConnection.Errors.Clear;
                            end;
                            end;

                            </pre>

                            Und bei <pre> deleteQuery.ExecSQL; </pre>

                            Springt er mir immer auf die except anweisung.

                            BINE :_(

                            Comment


                            • #15
                              Gibts keine Lösung??

                              Comment

                              Working...
                              X