Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 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