Announcement

Collapse
No announcement yet.

Löschen einer ganzen Tabellenzeile

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

  • #31
    <p>Hallo Bine,<br>
    <br>
    auf die Ergebnismenge, die in Deinem Beispiel in deleteQuery steht.<br>
    <br>
    Den Rest Deiner Frage verstehe ich leider nicht.<br>
    <br>
    Gruß Thomas</p&gt

    Comment


    • #32
      Statt das ich versuche das Programmiertechnisch zu machen könnte man das ja tabellarisch vereinbaren.

      Wenn ich in Access die Tabellen über eine referentielle Integrietät vereinbare und nur die Meldung bearbeite sollte das doch auch funktionieren oder

      Comment


      • #33
        <p>Hallo Bine,<br>
        <br>
        sorry, aber jetzt verstehe ich gar nichts mehr :-(<br>
        <br>
        Thomas</p&gt

        Comment


        • #34
          ich habe jetzt ein DBGrid an die deleteQuery gehängt! Also die Ausgabe schaut gut aus, nur meine If anweisung stimmt noch immer nicht!

          Ich frage nach der Anzahl wenn Sie 0 ist dann möchte ich löschen
          <pre> if (deleteQuery.fields[1].asinteger=0) then ..</pre>

          wenn sie ungleich null ist dann soll eine meldung kommen<pre> if <pre> if not(deleteQuery.fields[1].asinteger=0) then ..</pre&gt

          Comment


          • #35
            Aber er geht immer in die Meldung rein

            Comment


            • #36
              <p>Hallo Bine,<br>
              <br>
              ich galube, so langsam dämmerts. Glauch ich zumindest.<br>
              <br>
              Zu Deinem Problem:<br>
              <br>
              Mit dem Abfrageergebnis selber kannst Du nicht löschen (da ja die Anzahl ermittelt wird und somit eine Aggregatfunktion gegeben ist). Du musst diese Ergebnismenge als Basis für eine zusätzliche Löschabfrage benutzen. Dies könnte folgendermaßen aussehen:<br>
              <br>
              <pre>
              var doDelete :TQuery;
              ...
              while not deleteQuery.Eof do
              begin
              if (deleteQuery.Fields[1].AsInteger=0) then
              begin
              doDelete.Close;
              doDelete.SQL.Add('DELETE FROM "..\Detailtabelle"');
              doDelete.SQL.Add('WHERE e_key=:loeschkey');
              doDelete.Params[0].AsString:=deleteQuery.Fields[0].AsString;
              doDelete.ExecSQL;
              end; // if
              deleteQuery.Next;
              end; // while
              ...
              </pre>
              <br>
              Ich hoffe Du verstehst was ich damit meine?!<br>
              <br>
              Gruß Thomas</p&gt

              Comment


              • #37
                <p>Hallo Bine,<br>
                <br>
                ich glaube, so langsam dämmerts. Glauch ich zumindest.<br>
                <br>
                Zu Deinem Problem:<br>
                Mit dem Abfrageergebnis selber kannst Du nicht löschen (da ja die Anzahl ermittelt wird und somit eine Aggregatfunktion gegeben ist). Du musst diese Ergebnismenge als Basis für eine zusätzliche Löschabfrage benutzen. Dies könnte folgendermaßen aussehen:<br>
                <pre>
                var doDelete :TQuery;
                ...
                while not deleteQuery.Eof do
                begin
                if (deleteQuery.Fields[1].AsInteger=0) then
                begin
                doDelete.Close;
                doDelete.SQL.Add('DELETE FROM "..\Tabelle in der gelöscht werden soll"');
                doDelete.SQL.Add('WHERE e_key=:loeschkey');
                doDelete.Params[0].AsString:=deleteQuery.Fields[0].AsString;
                doDelete.ExecSQL;
                end; // if
                deleteQuery.Next;
                end; // while
                ...
                </pre>
                Ich hoffe Du verstehst was ich damit sagen will?!<br>
                <br>
                Gruß Thomas</p&gt

                Comment


                • #38
                  Hi lieber Thomas,

                  danke zuerst mal für deine Mühe und deine Geduld.

                  Aber wie schon gesagt das löschen übernimmt <b> NICHT</B> SQL, sondern das mache ich ganz einfach mit etable.delete;

                  Das mit der refentiellen Integrität war nur ein <b> Lösungsversuch</b> von mir.

                  Also ich habe noch immer das Problem das die Bedingung

                  <pre>if (deleteQuery.Fields[1].AsInteger=0) then</pre> nicht zutrifft.
                  Obwohl mein DGBrid das JETZT mit der deletequery verbunden ist, Daten zeigt.

                  <b>Ich frage mich nur wie die anderen das lösen?</b>

                  Was passiert wenn ihr einen kunden (stammdatensatz!) aus der Tabelle löscht? Dann existiert möglicherweise noch ein "verwaister" Datensatz in der Rechnungstabelle, die mit ihrem Fremdschlüssel auf einen nun nicht mehr vorhandenen Kunden zeigt.

                  Ich weiß das das bei Paradox mit der Referentiellen Integrität geht, aber bei Access2000 hab ich schwierigkeiten.

                  Ich hoffe lieber Thomas du weißt was ich jetzt meine :_)
                  BINE :_

                  Comment


                  • #39
                    <p>Hallo Bine,<br>
                    <br>
                    wenn ein Kunde aus einem Stammsatz gelöscht wird, kannst Du das über einen sogenanten Trigger lösen. Maßgeblich für Dich wäre das BeforeDelete-Ereignis der Master- bzw. Stammtabelle.<br>
                    <br>
                    <pre>
                    procedure TForm1.StammTableBeforeDelete(DataSet:TDataset);
                    var aKey :String;
                    DelQuery:TQuery;
                    begin
                    // Kunde der gelöscht wird
                    aKey:=DataSet.FieldByName('e_key').AsString;

                    // Löschabfrage generieren
                    DelQuery:=TQuery.Create(Self);
                    with DelQuery do
                    try
                    SQL.Add('DELETE FROM "..\detailtabelle"');
                    SQL.Add('WHERE e_key=:loeschkey');
                    Params[0].AsString:=aKey;
                    ExecSQL;
                    finally
                    Free;
                    end; // with DelQuery
                    end; // TForm1.StammTableBeforeDelete
                    </pre>
                    Gruß Thomas</p&gt

                    Comment


                    • #40
                      <p>Hallo Bine,<br>
                      <br>
                      wenn ein Kunde aus einem Stammsatz gelöscht wird, kannst Du das über einen sogenanten Trigger lösen. Maßgeblich für Dich wäre das BeforeDelete-Ereignis der Master- bzw. Stammtabelle.<br>
                      <pre>
                      procedure TForm1.KundenTableBeforeDelete(DataSet:TDataset);
                      var aKey :String;
                      DelQuery:TQuery;
                      begin
                      // Kunde der gelöscht wird
                      aKey:=DataSet.FieldByName('e_key').AsString;
                      // Löschabfrage generieren und die Datensätze löschen, bei denen
                      // e_Key=aKey ist
                      DelQuery:=TQuery.Create(Self);
                      with DelQuery do
                      try
                      SQL.Add('DELETE FROM "..\detailtabelle"');
                      SQL.Add('WHERE e_key=:loeschkey');
                      Params[0].AsString:=aKey;
                      ExecSQL;
                      finally
                      Free;
                      end; // with DelQuery
                      end; // TForm1.KundenTableBeforeDelete
                      </pre>
                      Gruß Thomas</p&gt

                      Comment


                      • #41
                        Diese Funktion löscht die übrig gebliebenen Datenreste oder?????

                        Ich möchte nur das Löschen verhindern!!

                        Comment


                        • #42
                          <p>Hallo Bine,<br>
                          <br>
                          verhindern? Das der Masterdatensatz gelöscht wird? Wenn ja, auf ein neues:<br>
                          <br>
                          procedure TForm1.KundenTableBeforeDelete(DataSet:TDataset);
                          var aKey :String;
                          FindQuery:TQuery;
                          begin
                          // Kunde der gelöscht wird
                          aKey:=DataSet.FieldByName('e_key').AsString;
                          // Suchabfrage generieren um die Datensätze zu lesen, bei denen
                          // e_Key=aKey ist
                          FindQuery:=TQuery.Create(Self);
                          with DelQuery do
                          try
                          SQL.Add('SELECT e_key, COUNT(e_key) As Anzahl');
                          SQL.Add('FROM "..\detailtabelle"');
                          SQL.Add('GROUP BY e_key')
                          SQL.Add('HAVING e_key=:findkey');
                          Params[0].AsString:=aKey;
                          Open;
                          // überprüfen, ob überhaupt Daten gefunden wurden (RecordCount=1;
                          // theoretisch dürfte die Abfrage nur 1 Datensatz liefern)
                          // und dann überprüfen, ob (Anzahl>0)
                          if (RecordCount=1) then
                          if (FieldByName('Anzahl').AsInteger>0) then
                          begin
                          ShowMessage('Kann nicht gelöscht werden...');
                          SysUtils.Abort;
                          end;
                          finally
                          Free;
                          end; // with DelQuery
                          end; // TForm1.KundenTableBeforeDelete
                          </pre>
                          Ich hoffe, dass es so jetzt Deiner Vorstellung eher entspricht.<br>
                          <br>
                          Gruß Thomas</p&gt

                          Comment


                          • #43
                            Hallo Bine,<br>
                            <br>
                            verhindern? Das der Masterdatensatz gelöscht wird? Wenn ja, auf ein neues:<br>
                            <pre>
                            procedure TForm1.KundenTableBeforeDelete(DataSet:TDataset);
                            var aKey :String;
                            FindQuery:TQuery;
                            begin
                            // Kunde der gelöscht wird
                            aKey:=DataSet.FieldByName('e_key').AsString;
                            // Suchabfrage generieren um die Datensätze zu lesen, bei denen
                            // e_Key=aKey ist
                            FindQuery:=TQuery.Create(Self);
                            with FindQuery do
                            try
                            SQL.Add('SELECT e_key, COUNT(e_key) As Anzahl');
                            SQL.Add('FROM "..\detailtabelle"');
                            SQL.Add('GROUP BY e_key');
                            SQL.Add('HAVING e_key=:findkey');
                            Params[0].AsString:=aKey;
                            Open;
                            // überprüfen, ob überhaupt Daten gefunden wurden RecordCount=1;
                            // theoretisch dürfte die Abfrage nur 1 Datensatz liefern)
                            // und dann überprüfen, ob (Anzahl>0)
                            if (RecordCount=1) then if (FieldByName('Anzahl').AsInteger>0) then
                            begin
                            ShowMessage('Kann nicht gelöscht werden...');
                            // Löschen abbrechen
                            SysUtils.Abort;
                            end;
                            finally
                            Free;
                            end; // with FindQuery
                            end; // TForm1.KundenTableBeforeDelete
                            </pre>
                            Ich hoffe, dass es so jetzt Deiner Vorstellung eher entspricht.<br>
                            <br>
                            Gruß Thomas</p&gt

                            Comment


                            • #44
                              :_)HAllo Thomas!!

                              Hoffe ich auch! Wir zwei haben sicher die meisten Forumbeiträge geschafft!!!

                              Muß erst schauen um was es in deinem code geht,..

                              Danke aufjedenfall!!!

                              BINE :_

                              Comment


                              • #45
                                Hi ich bin wieder!!

                                Also der ich glaube diesesmal ist es der richtige Code nur hab ich ein Problem dadurch das ich mit einer ADOQuery arbeite kennt er params von
                                <pre>Params[0].AsString:=aKey;</pre>
                                nicht!!

                                Das gleiche Problem hab ich auch an einer anderen Stelle. Ich schätze jetzt können mir nur ADO Profis helfen ..? oder

                                Comment

                                Working...
                                X