Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird/Interbase: TIBDataSet: kann keine Daten einfügen (https://www.delphipraxis.net/31919-firebird-interbase-tibdataset-kann-keine-daten-einfuegen.html)

Ralf Stehle 15. Okt 2004 16:19


Firebird/Interbase: TIBDataSet: kann keine Daten einfügen
 
Das Thema wurde bereits mehrfach angesprochen.
Ich habe es immer noch nicht kapiert.

Ich habe eine alte Anwendung für eine MS-Acess-Datenbank
Mit AdoDataSet muss ich nur AdoDataSet1.Append oder AdoDataSet1.Edit
eingeben, dann in den Datengebundenen DbEdit-Feldern meine Eingaben machen
und anschließend mit AdoDataSet1.Post die Daten sichern.
Das Post wird sogar automatisch durchgeführt beim Scrollen zu einem anderen Datensatz

Jetzt möchte ich die Anwendung für Firebird umschreiben

Muss ich tatsächlich alle Eingaben in ungebundene Edit-Felder machen,
danach einen SQL-Befehl mit dem Inhalt der Editfelder schreiben und mit
IBDataSet1.InsertSQL := 'Insert ...' oder IBDataSet1.UpdateSQL := 'Update ....'
die Daten sichern?

Dann muss ich ja fast alles umschreiben ?!?

:?: :?: :?: :?: :?: :?: :?: :?: :?: :?:

MrSpock 15. Okt 2004 18:39

Re: Firebird/Interbase: TIBDataSet: kann keine Daten einfüge
 
Hallo Ralf,

nein musst du natürlich nicht. Du kannst die DBEdit Felder ja auch mit IBQuery oder IBTable oder IBDataset Komponenten verbinden, da sie ja alle über eine DataSource Komponente verbunden werden. Bei IBTable kannst du sogar den alten Code weitgehend übernehmen. Am effizientesten ist aber IBDataset.

Ralf Stehle 15. Okt 2004 20:49

Re: Firebird/Interbase: TIBDataSet: kann keine Daten einfüge
 
Ich habe folgendes ausprobiert und bin langsam entnervt, dass es einfach nicht klappt:
Delphi-Quellcode:
DM.IBDataSet1.Close;
DM.IBDataSet1.InsertSQL.Text := 'Select * from UDAT';
DM.IBDataSet1.Open;
DM.IBDataSet1.Edit;
DM.IBTransaction.Active := True;
DbEdit1.Text := '15.10.2004'; DbEdit2.Text := 'Stehle, Ralf';    
DM.IBDataSet1.FieldByName('ID').AsInteger := GetNextNumber;
DM.IBTransaction.Commit;
DM.IBDataSet1.Post;
GetNextNumber holt sich für das AutoIncrement-Feld aus folgender Funktion die Zahl
Delphi-Quellcode:
function GetNextNumber: integer;
begin
 DM.IBQuery1.Active := False;
 DM.IBQuery1.SQL.Text := 'Select Gen_ID(GEN_UDAT, 1) AS ID from rdb$database';
 DM.IBQuery1.Active := true;

 if DM.IBQuery1.RecordCount >= 0 then
  result := DM.IBQuery1.FieldByName('ID').AsInteger + 1
 else result := 1;
end;
Es sieht zunächst alles so schön aus, aber sobald das Post kommt sind die Daten wieder weg !!! Auch wenn ich statt 'Select * from UDAT' eine Insert-Anweisung schreibe, kommt es auf das gleiche heraus. Ich habe eine Select-Anweisung gewählt, da ich ja noch nicht weiß, welche Werte eingefügt werden sollen. Die Werte möchte ich ja in den DBEdit-Feldern editieren

Ralf Stehle 15. Okt 2004 22:38

Re: Firebird/Interbase: TIBDataSet: kann keine Daten einfüge
 
Ist noch jemand interessiert an dem Thema ?

Ich habe glaube ich eine Lösung gefunden, um mit TIBDataSet alle Aktionen korrekt ausführen zu können:

Delphi-Quellcode:
DM.IBDataSet1.Close;

DM.IBDataSet1.SelectSQL.Text := 'Select * from UDat WHERE CAST(Untersuchungsdatum AS DATE) = CURRENT_DATE';
DM.IBDataSet1.InsertSQL.Text := 'INSERT INTO UDAT (UntersuchungsDatum, Uhrzeit, Untersuchung, Patient, Station, Untersucher, Abteilung) VALUES (:UntersuchungsDatum, :Uhrzeit, :Untersuchung, :Patient, :Station, :Untersucher, :Abteilung)';
DM.IBDataSet1.ModifySQL.Text := 'UPDATE UDAT SET UntersuchungsDatum=:UntersuchungsDatum, Uhrzeit=:Uhrzeit, Untersuchung=:Untersuchung, Patient=:Patient, Station=:Station, Untersucher=:Untersucher, Abteilung=:Abteilung WHERE ID=:OLD_ID';
DM.IBDataSet1.RefreshSQL.Text:= 'Select ID,UntersuchungsDatum, Uhrzeit, Untersuchung, Patient, Station, Untersucher, Abteilung from UDat WHERE ID=:ID';

DM.IBDataSet1.GeneratorField.Generator := 'GEN_UDAT';
DM.IBDataSet1.GeneratorField.IncrementBy := 1;

DM.IBDataSet1.Open;
Anscheinend muss für alle Aktionen eine SQL hinterlegt werden mit Parametern für jedes Feld, das geändert werden soll

Außerdem habe ich noch Generator-Anweisungen gefunden, dass endlich das AutoIncrement meines ID-Feldes funktioniert

Ich hoffe das ist jetzt der Stein der Weisen

:gruebel:

MrSpock 16. Okt 2004 18:11

Re: Firebird/Interbase: TIBDataSet: kann keine Daten einfüge
 
Hallo Ralf,

war leider nicht online, hätte die sonst die Fehler genannt. Gut, dass du es schon selbst gelöst hast. Zur Transaktionskontrolle wollte ich noch anmerken, dass du zuerst mit Post die Daten schreiben musst und erst dann mit Commit die Änderungen endgültig machst.

Hansa 16. Okt 2004 19:36

Re: Firebird/Interbase: TIBDataSet: kann keine Daten einfüge
 
Das sieht nach IBX aus. Da mußt Du doch dem Dataset direkt schon das alles zuordnen. Ich sage nur Insert und das Dataset benutzt dann das, was vordefiniert ist. Ich verwende allerdings FIBplus. Da definiere ich nur das SelectSQL und der Rest wird automatisch generiert. Muß man das bei IBX für jedes Dataset und insert, modify usw. von Hand machen ?? :shock: Egal. Aber ich kann mir nicht vorstellen, daß alles im Source nochmals gemacht werden muß.


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