AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Insert SQL

Ein Thema von Hansa · begonnen am 29. Jun 2003 · letzter Beitrag vom 16. Okt 2004
Antwort Antwort
Seite 1 von 3  1 23      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Insert SQL

  Alt 29. Jun 2003, 14:44
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:
DS.Close;
DS.UpdateSQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (11)';
DS.Open;
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#2
  Alt 29. Jun 2003, 15:02
Wenn Du mit TUpdateSQL ein INSERT-Statement an dei DB schicken willst, dann mußt Du das Statement in die Eigenschaft InsertSQL eintragen.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 29. Jun 2003, 20:28
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#4
  Alt 30. Jun 2003, 08:13
Hi Hansa,

Zitat von Hansa:
Der Code geht so schon, auch der Trigger feuert, aber im Delphi Programm geht es nicht.
Das ist doch genau das, was r_kerber gesagt hat. Das SQL-Statement ist schon richtig, nur wird es nicht ausgeführt:

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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5
  Alt 30. Jun 2003, 10:36
Zitat von Lemmy:
... 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!).
Da da ist mir zu hoch. Was hat das jetzt mit leeren Datenmengen zu tun ? Ich habe ja extra den Lagerbestand genommen, da kann ich vorher nicht wissen, ob die Datenmenge leer ist. Das Dataset hat zudem keine Eigenschaft "ExecSQL". Je nach Lage muß das eben ein Insert, oder ein Update sein. Im Moment sieht der relevante Code so aus:

Code:
LagDS.Close;
LagDS.InsertSQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (33)'
LagDS.Open;
Transaction.Commit;
Gruß
Hansa
  Mit Zitat antworten Zitat
Alfons_G

Registriert seit: 7. Jun 2002
Ort: München
296 Beiträge
 
Delphi 2007 Architect
 
#6
  Alt 30. Jun 2003, 11:04
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:
DS.SQL.Text := 'INSERT INTO LAGER (MENGE) VALUES (33)';
DS.ExecSQL;
...
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.
Ein explizites Schließen des Datasets ist nicht nötig, dies wird beim Zuweisen eines neuen SQL-Befehls automatisch erledigt.

Alfons Grünewald



Alfons Grünewald
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7
  Alt 30. Jun 2003, 11:29
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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#8
  Alt 30. Jun 2003, 11:56
HI Hansa,


nochmal anders: Übliches Vorgehen bei einer TDataSet:

1. Über eine Select-SQL wird eine Datenmenge vom Server geholt:
Code:
DataSet.SelectSQL.Text:='Select * from Tabelle';
DataSet.Open;
2. Über visuelle Felder werden die Daten angezeigt und können bearbeitet werden. Dazu steht z.B. in der DeleteSQL Eigennschaft die entsprechende SQL:

Code:
delete from Tabelle
where
  ID = :OLD_ID
Diese Standard-SQL-Statements werden bei den entsprechenden Methodenaufrufen (Delete) entsprechend ausgeführt ohne dass der Benutzer noch was machen muss.

Für Dein Beispiel würde das heißen:

Code:
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)';
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:


Code:
  LagDS.Open;
  LagDS.Insert;
  LagDS['Menge']:=33;
  LagDs.Post;
  LagDS.Close;
  Transaction.Commit;
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.


Grüße
Lemmy
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9
  Alt 30. Jun 2003, 13:10
Zitat von Lemmy:
...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.
So weit habe ichs jetzt geschnallt. Habe es frei nach Alfons_g gemacht. Eine Query und ein ExecSQL, geht auch soweit mit insert. Aber was ist wenn ich einen vorhandenen Lagerbestand von 10 habe und da noch 10 Teile ins Lager kommen ? Dann muß ich doch updaten odewr nicht ? Vorher muß ich dann mit select den alten Bestand suchen und die Zahl von 10 auf 20 erhöhen ? Oder soll ich das Löschen und durch 20 ersetzen ???
Gruß
Hansa
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#10
  Alt 30. Jun 2003, 13:29
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 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