Announcement

Collapse
No announcement yet.

VIEW with view_metadata?

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

  • VIEW with view_metadata?

    Hallo,

    Umg.: Delphi 6 Ent. UP2, ADO, MSSQL 2000

    Ich habe auf dem Server eine View (with view_metadata) mit instead-of-Trigger für insert, update und delete erstellt.

    Einfüge-, Update- und Löschoperationen funktionieren tadellos, wenn ich mit dem Query Analyzer arbeite.

    In der Delphi-Anwendung habe ich folgende Komponenten plaziert:<br>
    - ADOConnection<br>
    - ADODataset (select * from MyView)<br>
    - Datasource<br>
    - DBGrid<br>

    Legt man z.B. einen neuen Datensatz an, speichert diesen ist alles noch in Ordnung. Möchte man aber anschließend den eben gespeicherten Datensatz bearbeiten, erntet man die Fehlermeldung:

    <i>Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert.</i>

    Beende ich die Anwendung und starte sie wieder, kann ich den neuen Datensatz bearbeiten. Möchte ich ihn z.B. Löschen (nachdem er erfolgreich editiert und gepostet wurde), bekomme ich die gleiche Fehlermeldung. Es scheint, als ob man nur eine Operation duchführen kann.

    Wo liegt der Fehler?

    Gruß<br>
    Stephan

  • #2
    Hallo Stephan,<BR><BR>ich vermute bei dir folgendes Problem: Der Trigger arbeitet ja praktisch unsichtbar für deine ADO-Verbindung zur Datenbank. Im Hintergrund werden also die Daten deiner View geändert. Das bedeutet, dass nach einer Operation die Datenmenge auf deinem Client für den bearbeiteten Datensatz nicht mehr gültig ist. Du siehst zwar einen neuen Datensatz in deinem Grid(es ist doch ein Grid?) der aber nur auf deienem Client "lebt", auf dem Server ist das dann ein anderer Datensatz, der allerdings genau so aussieht. Ich denke, dass du mit einer Aktualisierung der Datenmenge über ADODataSet1.Requery, .Refresh bzw. .Resync das Problem beheben kannst.<BR>Im ADO-Buch von Herrn Kosch ist das wunderbar beschrieben!<BR><BR>Viele Grüße Ola

    Comment


    • #3
      Hallo Olaf,

      vielen Dank für Deinen Hinweis. Folgender Code läßt die Sache nun funktionieren:
      <pre><code>procedure TDataModule1.ADODataSet1AfterPost(DataSet: TDataSet);
      begin
      ADODataSet1.Requery();
      end;</pre></code>

      Gibt es erfahrungsgemäß Probleme, wenn ich im AfterPost()-Event einer Datenmenge sofort ein Requery() ausführe? Die Tatsache, dass es bei mir nun klappt, heißt noch lange nicht, dass dieser Code eventuell seine Tücken hat.

      PS: Könntest Du mir vielleicht noch sagen, wo in etwa (Seiten?) im ADO-Buch ich genaueres dazu nachlesen kann.

      Gruß<br>
      Stepha

      Comment


      • #4
        Hallo Olaf,

        Leider Kommando zurück, ein einfaches Requery() im AfterPost() funktioniert auch nicht immer. Ich ernte immer noch die gleichen Fehlermeldungen.

        Stepha

        Comment


        • #5
          Hallo Stephan,<BR><BR>siehst du denn nach dem Requery() den neuen Datensatz? Wenn ja, dann müsste er eigentlich gültig sein, da alle Datensätze wieder neu vom Server heruntergeladen werden. Sind vielleicht ein paar Trigger verschachtelt, so dass die Zeit beim Neuladen zu knapp wird, sprich, der oder die Trigger sind mit ihrer Arbeit noch nicht komplett fertig? Prüfe das doch nochmal. <BR>(Im ADO-Buch befasst sich das Kapitel 6.5.11 mit Requery usw.)<BR><BR>Viele Grüße Ola

          Comment

          Working...
          X