Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Selektion über DBGrid, Rückschreiben über ADOQuery (https://www.delphipraxis.net/199117-selektion-ueber-dbgrid-rueckschreiben-ueber-adoquery.html)

FediDelPr 25. Dez 2018 13:50

Datenbank: ACCESS • Version: 2016 • Zugriff über: ADO

Selektion über DBGrid, Rückschreiben über ADOQuery
 
Hallo Leidensgenossen,

ich habe ein Problem beim Rückschreiben von Daten in ACCESS-Tabelle:

Ich verwende ein DBGRID in dem ich Daten darstelle die über ADOQuery erzeugt wurden.
Das Query ist relativ komplex (2 Datenbanken, eine davon explizit im SQL-Text aufgeführt, JOINS, UNION, WHERE, ORDER BY, Parameter). Die Abfrage funktioniert einwandfrei.

Im DBGrid selektiere ich nun eine Zeile und lese ein, zwei Felder aus der DB-Tabelle aus und stelle diese separat dar (ShowMessage). Kein Problem.

Jetzt verändere ich eines dieser Felder (Menge) in einem Edit-Control und schreibe es mit
folgendem Code in die Datenbank zurück.
Code:

      menge := ADOQuery1.FieldByName('Menge').AsInteger;
     
      ... Menge editieren

      ADOQuery1.Edit;
      ADOQuery1.FieldByName('Menge').AsInteger := menge;
      ADOQuery1.Post;
Beim Ausführen von Post erscheint folgende Fehlermeldung: "Nicht genügend Basistabelleninformationen zum Aktualisieren .."

Kann mir da jemand weiterhelfen ?

p80286 25. Dez 2018 20:37

AW: Selektion über DBGrid, Rückschreiben über ADOQuery
 
Mach es über ein update:
SQL-Code:
UPDATE dieTabelle set Menge=:menge

Gruß
K-H

Delphi.Narium 25. Dez 2018 21:22

AW: Selektion über DBGrid, Rückschreiben über ADOQuery
 
In einem DBGrid kann mein keine Daten aktuallisieren, die durch ein Select über mehrere Tabellen, Joins, Unions "zusammengesucht" werden. In dem Fall ist die Datenbank nicht in der Lage herauszufinden, zu welchem Datensatz in welcher Tabelle die geänderten Werte gehören. Die Fehlermeldung ist da nicht wirklich hilfreich, auch wenn sie formal korrekt ist.

Du kannst das Problem nur (wie p80286 schreibt) per Updatestatment lösen. Dazu musst Du aber nicht nur wissen, welches Feld Du ändern möchtest, sondern musst auch zwingend wissen, aus welcher Tabelle der Abfrage der Wert stammt und wie Du ihn dort eindeutig ansprechen kannst. Das Selectstatement muss also den / einen passenden Schlüssel dieser Tabelle mitliefern, ansonsten bist Du da zum Scheitern verurteilt.

jobo 25. Dez 2018 21:37

AW: Selektion über DBGrid, Rückschreiben über ADOQuery
 
Ich schließe mich an. Im Prinzip brauchst Du für das "manuelle Update" die gleichen Informationen wie Access, um die Query zu aktualisieren: Ursprungstabelle, Feld, Primärschlüssel.

Access kann man da auch nicht die Schuld geben. Wenn ich mich richtig erinnere, macht es ja sogar so tolle Sachen und fragt nach Primärschlüsselinformationen, wenn man externe Abfragen einbindet.
Es gibt übrigens in den Delphidatenbankkomponenten extra Kompos bzw. Properties, in denen man separate insert, update, delete Statements angeben kann. Die werden so vollkommen disjunkt von der darstellenden Query gehandhabt. Bin da nicht mehr ganz auf dem laufenden, was aktuell "im Angebot" ist.

Ach und was ich mir nicht verkneifen kann: Frag Dich mal, ob Du vielleicht ne andere DB verwenden kannst oder ob es Access sein muss. (Das hat nichts mit Deinem Problem hier zu tun, andere Systeme können Queryupdates auch unterschiedlich gut)

Ach noch ein PS:
Jedes System kann nur mit den Infos arbeiten, die es kennt. Falls Du also zufällig auf Datenmengen arbeitest, wo auch die Basistabellen der Queries gar keinen Primärschlüssel haben, wird die Luft natürlich dünn. Und falls dieser in der Abfrage nicht enthalten ist, geht's auch nicht, wie gesagt. Wenn Deine Abfrage kein Group By enthält, könnte ein Update allerdings möglich sein, das Union was Du genannt hast ist theoretisch kein Hinderungsgrund.

p80286 25. Dez 2018 21:38

AW: Selektion über DBGrid, Rückschreiben über ADOQuery
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1422089)
Du kannst das Problem nur (wie p80286 schreibt) per Updatestatment lösen. Dazu musst Du aber nicht nur wissen, welches Feld Du ändern möchtest, sondern musst auch zwingend wissen, aus welcher Tabelle der Abfrage der Wert stammt und wie Du ihn dort eindeutig ansprechen kannst. Das Selectstatement muss also den / einen passenden Schlüssel dieser Tabelle mitliefern, ansonsten bist Du da zum Scheitern verurteilt.

Danke daß Du daran gedacht hast, ich bin weihnachtlich umnachtet.

Code:
UPDATE dieTabelle set Menge=:menge where id=:id
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz