Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Edit mit DBQuery (https://www.delphipraxis.net/197233-edit-mit-dbquery.html)

Luckner 23. Jul 2018 15:20

Datenbank: Firebird • Version: 2.1 • Zugriff über: DBDataset, DBQuery

Edit mit DBQuery
 
Hallo,
folgendes Beispiel:
Delphi-Quellcode:
 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;
bekomme als Fehler: IBQueryAuftrag: Eine Datenmenge, die nur zum Lesen ist, kann nicht geändert werden.

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

himitsu 23. Jul 2018 15:41

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
http://docwiki.embarcadero.com/Libra...ery_Properties
Fand hier jetzt nichts, aber vielleicht geht es da über .UpdateObject

Delphi.Narium 23. Jul 2018 15:59

AW: Edit mit DBQuery
 
Delphi-Quellcode:
 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
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 ...

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;

dataspider 23. Jul 2018 16:02

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

himitsu 23. Jul 2018 16:03

AW: Edit mit DBQuery
 
Zitat:

Zitat von dataspider (Beitrag 1408422)
TDBQuery ist mir nicht bekannt.

Kein Problem, da DatamodulePlanung.IBQueryAuftrag.SQL :angle:

mkinzler 23. Jul 2018 16:03

AW: Edit mit DBQuery
 
Oder halt per UpdateObject.

Delphi.Narium 23. Jul 2018 16:13

AW: Edit mit DBQuery
 
Zitat:

Zitat von himitsu (Beitrag 1408424)
Zitat:

Zitat von dataspider (Beitrag 1408422)
TDBQuery ist mir nicht bekannt.

Kein Problem, da DatamodulePlanung.IBQueryAuftrag.SQL :angle:

Ja, aber wenn TIBQuery readonly ist, dürften Edit und Post (wie im Ausgangspost genutzt) nicht funktionieren.

Dann muss man ein Updatestatment bauen und das per ExecSQL ausführen ;-)

dataspider 23. Jul 2018 16:15

AW: Edit mit DBQuery
 
Zitat:

Zitat von himitsu (Beitrag 1408424)
Zitat:

Zitat von dataspider (Beitrag 1408422)
TDBQuery ist mir nicht bekannt.

Kein Problem, da DatamodulePlanung.IBQueryAuftrag.SQL :angle:


Das hab ich schon gesehen. Ich bin halt ein Freund exakter Angaben.
Und so sei mir der dezente Hinweis darauf (1. Zeile) gestattet...

Frank

Delphi.Narium 23. Jul 2018 16:24

AW: Edit mit DBQuery
 
Zitat:

Zitat von dataspider (Beitrag 1408429)
Zitat:

Zitat von himitsu (Beitrag 1408424)
Zitat:

Zitat von dataspider (Beitrag 1408422)
TDBQuery ist mir nicht bekannt.

Kein Problem, da DatamodulePlanung.IBQueryAuftrag.SQL :angle:


Das hab ich schon gesehen. Ich bin halt ein Freund exakter Angaben.
Und so sei mir der dezente Hinweis darauf (1. Zeile) gestattet...

Frank

Mein Kommentar bezug sich auf himitsu Anmerkung. Derweil TIBQuery + SQL (Select ...) + Open + Edit + Post geht halt nicht ;-)

Luckner 23. Jul 2018 16:38

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

himitsu 23. Jul 2018 16:42

AW: Edit mit DBQuery
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1408428)
Zitat:

Zitat von himitsu (Beitrag 1408424)
Zitat:

Zitat von dataspider (Beitrag 1408422)
TDBQuery ist mir nicht bekannt.

Kein Problem, da DatamodulePlanung.IBQueryAuftrag.SQL :angle:

Ja, aber wenn TIBQuery readonly ist, dürften Edit und Post (wie im Ausgangspost genutzt) nicht funktionieren.

Dann muss man ein Updatestatment bauen und das per ExecSQL ausführen ;-)

Ich kenn diese IB-Komponenten halt nicht, aber bei solchen Komponenten anderer Hersteller geht sowas.
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.

Delphi.Narium 23. Jul 2018 16:47

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).

dataspider 23. Jul 2018 16:50

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

mkinzler 23. Jul 2018 17:42

AW: Edit mit DBQuery
 
IBX verhält sich wie die BDE damals. Ein UpadteSQL-Kompo als Updateobject und dort die DML-Abfragen hinterlegen (lassen).

himitsu 23. Jul 2018 17:42

AW: Edit mit DBQuery
 
Zitat:

Bei den Interbase Komponenten ist die Funktionalität, die sonst in "Query" - Komponenten integriert sind, halt im TIBDataSet.
Und TIBQuery ist Read Only...
Wenn das geht ... Ich dachte TIBDataSet wäre sowas wie eine Table-Komponente, wo man nur ganze Tabellen (keine SELECTs) laden kann.

p80286 23. Jul 2018 20:51

AW: Edit mit DBQuery
 
Nur zur Vergewisserung
TIBQuery kann kein
Delphi-Quellcode:
  Myquery.SQL.Text:="Update ....."
  Myquery.ExecSQL;
Gruß
K-H

hoika 24. Jul 2018 05:12

AW: Edit mit DBQuery
 
Hallo,
doch, das geht natürlich.

mkinzler 24. Jul 2018 07:52

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 16:55 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