Autor |
Beitrag |
rushtone
      
Beiträge: 38
|
Verfasst: Di 20.02.07 18:13
Hi, ich hab mich grade gefragt ob man per sql in eine tabelle mehreren datensätzen auf einmal was reinschreiben kann? wie genau verhält sich: Delphi-Quelltext 1:
| form15.Query1.sql.add('select distinct Datum from Einsätze.db where Added = ''' + 'Nein' + ''' AND Firma = ''' + form15.combobox1.text + ''' AND Baustelle = ''' + form15.combobox2.text + ''' '); | ? kann ich mir das wie in einem table vorstellen mit einem filter? gibts einem befehl allen datensätzen die diesem kriterien entsprechen etwas zu ändern? beispielsweise in meinem fall dem feld added den string ja zu zuweisen? distinct ist allerdings bestimmt fehlam platze oder? soll ja in allen datensätze die die kriterien erfüllen das feld added von 'nein' auf 'ja' geändert werden.. Moderiert von Klabautermann: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 20.02.2007 um 18:25Moderiert von Klabautermann: Code- durch Delphi-Tags ersetzt
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 20.02.07 18:15
Hallo!
Ja mit MySql geht das
SQL-Anweisung 1:
| Update Tabelle set Spalte = Wert where (select Spalten from Tabelle where Bedingung); |
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Di 20.02.07 18:17
Ist ja gleil... dieser Hinweis das gerade jemand eine Antwort gegeben hat! Ich weiß, das ist jetzt Off-Topic. Meine Begeisterung musste ich aber trotzdem los werden. ;-) Lg Martin
_________________ Ein Nutzer der Ecke
|
|
rushtone 
      
Beiträge: 38
|
Verfasst: Di 20.02.07 18:26
ZeitGeist87 hat folgendes geschrieben: | Hallo!
Ja mit MySql geht das
LG Stefan |
hmm bin anfänger .. wie genau bitte? query1.sql.add(Update Tabelle set Spalte = Wert where (select Spalten from Tabelle where Bedingung)); soo? also so: Delphi-Quelltext 1:
| form15.Query1.SQL('Update Einsätze.db set Added = Ja where (select Added from Einsätze.db where Added = ''' + 'Nein' + ''' AND Firma = ''' + form15.combobox1.text + ''' AND Baustelle = ''' + form15.combobox2.text + '''AND Datum = ''' + form15.combobox3.text + ''' ')); | gehts schonmal nicht.. Moderiert von Klabautermann: Code- durch Delphi-Tags ersetzt
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 20.02.07 18:39
verwendest du überhaupt MySQL`?
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
rushtone 
      
Beiträge: 38
|
Verfasst: Di 20.02.07 18:42
ZeitGeist87 hat folgendes geschrieben: | verwendest du überhaupt MySQL`? |
benutze delphi und greife über ein query auf ne paradox tabelle zu..
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 20.02.07 18:44
gut...wies da ausschaut weiß ich leider nicht...
bin leider kein spezialist für paradox...
aber hier gibts sicher jemanden der dir helfen kann...sorry..
aber mein vorschlag: Erst alle Daten holen die manipuliert werden sollen oder nur die ID und dann über ne Schleife das manipulierende Statement ausführen mit "... where ID = gemerkteID[n]";
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Martin1966
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Di 20.02.07 18:52
Eine Select Anweisung INNERHALB einer Bedingung? Hab ich ja noch nie gesehen !?!?!
Mein Vorschlag:
SQL-Anweisung 1:
| Update Tabelle set Spalte = Wert where Bedingung |
Nicht mehr und nicht weniger. Damit kannst du auf einen Schlag bei mehreren Datensätzen einen oder mehrere Werte ändern.
_________________ Ein Nutzer der Ecke
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Di 20.02.07 19:12
Ja richtig Martin
Eine SQL-Anweisung innerhalb einer SQL-Anweisung
Ist bei MySQL ohne Probleme möglich.
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
rushtone 
      
Beiträge: 38
|
Verfasst: Di 20.02.07 22:26
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Di 20.02.07 22:40
|
|
rushtone 
      
Beiträge: 38
|
Verfasst: Di 20.02.07 23:32
raiguen hat folgendes geschrieben: | Moin
Bei LocalSQL geht das auch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| form15.Query1.SQL.Text := 'UPDATE Einsätze.db SET Added = "Ja" ' + 'WHERE Added IN ' + '(SELECT Added FROM Einsätze.db WHERE (Added = "Nein") AND ' + ' (Firma =:FIRMA) AND (Baustelle =:BAUST) AND (Datum =:DATUM ))';
form15.Query1.ParamByNAme('FIRMA').AsString := form15.combobox1.text; form15.Query1.ParamByName('BAUST').AsString := form15.combobox2.text; form15.Query1.ParamByName('DATUM').AsString :=form15.combobox3.text; form15.Query1.ExecSQL; |
Allerdings kann der o.a. Ausdruck m.E. vereinfacht werden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| form15.Query1.SQL.Text := 'UPDATE Einsätze.db SET Added = "Ja" ' + 'WHERE (Added = "Nein") AND ' + '(Firma =:FIRMA) AND (Baustelle =:BAUST) AND (Datum =:DATUM )';
form15.Query1.ParamByNAme('FIRMA').AsString := form15.combobox1.text; form15.Query1.ParamByName('BAUST').AsString := form15.combobox2.text; form15.Query1.ParamByName('DATUM').AsDateTime :=DateToStr(form15.combobox3.text); form15.Query1.ExecSQL; | |
was genau passiert da jetzt bei deinem code?
ich möchte ja nur das feld added ändern, aber nur bei den datensätzen die die kriterien erfüllen..
sonst nix..
das hier hört sich gut an:
form15.Query1.SQL.add('Update Einsätze.db set Added = Ja where Added = ''' + 'Nein' + ''' AND Firma = ''' + form15.combobox1.text + ''' AND Baustelle = ''' + form15.combobox2.text + '''AND Datum = ''' + form15.combobox3.text + ''' ');
will nur wissen warum da nix passiert. es gibt keinen fehler es wird aber auch nichts geändert in der tabelle.
added ist anchwievor auf Nein, obwohl da ja jetzt eigentlich ja stehen sollte.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 20.02.07 23:32
_________________ Na denn, dann. Bis dann, denn.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 20.02.07 23:37
Martin1966 hat folgendes geschrieben: | Eine Select Anweisung INNERHALB einer Bedingung? Hab ich ja noch nie gesehen !?!?! |
das ganze ist sogar normiert und net sich subselect. gehört glaub ich zum standard sql92 oder so...
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 21.02.07 00:39
Schonmal was von RequestLive (Eigenschaft von TQuery) gehört?
Auszug aus der Delphi Hilfe:[highlight]
Die Eigenschaft RequestLive fordert eine aktualisierbare Ergebnismenge von der Datenbank an.
[/highlight]
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Mi 21.02.07 12:35
Sinspin hat folgendes geschrieben: | Schonmal was von RequestLive (Eigenschaft von TQuery) gehört?.. |
Ähm, das ist zwar prinzipiell richtig, hat aber mit dem eigentlichen Problem des Fragestellers nichts zun tun.
RequestLive macht nur dann einen Sinn, wenn ich die Spalten einer Query mittels DBEdit editieren will/möchte und anschließend die Änderung(en) mit Query.Post abspeichern möchte...
In der Regel ist nämlich das Ergebnis einer Query ReadOnly - sprich NICHT direkt änderbar...
@rushtone:
rushtone hat folgendes geschrieben: |
das hier hört sich gut an:
form15.Query1.SQL.add('Update Einsätze.db set Added = Ja where Added = ''' + 'Nein' ...{weiterer COde))
|
Genau damit hast du ja anscheinend die 'Probleme', woraufhin ich einen entsprechend geänderten Code angegeben habe. Hast du selbigen denn mal ausgeführt?
HIER ist bereits ein deutlicher Unterschied zu erkennen:
Delphi-Quelltext
Du nimmst das Feld Ja und weist dessen Inhalt dem Feld Added zu! Sicher, dass in deiner Tabelle ein solches Feld existiert? Anscheinend ja, weil das Prog beim Ausführen des SQL nicht meckert...
rushtone hat folgendes geschrieben: | ich möchte ja nur das feld added ändern, aber nur bei den datensätzen die die kriterien erfüllen..
sonst nix.. |
Wenn nichts geändert wird, dann scheinen die Kriterien nicht zu stimmen, will sagen: es gibt keine Datensätze, die den Bedingungen entsprechen, also wird dann auch nichts geändert.
Vergleiche händisch, ob bspw. die Combobox-Einträge zu Firma, Baustelle auch exact den Einträgen in deiner Tabelle entsprechen-sind unterschiedliche Schreibweisen enthalten?...
|
|
rushtone 
      
