Entwickler-Ecke
Datenbanken - SQL UPDATE Problem
Magred - Mi 13.08.08 11:47
Titel: SQL UPDATE Problem
Hallo,
ich stehe vor folgendem Problem:
Ich habe ein Programm in dem die Preise die in einem Warenwirtschaftsprogramm sind aktualisiert werden sollen.
Das Programm soll also mithilfe eines Update Befehls die Daten aktualisieren.
Datenbank alte Preise: Interbase
Datenbank neue Preise: Access
Ich habe den Update Teil auch schon durchgestept und es stehen überall die richtigen Werte drin. Nur leider findet er anscheinend das Feld in der Interbase Datenbank nicht.
Fehlermeldungen kommen übrigens keine.
Den Wert von i nimmt er sich aus einer anderen Procedur, aber der Wert stimmt.
Schoneinmal danke im vorraus und entschuldigung falls es diese Frage schoneinmal gab(hab es nicht gefunden)
Hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| procedure Tfm_preisakt.bt_aaktClick(Sender: TObject); var mysql: string; nettopreis : double; nettostr : string; artikel : string; hekchange : string; hek : double; a : array of string; z : integer; begin Form1.DBGDI.Connected := TRUE;
SetLength(a,i); DecimalSeparator := '.';
form1.qgdi.Close; form1.qgdi.SQL.clear; form1.qgdi.SQL.add('Select ARTIKELNR, MATERIAL from PREISE where PREISLST = 2 AND Artikelnr LIKE'+ QuotedStr('MAC'+'%')); form1.qgdi.Open; z := 0; while not form1.qgdi.eof do begin artikel := form1.qgdi.Fieldbyname('ARTIKELNR').AsString; delete(artikel,1,3); a[z] := artikel; z := z + 1;
form1.qgdi.next; end; z := 0;
while z <> i do begin Form1.Qmac.close; Form1.Qmac.sql.clear; Form1.qmac.SQL.Add('Select HEK FROM mac_dbf where Artikel_nr =' +#39+a[z]+#39); Form1.Qmac.open;
hek := Form1.qmac.FieldByName('HEK').AsFloat; hek := hek * 1.19; hek := hek * 1.2; hek := (round(hek * 10)) / 10 ; hekchange := Floattostr(hek);
form1.qgdi.sql.clear; mysql:='UPDATE PREISE SET MATERIAL = '+#39+hekchange+#39+' where Preislst = 2 AND Artikelnr =' +#39+a[z]+#39; form1.qgdi.SQL.Add(mysql); form1.qgdi.execsql;
nettopreis := strtofloat(hekchange); nettopreis := nettopreis / 1.19; nettostr := floattostr(nettopreis);
form1.qgdi.sql.clear; mysql:='UPDATE PREISE SET MATERIAL = '+#39+nettostr+#39' where Preislst = 1 AND artikelnr =' +#39+a[z]+#39; form1.qgdi.SQL.Add(mysql); form1.qgdi.execsql;
z := z + 1; form1.qmac.next; end; form1.qgdi.close; Form1.DBGDI.Connected := FALSE; end; |
Agawain - Mi 13.08.08 13:10
Hi
und :welcome:
überprüf mal die Eigenschaften der Variable Artikelnr, bzw. auch die Feldeigenschaften in der jeweiligen DB.
Artikelnr ist String, das Array ist ein Integer-Array.
Magred - Mi 13.08.08 13:50
Hallo nochmal und danke für die nette Begrüßung.
Also...
Hier mal die Werte aus der Access Datenbank(da sind die neuen Preise drin die in die andere Datenbank sollen):
ARTIKEL_NR = Text(also String)
HEK = Zahl(schätzungsweise Integer)
und hier die Werte aus der Datenbank des Warenwirtschaftsprogramms
(Das Programm heist GDI und hat eigene Feldnamen):
ARTIKELNR = GDI_CHAR30(schätzungsweise String mit max 30 Zeichen)
PREISLST = GDI_SHORT(kleiner Integer)
MATERIAL = GDI_FLOAT(Gleitkommazahlen)
meiner Meinung nach sollte der Quellcode passen. Es kommt ja auch keine Fehlermeldung. Der Update Befehl macht einfach nicht das was er tun sollte.
is doch ein string array oder täusch ich mich da?
Danke für die schnelle Antwort.
baka0815 - Mi 13.08.08 14:50
Titel: Re: SQL UPDATE Problem
Magred hat folgendes geschrieben: |
[...]
Delphi-Quelltext 1: 2: 3:
| [...] mysql:='UPDATE PREISE SET MATERIAL = '+#39+nettostr+#39' where Preislst = 1 AND artikelnr =' +#39+a[z]+#39; [...] | |
Fehlt da nicht ein "+"?
Delphi-Quelltext
1: 2: 3:
| [...] mysql:='UPDATE PREISE SET MATERIAL = '+#39+nettostr+#39+' where Preislst = 1 AND artikelnr =' +#39+a[z]+#39; [...] |
Ich würd's nach Möglichkeit nicht mit dem Konkatenieren von Strings machen, sondern benannte Parameter für's SQL verwenden.
Dadurch verhindert man nicht nur Code/SQL-Injection, sondern auch Konvertierungsprobleme aufgrund der Ländereinstellungen.
SQL-Anweisung
1:
| [...] set material = :Netto [...] |
Magred - Mi 13.08.08 15:57
Das Problem an der Sache ist: Ich programmiere noch nicht sehr lange mit Delphi und hab hier und da so meine Probleme mit SQL Befehlen in Delphi. Eigentlich war bis jetzt immer alles schon alleine lösbar...
Diese SQL Befehle mit dem : seh ich gerade zum ersten mal. Ich hab gerade ein bisschen das Forum und das Internet durchsucht um mal ein anständiges Tutorial dafür zu finden. Leider war die Suche Ergebnislos -.-.
Meines wissens kann man die Befehle ja nicht einfach an der Stelle reinhämmern wo meine alten Befehle stehn, und falls doch hab ichs Falsch gemacht.
An dem + lags übrigens auch nicht denn er ignoriert mir immer noch den Update Befehl, und das obwohl er es in einem anderen Teil des Programms nicht tut.(bzw glaube ich das er das Feld MATERIAL nicht findet auch wenn keine Fehlermeldung kommt).
Delete - Mi 13.08.08 22:08
@Magred: hast dich schon mit den datentypen beschäftigt???
mir kommt es vor als ob du 'n real 'n string übergibst... das kann er natürlich nicht umwandeln, da er eine zahl erwartet ... daher wird er NULL übergeben ...
... und dies ist dein ergebnis, dass du keinen fehler bekommst aber auch keinen wert in der db...
also zahlen ohne quotes (auch ohne #...)
<HTH> GG
Magred - Do 14.08.08 17:10
Vielen Dank an alle für die Hilfe.
Habe das Problem jetzt gefunden. War ein leichtsinns Fehler. Die 3 Zeichen die am Anfang gelöscht habe musste ich am Ende wieder hinzufügen. Habe mir irgendwie eingebildet das ich das eingebaut hatte :-).
Grenzgeanger du hast Recht ich übergebe wirklich einen String obwohl das Feld ein Float Feld ist. Das lustige an der Sache ist mit einem Float Wert geht es nicht, es muss ein String sein.
Liegt vielleicht an der Datenbank des Warenwirtschaftprogramms....
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!