![]() |
Datenbank: mdb • Zugriff über: ado
dbgrid - geänderte Daten in Tabelle schreiben
Guten Tag,
ich habe eine dbgrid, in der ich mir über eine query bestimmte zeilen einer tabelle ausgeben lassen kann. Wenn ich einen wert direkt in dem dbgrid änder, wird der wert nicht in der tabelle geändert, weil ja eine query und kein table die verbindung über eine datasource mit dem dbgrid herstellt. Wie kann ich das erreichen, dass die änderungen sofort in die tabelle geschrieben werden? st eine mdb datenbank. die abfrage der query ist einfach nur "select * from ... where (vorher ausgewählte person)" adoconnection <- adoquery <- datasource <-dbgrid |
Re: dbgrid - geänderte Daten in Tabelle schreiben
das macht man mit Hilfe eines updateobjekts, welches man an den Query bindet.
|
Re: dbgrid - geänderte Daten in Tabelle schreiben
und wie macht man das?
|
Re: dbgrid - geänderte Daten in Tabelle schreiben
Wenn die Zeile im DBGrid nach einer Änderung verlassen wird, dann wird automatisch [TDataSet].Post aufgerufen.
Dabei ist es egal, ob es eine TADOTable oder TADOQuery ist. (Locktype muss ltOptimistic sein) Bei Abfragen einfacher Art wie
SQL-Code:
gibt es keine Probleme, geänderte Daten zurückzuschreiben oder neue Datensätze einzufügen.
SELECT * FROM Tabelle WHERE .....
Abfragen, die mehr als eine Tabelle benützen oder GROUP BY enthalten sind nicht updatefähig. Wo ist also dein Problem und wie lautet deine Abfrage genau ? |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Der Quelltext für den eintrag in die dbgrid:
Code:
Mein Problem ist, dass wenn ich einen Wert in dem dbgrid änder, diese Änderung nicht in die Tabelle geschrieben wird. Beim Neustart ist also alles so wie vorher, ohne eingetragene Werte.
begin
DataModule1.ADOQuery4.close; DataModule1.ADOQuery4.SQL.Clear; DataModule1.ADOQuery4.SQL.Add('Select * from liste where Jahrgang=:''Cat1'' and Gruppe=:''Cat2'' and NAME=:''Cat3'''); Datamodule1.ADOQuery4.Parameters.ParamByName('Cat1').Value:= strtoint(Combobox1.text); Datamodule1.ADOQuery4.Parameters.ParamByName('Cat2').Value:=Combobox2.text; Datamodule1.ADOQuery4.Parameters.ParamByName('Cat3').Value:=Combobox4.text; DataModule1.ADOQuery4.Open; dbgrid1.visible:=true; end; |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Delphi-Quellcode:
DataModule1.ADOQuery4.SQL.Add('Select * from liste where Jahrgang=:''Cat1'' and Gruppe=:''Cat2'' and NAME=:''Cat3'''); // Falsch
DataModule1.ADOQuery4.SQL.Add('Select * from liste where Jahrgang=:Cat1 and Gruppe=:Cat2 and NAME=:Cat3'); // Richtig |
Re: dbgrid - geänderte Daten in Tabelle schreiben
die abfrage funktioniert auch mit ''cat1''
wie gesagt, das ändern ist das problem. der quellcode oben ist nur das zum eintragen, damit habe ich keine probleme. |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Zitat:
Was meinst du mit "nur das zum eintragen"? Bitte ![]() Zurück zu den Grundlagen: Angenommen du hast eine ADO Query mit "SELECT * FROM liste" verbunden mit einer DataSource verbunden mit einem DBGrid. Die ADOConnection verweisst auf eine MS Access Datenbank. (Jet Engine 4.0) Dann kann man über das DBGrid Daten verändern, neue Datensätze einfügen oder Datensätze löschen. No Problemo!!! Es sei denn, die MDW-Datei wäre schreibgeschützt oder in der ADO Connection sind falsche Share-Attribute eingestellt oder Locktype <> ltOptimistic oder DataSource.AutoEdit = False. Wenn die Tabelle keine Primärschlüssel hat kann es ebenfalls Probleme geben. Wenn du über dein Programm Daten änderst und gleichzeitig mit MS Access die Änderungen überprüfst, dann scheint es so, als ob dein Programm nichts bewirken würde. Das liegt am Cache. Bei Access solte man das Property CursorLocation immer auf clUseServer stellen. |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Zitat:
Zitat:
der query befehl lautete jedoch "SELECT * from liste where... " |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Zitat:
1.) vereinfache die Abfrage zu "SELECT * FROM liste" 2.) zeig mal deinen ConnectionString her 3.) nimm mal meinen ADO Database Explorer ![]() Du kannst auch auf "New Query" klicken und deine eigene Query eingeben (auch mit Parameter) |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Connection-String:
PProvider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\***\Schueler.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False Die Abfrage habe ich vereinfacht. Ich konnte nicht in die Datenbank schreiben. Ersetze ich die Query durch eine TableKomponente, kann ich die Daten ändern, also in die Tabelle schreiben. "Make Connection" ist mit dem Programm erfolgreich. |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Zitat:
1.) Make Connection - war ja ok 2.) New Query klicken und "SELECT * FROM liste" eingeben 3.) "Open" klicken - jetzt müssen die Daten im Grid angezeigt werden 4.) Daten verändern und neue Datensätze einfügen sollte das nicht gelingen liegt der Fehler an der Datenbankdatei oder an den ADO Treibern. Am Programm ADODesk.exe kann es nicht liegen, denn das wurde schon auf vielen Rechnern mit vielen Access Datenbanken getestet. Sollten sich die Daten ändern lassen, liegt das Problem ganz eindeutig an deinem Sourcecode. |
Re: dbgrid - geänderte Daten in Tabelle schreiben
Mit dem Programm kann ich die Daten ändern. Dann liegt das Problem also am sourcecode...
ich glaube, es liegt daran, dass ich variablen in dem sql term habe.. ich werde das problem versuchen zu umgehen, indem ich auf die dbgrid verzichte. viele dank für die hilfe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz