AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Selektion über DBGrid, Rückschreiben über ADOQuery
Thema durchsuchen
Ansicht
Themen-Optionen

Selektion über DBGrid, Rückschreiben über ADOQuery

Ein Thema von FediDelPr · begonnen am 25. Dez 2018 · letzter Beitrag vom 25. Dez 2018
Antwort Antwort
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Selektion über DBGrid, Rückschreiben über ADOQuery

  Alt 25. Dez 2018, 13:50
Datenbank: ACCESS • Version: 2016 • Zugriff über: ADO
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 25. Dez 2018, 20:37
Mach es über ein update:
UPDATE dieTabelle set Menge=:menge
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 25. Dez 2018, 21:22
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

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

  Alt 25. Dez 2018, 21:37
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.
Gruß, Jo

Geändert von jobo (25. Dez 2018 um 21:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 25. Dez 2018, 21:38
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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