Beiträge: 38
|
Verfasst: Mi 21.02.07 19:16
raiguen hat folgendes geschrieben: | Sinspin hat folgendes geschrieben: | Schonmal was von RequestLive (Eigenschaft von TQuery) gehört?.. |
Ähm, das ist zwar prinzipiell richtig, hat aber mit dem eigentlichen Problem des Fragestellers nichts zun tun.
RequestLive macht nur dann einen Sinn, wenn ich die Spalten einer Query mittels DBEdit editieren will/möchte und anschließend die Änderung(en) mit Query.Post abspeichern möchte...
In der Regel ist nämlich das Ergebnis einer Query ReadOnly - sprich NICHT direkt änderbar...
@rushtone:
rushtone hat folgendes geschrieben: |
das hier hört sich gut an:
form15.Query1.SQL.add('Update Einsätze.db set Added = Ja where Added = ''' + 'Nein' ...{weiterer COde))
|
Genau damit hast du ja anscheinend die 'Probleme', woraufhin ich einen entsprechend geänderten Code angegeben habe. Hast du selbigen denn mal ausgeführt?
HIER ist bereits ein deutlicher Unterschied zu erkennen:
Delphi-Quelltext
Du nimmst das Feld Ja und weist dessen Inhalt dem Feld Added zu! Sicher, dass in deiner Tabelle ein solches Feld existiert? Anscheinend ja, weil das Prog beim Ausführen des SQL nicht meckert...
rushtone hat folgendes geschrieben: | ich möchte ja nur das feld added ändern, aber nur bei den datensätzen die die kriterien erfüllen..
sonst nix.. |
Wenn nichts geändert wird, dann scheinen die Kriterien nicht zu stimmen, will sagen: es gibt keine Datensätze, die den Bedingungen entsprechen, also wird dann auch nichts geändert.
Vergleiche händisch, ob bspw. die Combobox-Einträge zu Firma, Baustelle auch exact den Einträgen in deiner Tabelle entsprechen-sind unterschiedliche Schreibweisen enthalten?... |
nee die schreibweise und alles ist gleich. ich hab die werte aus der datenbank ja aus der tabelle übernommen..
der code hier:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| form15.Query1.SQL.Text := 'UPDATE Einsätze.db SET Added = "Ja" ' + 'WHERE (Added = "Nein") AND ' + '(Firma =:FIRMA) AND (Baustelle =:BAUST) AND (Datum =:DATUM )';
form15.Query1.ParamByNAme('FIRMA').AsString := form15.combobox1.text; form15.Query1.ParamByName('BAUST').AsString := form15.combobox2.text; form15.Query1.ParamByName('DATUM').AsDateTime :=Strtodate(form15.combobox3.text); form15.Query1.ExecSQL; |
funktioniert einwandfrei, wobei ich lieber diese variante genommen hätte..
form15.Query1.SQL.add('Update Einsätze.db set Added = Ja where Added = ''' + 'Nein' ...{weiterer COde))
aber die geht ja leider irgendwie nicht..
kann mir kurz jemand in einfachen worten erklären was der code oben (der funktioniert) macht?
ich benutze nämlich nciht gerne code wen ich nicht weiß was der macht..
ich will ja auch nicht alle nase lang hier fragen, sondern ich wills verstehen um den code für das nächste problem das ich habe selbst umfriemeln zu können.
und @raiquen: nein ich habe kein feld ja..
nur das feld added und in dieses feld soll ja reingeschrieben werden..
sorry für das ganze heckmeck, aber bin echt nur hobbyprogrammierer und hab mir das alles selbst angeeignet was ich bisher kann..
und dafür bin ich gar nicht mal schlecht. und da dachte ich ich schreib für meine firma mal nen eigenes rechnungsproggi.
Vielen dank für die hilfe ohne euch wär ich wohl verloren.
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Do 22.02.07 01:15
Quelltext 1: 2: 3:
| form15.Query1.SQL.Text := 'UPDATE Einsätze.db SET Added = "Ja" ' + 'WHERE (Added = "Nein") AND ' + '(Firma =:FIRMA) AND (Baustelle =:BAUST) AND (Datum =:DATUM )'; |
Okay, hier einige Erklärungen:
Zunächst wird das SQL-Statement aufgebaut, wobei hier Parameter (also Platzhalter) verwendet werden; das vereinfacht zum einen die Schreibweise und vermeidet die Hochkomma-Orgie wie in deinem Code...
Natürlich muss der o.a. SQL-Rumpf noch mit Werten gefüllt werden, sprich die Parameter werden 'gefüttert'; und das geht mit der Methode .ParamByName(Parametername).As Typ:
Quelltext 1: 2: 3: 4:
| form15.Query1.ParamByNAme('FIRMA').AsString := form15.combobox1.text; form15.Query1.ParamByName('BAUST').AsString := form15.combobox2.text; form15.Query1.ParamByName('DATUM').AsDateTime :=Strtodate(form15.combobox3.text); form15.Query1.ExecSQL; |
Zitat: |
und @raiquen: nein ich habe kein feld ja..
nur das feld added und in dieses feld soll ja reingeschrieben werden..
|
Genau das habe ich befürchtet (Kein Feld mit der Bezeichnung Ja)  Delphi hätte hier aber beim Ausführen des Statements meckern müssen (...unbekanntes Feld Ja...)
Das Feld Added ist ja vom Typ ftString, also muss auch die Zuweisung so geschrieben werden (sh. mein Code!): SET Added=''Ja''...  Übrigens: bei LocalSQL darf man für StringWerte auch so schreiben SET Added="Ja"...
Wenn du lieber mit deinem Code arbeiten möchtest, bitte sehr (habe ihn mal übersichtlicher gestaltet):
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| form15.Query1.SQL.Clear; form15.Query1.SQL.Add('Update Einsätze.db set Added = "Ja" '); form15.Query1.SQL.Add('WHERE (Added = "Nein") AND (Firma = "' + form15.combobox1.text + '") '); form15.Query1.SQL.Add('AND (Baustelle = "' + form15.combobox2.text + '") '); form15.Query1.SQL.Add('AND (Datum = "' + form15.combobox3.text + '") '); form15.Query1.ExecSQL; |
Bei mehreren Kriterien in einer WHERE-Klauses empflieht es sich, die einzelen Bedingungen in Klammern zu umschließen...spätestens dann, wenn AND und OR gemischt auftauchen.
So, nun teste mal bitte meinen (deinen angepassten) Code; würd sagen: selbiger funktioniert genaus wie meiner mit den Parametern...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 22.02.07 09:30
Ich würde -wenn überhaupt- die 'Format' Funktion verwenden. Dann wird das noch übersichtlicher (finde ich):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Const szUpdateSQL = 'Update Einsötze.db set Added = "Ja" where (Added = "Nein") ' +'and (Firma = "%s") and (Baustelle="%s") and (Datum="%s")';
Begin ... With Form15, Query1 do Begin SQL.Text := Format (szUpdateSQL, [combobox1.text, combobox2.text,combobox3.text]); ExecSQL; End ... |
Kurze Frage: Das 'Datum' enthält Datum UND Uhrzeit? Dann klappt das nämlich nicht. Verwende dann 'BETWEEN', also 'Datum liegt zwischen Datum1 und Datum1+1'
_________________ Na denn, dann. Bis dann, denn.
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Do 22.02.07 10:44
alzaimar hat folgendes geschrieben: | Ich würde -wenn überhaupt- die 'Format' Funktion verwenden. Dann wird das noch übersichtlicher (finde ich)... |
Das ist eine weitere gute Möglichkeit, die Übersichtlichkeit des Codes zu verbessern - keine Frage! Gegenüber der Hochkomma-Orgie auf jeden Fall vorzuziehen...
alzaimar hat folgendes geschrieben: | Kurze Frage: Das 'Datum' enthält Datum UND Uhrzeit? Dann klappt das nämlich nicht. Verwende dann 'BETWEEN', also 'Datum liegt zwischen Datum1 und Datum1+1' |
Auch hier stimme ich insofern zu, dass das Datums'handling' nicht immer einfach ist, speziel dann, wenn die Zeit noch irgendwie mit reinspielt
rushtone hat ja aber selber gesagt, dass sein Code NICHT funktioniert, während mein Codeschnippsel brauchbare Ergebnisse abgeliefert hat (wenn ich ihn richtig verstanden habe)
|
|