Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi dbgrid - geänderte Daten in Tabelle schreiben (https://www.delphipraxis.net/91671-dbgrid-geaenderte-daten-tabelle-schreiben.html)

peterpan21 8. Mai 2007 14:04

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

mkinzler 8. Mai 2007 14:24

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
das macht man mit Hilfe eines updateobjekts, welches man an den Query bindet.

peterpan21 8. Mai 2007 14:27

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
und wie macht man das?

shmia 8. Mai 2007 15:09

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:
SELECT * FROM Tabelle WHERE .....
gibt es keine Probleme, geänderte Daten zurückzuschreiben oder neue Datensätze einzufügen.
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 ?

peterpan21 8. Mai 2007 15:50

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
Der Quelltext für den eintrag in die dbgrid:
Code:
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;
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.

shmia 8. Mai 2007 16:05

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

peterpan21 8. Mai 2007 16:15

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.

shmia 8. Mai 2007 17:36

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
Zitat:

Zitat von peterpan21
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.

Du drückst dich sehr ungenau aus.
Was meinst du mit "nur das zum eintragen"?
Bitte http://www.chiark.greenend.org.uk/~s...m/bugs-de.html lesen.

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.

peterpan21 8. Mai 2007 18:01

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
Zitat:

Zitat von shmia
Zitat:

Zitat von peterpan21
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.

Du drückst dich sehr ungenau aus.
Was meinst du mit "nur das zum eintragen"?
Bitte http://www.chiark.greenend.org.uk/~s...m/bugs-de.html lesen.

Das ist der Quellcode, mit dem die Tabelle in die dbgrid eingelesen wird.

Zitat:

Zitat von shmia
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.

Genau das funktioniert eben nicht. Die einstellungen sind genauso, wie du sie beschrieben hast.
der query befehl lautete jedoch "SELECT * from liste where... "

shmia 8. Mai 2007 18:11

Re: dbgrid - geänderte Daten in Tabelle schreiben
 
Zitat:

Zitat von peterpan21
Genau das funktioniert eben nicht. Die einstellungen sind genauso, wie du sie beschrieben hast.
der query befehl lautete jedoch "SELECT * from liste where... "

Systematische Fehlersuche wird jetzt benötigt.
1.) vereinfache die Abfrage zu "SELECT * FROM liste"
2.) zeig mal deinen ConnectionString her
3.) nimm mal meinen ADO Database Explorer http://www.delphipraxis.net/internal...ct.php?t=19596 und klick auf "Make connection", ConnectionString eingeben, dann Doppelklick auf die Tabelle "liste"
Du kannst auch auf "New Query" klicken und deine eigene Query eingeben (auch mit Parameter)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr.
Seite 1 von 2  1 2      

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