Autor Beitrag
hube
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

WIN XP
D7 Prof
BeitragVerfasst: Sa 29.01.05 21:14 
Hallo

Ich habe folgenden Code, welcher so auch funtioniert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add ('UPDATE Lager');
Query1.SQL.Add ('set abgerechnet_betrag =' + Label9.Caption);
Query1.SQL.Add ('WHERE Kundennummer =' + DBText1.Caption);
Query1.SQL.Add ('AND status = ''verkauft''');
Query1.SQL.Add ('AND abgerechnet_betrag = 0');
try
Query1.ExecSQL;
except
on E : Exception do ShowMessage(E.Message);
end;
Query1.Close;
end;


Nun möchte ich jedoch in die Spalte "abgerechnet_datum" das aktuelle Datum des Updates und in die Spalte "abgerechnet_zeit" die aktuelle Zeit des Updates übergeben.

Wenn ic die Zeile:
ausblenden Delphi-Quelltext
1:
Query1.SQL.Add ('set abgerechnet_betrag =' + Label9.Caption);					


so abändere:

ausblenden Delphi-Quelltext
1:
2:
3:
Query1.SQL.Add ('set abgerechnet_betrag =' + Label9.Caption);
Query1.SQL.Add (', abgerechnet_datum =' + Label10.Caption); // enthält das Datum
Query1.SQL.Add (', abgerechnet_Zeit =' + Label11.Caption); // enthält die Zeit


so funzt das nicht. Es kommt die Fehlermeldung:
"Meldung: Ungültiges Schlüsselwort Symbol-String .2005 WHERE Zeilennummer: 3"

Hat jemand eine Ahnung, wieso das nicht geht?

Danke für die Hife

hube

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
r4id3n
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 115

Win XP Home, Win XP Pro
D6 Prof, D7 Ent, K3 Ent
BeitragVerfasst: Sa 29.01.05 21:41 
Du solltest um deine Captions noch ein QuotedStr machen! Das löst so manches Problem ;-)
Thunderous
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Win XP, Win 2000, Win 98, FreeBSD, Linux
D5 Prof, FreePascal, Lazarus
BeitragVerfasst: Sa 29.01.05 21:51 
zur not solltest du dir vielleicht beim fehler dein sql statement ausgeben lassen, dann erkennt man manchmal schon auf den ersten blick was schief gelaufen ist ;)
hube Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

WIN XP
D7 Prof
BeitragVerfasst: So 30.01.05 09:36 
Vielen Dank für die Hilfe. :D

Das mit den QuotedStr war die Lösung.

Nun sieht das SQL-Satement so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add ('UPDATE Lager');
Query1.SQL.Add ('set abgerechnet_betrag =' + Label9.Caption);
Query1.SQL.Add (', abgerechnet_datum = '+QuotedStr(Label10.Caption));
Query1.SQL.Add (', abgerechnet_zeit = '+QuotedStr(Label11.Caption));
Query1.SQL.Add ('WHERE Kundennummer = ' + DBText1.Caption);
Query1.SQL.Add ('AND status = ''verkauft''');
Query1.SQL.Add ('AND abgerechnet_betrag = 0');


Und nun funzt's auch.

Nochmals vielen Dank. :lol:

hube

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
MrSpock
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: So 30.01.05 11:28 
Hallo hube,

du solltest vielleicht noch wissen, warum es mit QuotedStr funktioniert. Zunächst einmal erzeugst du ja damit im SQL Statement ein Abfrage, die ein Datum mit einem String vergleicht. Dabei hilft dir die implizite Typumwandlung. Interbase / Firebird versucht verschiedene Typen ineinander umzuwandeln, was zwischen String und Date funktioniert. Wenn du in Delphi auch schon einen Date oder DateTime Typ hättest, wäre es besser mit Parametern zu arbeiten:

ausblenden Quelltext
1:
SELECT * FROM mytab WHERE vonDatum <= :vonDatum					


und dann vor Ausführung des Statements:

ausblenden Delphi-Quelltext
1:
2:
myQry.ParamByName('vonDatum').AsDateTime := myDateTime;
myQry.Open;


Das Problem bei der impliziten Typumwandlung ist z.B. die Reihenfolge von Monat und Tag oder das Format als solches. Muss es '01-Dec-2005' oder '01.12.2005' oder '12.01.2005' oder '01-Dez-2005' heißen oder funktionieren mehrere? Die Verantwortung hast du nun in die Hände des Nutzers gelegt, der ja im EditFeld jedes beliebige Format eingeben kann!?

_________________
Live long and prosper
MrSpock \\//
hube Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

WIN XP
D7 Prof
BeitragVerfasst: So 30.01.05 13:54 
Hallo MrSpock

Vielen Dank für Deine weiterreichenden Erklärungen.

Die Grund/Sinn meines SQL-Statementes ist folgender:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Query1.SQL.Add ('UPDATE Lager');  // Table auswählen
Query1.SQL.Add ('set abgerechnet_betrag =' + Label9.Caption);  // Das Feld "abgerechnet_betrag" mit dem Betrag von Label9 ausfüllen
Query1.SQL.Add (', abgerechnet_datum = '+QuotedStr(Label10.Caption)); // Das Feld "abgerechnet_datum" mit dem Datum vom Label10 (kommt von (DateToStr(now)) abfüllen
Query1.SQL.Add (', abgerechnet_zeit = '+QuotedStr(Label11.Caption));  // Das Feld "abgerechnet_zeit" mit der Zeit vom Label11 (kommt von (TimeToStr(now)) abfüllen
Query1.SQL.Add ('WHERE Kundennummer = ' + DBText1.Caption);  // Wo die Kundenummer=Kundenummer
Query1.SQL.Add ('AND status = ''verkauft''');  //Der Artikel auch wirklich verkauft ist
Query1.SQL.Add ('AND abgerechnet_betrag = 0'); //Noch keine Abrechung erstellt wurde


Komisch ist nur, dass sowohl das Daum wie auch die Zeitanzeige (LabelXX.Caption) optisch richtig dargestellt wurden (25.01.2005 und nicht Jan-25-05).

Zu Deinen Bedenken bezüglich der Fehleingabe durch den Benutzer; dies ist nicht möglich, da die Daten ja vom System kommen und keine manuelle Eingabe erfordern.

Gruss hube

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt