Announcement

Collapse
No announcement yet.

Frage zum DBNavigator und dem BeforeAction-Ereignis

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

  • Frage zum DBNavigator und dem BeforeAction-Ereignis

    Hallo,<br>
    <br>
    folgendes Problem:<br>
    in einem DBGrid möchte ich einen beliebigen Datensatz über das Delete-Icon des DBNavigators löschen. Bevor der Datensatz jedoch gelöscht werden kann, muss anhand bestimmter Einträge im Datensatz geprüft werden, ob dieser wiklich gelöscht werden darf (das löschen ist z.B. von einem Datumseintrag im Datensatz abhängig). Mit folgendem Ereignis versuche ich nun die Prüfung zu starten:<br>
    <br>
    <b>procedure</b> TForm3.DBNavigator1BeforeAction(Sender: TObject;
    Button: TNavigateBtn);
    <b>begin</b>
    If Button = nbDelete then PruefeGueltigkeitLoeschen(Button);
    <b>end;</b><br>
    <br>
    In der Prozedur PruefeGueltigkeitLoeschen(Button) wird festgestellt, ob der Datensatz die Kreterien für das Löschen erfüllt. Es ist jedoch egal ob die Kreterien erfüllt sind oder nicht, der Datensatz wird gelöscht. Wie kann ich nun den Löschvorgang abbrechen, wenn die Kreterien nicht erfüllt sind? Ist das Ereignis BeforeAction die falsche Methode um das Problem zu lösen? Wer kann mir einen Tipp geben? <br>
    <br>
    Gruß,<br>
    Marco

  • #2
    Hallo Marco,<br>ich glaube, es ist das richtige Ereignis. Jedoch solltest Du, wenn der Datensatz nicht gelöscht werden soll, mit Abort eine stille Exception auslösen. Dann wird der Datensatz nicht gelöscht.<br>Jens Schuman

    Comment


    • #3
      Hallo Jens,<br>
      <br>
      wie hat das ungefähr auszusehen? Hast Du ein kleines Beispiel?<br>
      An welcher stelle muß ich es einsetzen?<br>
      <br>
      Gruß,<br>
      Marc

      Comment


      • #4
        Vielen Dank für Deinen Tipp Jens !!!<br>
        Es hat alles bestens funktioniert mit der Abort-Prozedur.<br>
        <br>
        Gruß,<br>
        Marc

        Comment


        • #5
          ...nächste frage zum gleichen Thema.<br>
          Hier das nächste Problemchen. Wenn ich jetzt einen Datensatz lösche, werde ich vorher gefragt, ob ich den Datensatz wirklich löschen möchte. Erst wenn ich mit ja bestätige wird dieser dann gelöscht. Da dieses Ereignis fester Bestandteil des DBNavigators ist, scheint mir ein eingreifen oder Abfangen unmöglich. Ich möchte eine Meldung in einem Textfeld anzeigen lassen, wenn der DAtensatz gelöscht worden ist, nachdem man das Löschen bestätigt hat. Wenn ich den Datensatz doch nicht löschen möchte und mit Abbruch beende, dann wird meine selbst kreierte Meldung trotzdem im Textfeld ausgegeben. Es soll erst ausgegeben werden,wenn der DAtensatz auch tatsächlich gelöscht worden ist. Wer kennt eine Lösung?<br>
          <br>
          Gruß,<br>
          Marc

          Comment


          • #6
            Hallo,<br>
            <br>
            kann mir denn da keiner helfen?<br>
            Habe mich vielleicht ein wenig kopliziert ausgedrückt.<br>
            Ich betätige den Button "-" für Datensatz löschen im DBNavigator.
            Danach öffnet sich automatisch ein Fensterin dem man nochmal das löschen des Datensatzes bestätigen muß. Wenn man jetzt aber den DAtensatz doch nicht löschen möchte und mit 'Abbruch' den Vorgang beendet, wird meine Ausgabe trotzdem angezeigt, obwohl diese nur dann ersceinen soll, wenn der Datensatz nach betätigen des 'OK'-Butoons gelöscht worden ist. Wie kann ich das Problem lösen?<br>
            <br>
            Gruß,<br>
            Marc

            Comment


            • #7
              Hallo,<p>
              warum nutzt Du nicht die Ereignisse BeforeDelete und AfterDelete der Table/Query? Also "tatsächlich gelöscht worden ist" heisst dann, Du musst Deine Messagebox in TQuery/TTable OnAfterDelete aufrufen

              Comment


              • #8
                Hallo Bruno,<br>
                <br>
                leider kenne ich mich mit dem Table/Query noch nicht so aus.<br>
                Habe es aber gleich eingebunden auf meinem Formular, komme jedoch nicht recht weiter. Das Ereignis OnAfterDelete kann ich nicht finden. Es gibt nur AfterDelete. Diese Methode habe ich auch schon eingebunden. Das Query ist über DataSource mit der Tabelle verbunden. Leider kann ich es nicht auf Active setzen, da keine SQL-Statements vorhanden sind und somit funktioniert das Ereignis AfterDelete auch nicht. Könntest Du mir vielleicht noch einen ausgedehnteren Tipp geben? Wäre Dir sehr dankbar. <br>
                <br>
                Gruß,<br>
                Marc

                Comment


                • #9
                  Hallo,<p>
                  Dein Thread begann doch mit dem TDBNavigator. Dieser ist doch über ein TDatasource mit einer TQuery oder TTable verbunden, oder? Und das Ereignis AfterDelete (ok - ohne ON) ist die Stelle, an der Du auf die Löschung eines Datensatzes reagieren kannst.<p>
                  Zitat aus der Delphi-Hilfe:
                  <pre>
                  Mit einer Ereignisbehandlungsroutine für AfterDelete können direkt nach dem Löschen des aktiven Datensatzes spezielle Aktionen durchgeführt werden. AfterDelete wird von der Methode Delete ausgelöst, nachdem diese den Datensatz gelöscht, den Modus der Datenmenge in dsBrowse geändert und den Cursor auf dem Datensatz vor dem gelöschten positioniert hat.
                  </pre&gt

                  Comment


                  • #10
                    Hallo Bruno,<br>
                    <br>
                    ja, der DBNavigator ist mit einem DBGrid verbunden.<br>
                    Genauer genommen, ist der DBNavigatot und das DBGrid jweils mit dem DBGrid über einen DataSource verbunden. Das DBGrid verfügt über kein AfterDelete-Ereignis! Ich bin noch recht neu im Bereich Datenbanken und dem Umgang mit diesen Delphi-Komponenten.<br>
                    Eigentlich brauche ich doch nur ein Ereignis, dass direkt auf das austragen einer Teile im DBGrid reagiert. Aber wie mache ich das?<br>
                    <br>
                    Gruß,<br>
                    Marc

                    Comment


                    • #11
                      Hallo,<p>
                      wenn Du sowohl DBNavigator als auch DBGrid mit einer Datasource verbunden hast - womit ist dann aber die Datasource verbunden? Das kann doch nur eine TTable oder TQuery (oder TAdodataset etc.) sein? Das DBGrid zeigt nur an - die grundlegenden Zugriffsoptionen werden im Dataset konfiguriert und gesteuert. Hier werden z.B. auch die persistenten Felder zur Entwurfszeit erzeugt und definiert.<p>
                      Wenn Du ganz am Anfang stehst, kann ich dir das Buch "Datenbanken mit Delphi" vom C&L-Verlag empfehlen. Dort sind u.a. gute Einsteigerkapitel enthalten

                      Comment

                      Working...
                      X