![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: DBDataset, DBQuery
Edit mit DBQuery
Hallo,
folgendes Beispiel:
Delphi-Quellcode:
bekomme als Fehler: IBQueryAuftrag: Eine Datenmenge, die nur zum Lesen ist, kann nicht geändert werden.
DatamodulePlanung.IBQueryAuftrag.Close;
DatamodulePlanung.IBQueryAuftrag.SQL.Clear; DatamodulePlanung.IBQueryAuftrag.SQL.Add('select * FROM PLANNUNG where ID_AUFTRAG = ' + IntToStr(id_Auftrag)); DatamodulePlanung.IBQueryAuftrag.Open; DatamodulePlanung.IBQueryAuftrag.Edit; DatamodulePlanung.IBQueryAuftragSTATUS.AsString := ComboBoxStatus.Text; DatamodulePlanung.IBQueryAuftragSTATUSDATUM.Value := now; DatamodulePlanung.IBQueryAuftragSTATUSNAME.AsString := UnitAnmeldung.FormAnmeldung.EditNuname.Text; DatamodulePlanung.IBQueryAuftrag.ExecSQL; Habe sonst die DBQuerys für Datenbankabfragen benutzt. Für Append und Edit dann nur DBDatasets. Kann man dennoch mit einer Query einen Wert in der Tabelle ändern? Danke, Luckner |
AW: Edit mit DBQuery
Schau mal ob es eine ReadOnly-Property/Option gibt, die True ist.
Die Query müsste hier automatisch das UPDATE-Statement erstellen. (ich hoffe mal IB kann sowas) * dafür braucht es die Informationen über das SELECT, bzw. die Fields und woher sie kommen ... wurden solche Zusatzinfos deaktiviert? ** kennt die Query-Komponente das ID-Feld? braucht sie, um das WHERE erweitern zu können. * falls die Automatik nicht geht, kannst du eventuell das Update-Statemant auch manuell übergeben z.B. die pgDAC-Query-Komponenten haben haben neben .Sql noch .SqlUpdate .SqlInsert und .SqlDelete ![]() Fand hier jetzt nichts, aber vielleicht geht es da über .UpdateObject |
AW: Edit mit DBQuery
Delphi-Quellcode:
Mit ExecSQL führt man SQLs aus, Du möchtest aber einen konkreten Datensatz ändern, den zu öffnen, zu editieren und dann das SQL zum Öffnen nochmal per ExecSQL ausführen, ist nicht sinnvoll. ExecSQL nutzt man gewöhnlich für Insert, Update, Delete, Create ...
DatamodulePlanung.IBQueryAuftrag.Close;
DatamodulePlanung.IBQueryAuftrag.SQL.Clear; DatamodulePlanung.IBQueryAuftrag.SQL.Add('select * FROM PLANNUNG where ID_AUFTRAG = ' + IntToStr(id_Auftrag)); DatamodulePlanung.IBQueryAuftrag.Open; DatamodulePlanung.IBQueryAuftrag.Edit; DatamodulePlanung.IBQueryAuftragSTATUS.AsString := ComboBoxStatus.Text; DatamodulePlanung.IBQueryAuftragSTATUSDATUM.Value := now; DatamodulePlanung.IBQueryAuftragSTATUSNAME.AsString := UnitAnmeldung.FormAnmeldung.EditNuname.Text; DatamodulePlanung.IBQueryAuftrag.Post; // und nicht ExecSQL Oder sowas (ungetestet):
Delphi-Quellcode:
DatamodulePlanung.IBQueryAuftrag.SQL.Clear;
DatamodulePlanung.IBQueryAuftrag.SQL.Add('update PLANNUNG set '); DatamodulePlanung.IBQueryAuftrag.SQL.Add('STATUS = :Status, '); DatamodulePlanung.IBQueryAuftrag.SQL.Add('STATUSDATUM = :StatusDatum, '); DatamodulePlanung.IBQueryAuftrag.SQL.Add('STATUSNAME = :StatusName '); DatamodulePlanung.IBQueryAuftrag.SQL.Add('where ID_AUFTRAG = :ID_Auftrag'); DatamodulePlanung.IBQueryAuftrag.ParamByName('STATUS').AsString := ComboBoxStatus.Text; DatamodulePlanung.IBQueryAuftrag.ParamByName('STATUSDATUM').Value := now; DatamodulePlanung.IBQueryAuftrag.ParamByName('STATUSNAME').AsString := UnitAnmeldung.FormAnmeldung.EditNuname.Text; DatamodulePlanung.IBQueryAuftrag.ParamByName('ID_Auftrag').AsInteger := id_Auftrag; DatamodulePlanung.IBQueryAuftrag.ExecSQL; |
AW: Edit mit DBQuery
TDBQuery ist mir nicht bekannt.
Aber wenn ich richtig liege, benutzt du TIBQuery. Das wäre die ReadOnly - Version der Interbase Komponenten. Zum Bearbeiten nutzt man dort TIBDataSet. Frank |
AW: Edit mit DBQuery
Zitat:
|
AW: Edit mit DBQuery
Oder halt per UpdateObject.
|
AW: Edit mit DBQuery
Zitat:
Dann muss man ein Updatestatment bauen und das per ExecSQL ausführen ;-) |
AW: Edit mit DBQuery
Zitat:
Das hab ich schon gesehen. Ich bin halt ein Freund exakter Angaben. Und so sei mir der dezente Hinweis darauf (1. Zeile) gestattet... Frank |
AW: Edit mit DBQuery
Zitat:
|
AW: Edit mit DBQuery
Danke für die Hinweise. Dann werde ich die IBDataset benutzen. Hat IBQuery dann irgendwelche Vorteile gegenüber IBDataset?
Gruß, Luckner |
AW: Edit mit DBQuery
Zitat:
Die manuellen Statemant muß man dort nur in Ausnahmefällen manuell angeben, wenn die Automatik nicht funktioniert (z.B. zu krankes SELECT mit komischen JOINs und UNIONs) oder wenn man auch angejointe Felder rückschreiben möchte. Ansonsten muß man der Query-Komponente nur noch das ID-Feld nennen, falls die OID der DB nicht verwendet werden soll/kann. |
AW: Edit mit DBQuery
Ja, das ist durchaus korrekt, mach' ich in der Regel auch so. 'ne Query eine Select, das im Ergebnis einen eindeutigen Schlüssel hat, über den ein Datensatz identifiziert werden kann und Edit + Post funktionieren (bzw. auch die Änderung in 'nem TDBGrid und/oder die Nutzung der entsprechenden Buttons eines TDBNavigators).
|
AW: Edit mit DBQuery
Das hat mich (als ich die Komponenten noch benutzt habe) auch verwirrt.
Bei den Interbase Komponenten ist die Funktionalität, die sonst in "Query" - Komponenten integriert sind, halt im TIBDataSet. Und TIBQuery ist Read Only... Also hat der TE nur 2 Möglichkeiten. TIBQuery ersetzen durch TIBDataSet oder den beschriebenen Weg über eine weitere TIBQuery - Komponente mit dem ensprechenden Update - Statement. Frank |
AW: Edit mit DBQuery
IBX verhält sich wie die BDE damals. Ein UpadteSQL-Kompo als Updateobject und dort die DML-Abfragen hinterlegen (lassen).
|
AW: Edit mit DBQuery
Zitat:
|
AW: Edit mit DBQuery
Nur zur Vergewisserung
TIBQuery kann kein
Delphi-Quellcode:
Gruß
Myquery.SQL.Text:="Update ....."
Myquery.ExecSQL; K-H |
AW: Edit mit DBQuery
Hallo,
doch, das geht natürlich. |
AW: Edit mit DBQuery
Was nicht (ohne UpdateObject) geht ist
Delphi-Quellcode:
DS.Insert;
Delphi-Quellcode:
DS.Append;
Delphi-Quellcode:
DS.Edit;
Delphi-Quellcode:
...
DS.Post
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz