Announcement

Collapse
No announcement yet.

Áktueller Datensatz bei TQuery ändern

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

  • Áktueller Datensatz bei TQuery ändern

    Hallo,

    wenn ich versuch die Methode Edit, delete usw bei TQuery aufzurufen, kommt lediglich eine Meldung, dass die Tabelle schreibgeschützt ist.
    Kann man diesen Schreibschutz aufheben, und wie ?
    Oder läßt sich dies per SQL Anweisung machen.

    Gruss
    Frank

  • #2
    Hallo,

    TQuery ist nur dann in der Lage, eine editierbare Datenmenge bereitzustellen, wenn bestimmte Bedingungen eingehalten werden. Diese Bedingungen können in der Delphi-Hilfe unter der TQuery-Eigenschaft <b>RequestLive</b> nachgelesen werden

    Comment


    • #3
      Hallo,

      d.h. ich kann in einer mit SQL-Anweisungen gefilterten Tabelle nicht so ohne weiteres Zeilen löschen.
      Wenn ich parallel noch ein TTable Objekt auf die Datenbank setze (zum editieren, aendern loeschen) waere dies prinzipiell möglich.
      Wie gebe ich dann meinen aktuellen Datensatz (der über ein DBGrid selektiert ist) an Table weiter ?
      Oder kann ich das auch mit einer SQL-Anweisung derart machen :

      delete (akt Datensatz)
      from MyTabell

      Comment


      • #4
        Hallo Frank,

        sieh Dir mal die Hilfe zu TUpdateSQL an.
        Auf jeden Fall sollte Deine Tabelle über einen eindeutigen Index (am besten eine fortlaufende Nummer) Verfügen, damit jeder Datensatz exakt angesprochen werden kann.
        Für einen einfachen Fall wäre also ein SQL-Statement in der Form:

        delete from MyTabelle where EindeutigerIndex = AktuellerDatensatz_EindeutigerIndex

        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo,

          welche Datenbank wird denn überhaupt eingesetzt?

          Das TDBGrid ist nur die sichtbare Benutzeroberfläche, für Delphi ist allerdings nur die Datenmenge (Dataset) relevant. Wenn man für die TQuery-Instanz über den Feldeditor persistente TFields anlegt, kann man über deren Namen direkt auf jeden Spaltenwert des momentan ausgewählten Datensatzes zugreifen. Wenn die Tabelle einen Primärschlüssel hat, wird natürlich dieser für die WHERE-Einschränkung der DELETE-Anweisung verwendet. Allerdings ändert sich dann die sichtbare Datenmenge von TQuery erst dann, wenn die Abfrage neu ausgeführt wird. Daher ist die Kombination von TQuery + TUpdateSQL am besten geeignet, wenn über die BDE auf eine SQL-Datenbank zugegriffen werden soll und die Datenmenge über eine frei formulierte SELECT-Abfrage generiert wird.

          Will man den ganzen Ärger vermeiden, darf man auch zur TTable greifen und die Datenmenge über ein Filter einschränken. Die VCL setzt beim Zugriff auf SQL-Datenbanken einen Filter-Wert automatisch in eine SELECT-Abfrage mit einer WHERE-Einschränkung um, wobei der Filterwert als Suchkriterium verwendet wird (TTable filtert im Gegensatz zu TQuery <b>nicht</b> lokal, sondern auf dem SQL-Server). Hier kann der Datensatz sofort gelöscht werden

          Comment


          • #6
            Hallo,

            eingesetzt wird ein paradox7 DB.
            Auch folgendes funktionierte nicht : <br>

            New_Name := Edit1.Text; <br>
            (Hier kommen noch mehr Anweisungen der Art )
            Query1.close;<br>
            Query1.SQL.Clear;<br>
            Query1.SQL.Add('Insert INTO wartglobal (Name) '); <br>
            Query1.Sql.add('Values ("'+New_Name+'")');<br>
            Query1.ExecSQL;<br>
            DatasourceWart.Enabled := false;<br>
            Query1.Active := true;<br>

            hier kommt dann eine Exception die auf ein fehlendes cursor-handle hinweist.

            Hängt man dagegen statt dessen dies an

            Query1.sql.clear; <br>
            Query1.sql.add('Select * From wartglobal'); <br>
            Query1.ExecSQL;<br>
            Query1.Active := true;<br>

            dann wird das insert nicht übernommen.

            Die Variante mit dem UpdateOject und den DBEdit bzw DBComboBoxFeldern habe ich auch schon probiert, allerdings loesen die DB..-Felder bereits einen Schreibvorgang in die DB aus, wenn man von einem zum naechsten springt.
            Die Datenbank soll in ihren Spalten aber erst auf Knopfdruck geändert, erweitert oder geloscht werden.
            Also ich möchte auf Query1 ausführen was mit table1 so funktionieren wuerde (aber in diesem Falle Zeitprobleme mit sich bringt)

            table1['Spalte1']:=Edit1.Text; <br>

            table2['Spalte2']:=Edit2.Text;<br>

            usw.

            So, ich hoffe ich hab euch nicht noch verwirrt.

            Viele Gruesse

            Frank

            Gruss

            Fran

            Comment


            • #7
              Hallo,

              Paradox ist keine SQL-Datenbank und kann daher mit SQL nicht umgehen. Die BDE löst dieses Problem, indem über LOCAL SQL alle SQL-Zugriffe "simuliert" und in IDAPI-Aufrufe übersetzt werden. Daher macht es bis auf wenige Ausnahmen überhaupt keinen Sinn, mit TQuery eine Paradox-Tabelle bearbeiten zu wollen.

              Die TQuery-Methode Active darf nur dann auf True gesetzt werden, wenn eine SELECT-Abfrage ausgeführt wird, denn nur hier liefert die BDE eine Ergebnismenge über ein Cursor-Handle zurück. Bei einem INSERT-Aufrufe darf man nur ExecSQL, aber <b>nicht</b> Active/Open verwenden. Die Methoden ExecSQL und Active/Open können nur alternativ aufgerufen werden, aber nicht zusammen.

              Um alle Schreibzugriffe in die Datenbank zu verzögern, kann man auch bei Paradox zum Mechanismus der <b>Cached Updates</b> greifen (siehe Delphi-Hilfe zu CachedUpdates) und bei der TTable bleiben, die ist für Desktop-Datenbanken wie Paradox besser geeignet

              Comment


              • #8
                Hallo

                vielen Dank erstmal !!

                Comment

                Working...
                X