![]() |
Insert SQL
Hi,
ich komme mit dem insert einfach nicht klar. Um überhaupt etwas in der DB sehen zu können habe ich kurzerhand folgendes probiert:
Code:
Da scheint aber fast alles verkehrt zu sein. 8) Aber es kommt keine Fehlermeldung. Für die ID habe ich einen Trigger, würde das so gehen ?
DS.Close;
DS.UpdateSQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (11)'; DS.Open; |
Wenn Du mit TUpdateSQL ein INSERT-Statement an dei DB schicken willst, dann mußt Du das Statement in die Eigenschaft InsertSQL eintragen.
|
Der Code geht so schon, auch der Trigger feuert, aber im Delphi Programm geht es nicht. Ist das Dataset vielleicht verkehrt ? Aber ich setze doch nur den DB-Befehl damit ab, so wie mit ohne Delphi auch. Mich stört, daß keine Fehlermeldung kommt und sich nichts tut.
|
Hi Hansa,
Zitat:
1. Durch ein Open werden die Update, Refresh, Insert und Delete-Statements der DataSet NICHT ausgeführt, sondern nur durch die entsprechende Methode (.Update, .???, .Insert, .Delete). 2. steht das Ding im Update-SQL drin, so dass zum Ausführen ein Update notwendig währe (funktionieren sollte es aber dann). Wenn Du so was machen willst (ein DML-Statement ausführen ohne vorher eine Datenmenge zu holen) dann schreib das SQL in die normale SelectSQL Eigenschaft rein und führe die SQL dann mit einem ExecSQL aus (nicht Open verwenden!). Grüße Lemmy |
Zitat:
Code:
LagDS.Close;
LagDS.InsertSQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (33)' LagDS.Open; Transaction.Commit; |
Jedes TQuery (und auch dessen Nachkommen in Fremdkomponenten) besitzt die Methode ExecSQL. Diese verwendest Du für Datenmanipulationsabfragen, also INSERT, UPDATE und DELETE, welche keine Datenmenge als Ergebnis zurückliefern.
Delphi-Quellcode:
Damit wird die SQL-Abfrage ausgeführt. Für SELECT-Anweisungen musst Du dagegen open verwenden, um danach auf die zurückgelieferten Daten zugreifen zu können.
DS.SQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (33)';
DS.ExecSQL; ... Ein explizites Schließen des Datasets ist nicht nötig, dies wird beim Zuweisen eines neuen SQL-Befehls automatisch erledigt. :coder: |
Ich muß also TQuery statt Tdataset verwenden ? Probiere es sofort aus, aber was ist bei dem Lagerbeispiel ? Angenommen ich habe einen neuen Artikel, dann ist sowieso keine Datenmenge da, aber bei einem bestehenden Bestand muß ich ja zuerst diesen lesen und dann aktualisieren, z.B. Zugänge verbuchen. Muß ich da jetzt ein Dataset UND ein Query benutzen ? Ersteres zum lesen der vorhandenen Daten und die Query zum updaten, oder wie ?
|
HI Hansa,
nochmal anders: Übliches Vorgehen bei einer TDataSet: 1. Über eine Select-SQL wird eine Datenmenge vom Server geholt:
Code:
2. Über visuelle Felder werden die Daten angezeigt und können bearbeitet werden. Dazu steht z.B. in der DeleteSQL Eigennschaft die entsprechende SQL:
DataSet.SelectSQL.Text:='Select * from Tabelle';
DataSet.Open;
Code:
Diese Standard-SQL-Statements werden bei den entsprechenden Methodenaufrufen (Delete) entsprechend ausgeführt ohne dass der Benutzer noch was machen muss.
delete from Tabelle
where ID = :OLD_ID Für Dein Beispiel würde das heißen:
Code:
Das sind genau die SQL-Statements die z.B. die TIBDataset automatisch generiert (Rechter Mausklick auf die TDataSet). Nun kannst Du mit folgendem Code Inserts durchführen:
LagDS.Close
LagDs.SelectSQL.Text:='Select * from Lager;'; LagDs.DeleteSQL:Text:='Delete from Lager where ????'; LagDs.UpdateSQL.Text:='Update Lager Set.....'; ÖagDs.RefreshSQL.Text:='.....'; LagDs.InsertSQL.Text:='Insert into Lager (Menge) VALUES (:Menge)';
Code:
Du siehst das ist ein riesen Aufwand, speziell dann, wenn man eigentlich keine Daten vom Server holen will. Deshalb gehe ich in diesen Fällen her und verwende direkt die TDataSet.SelectSQL-Eigenschaft, schreibe da die entsprechende SQL rein und führe diese über ein ExecSQL aus, so wie ich es im vorherigen Post geschrieben habe.
LagDS.Open;
LagDS.Insert; LagDS['Menge']:=33; LagDs.Post; LagDS.Close; Transaction.Commit; Grüße Lemmy |
Zitat:
|
Wie kommen die 20 neuen Teile in das "lager"? Durch die explizite Eingabe eines Users in einer Maske oder durch "automatische" Eingabe z.B. bei der Eingabe einer Rechnung?
Im ersten Fall wirst Du doch sowieso die Daten des Lagers irgendwie in einer Tabelle anzeigen lassen, d.h. du hast schon eine TDataSet in Verwendung, die Du dann auch für die Neueingabe verwenden kannst. Im zweite Fall würde ich es über eine spezielle TDataSet/TQuery machen, in der du das Insert eben in die SelectSQL-Eigenschaft schreibst... Grüße Lemmy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 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