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; //Index
begin
  // i : integer;  <-----globale Variable die die Anzahl der Artikel zählt(nötig für Array)
  Form1.DBGDI.Connected := TRUE;

  SetLength(a,i);  //Länge des Arrays definieren

  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;                                                                                         //sucht nur MAC Artikel aus

  z := 0//<----Index für den jeweiligen Artikel
          // damit später den Artikeln die pasenden Preise zugewiesen werden können

  while not form1.qgdi.eof do  
  begin
    artikel := form1.qgdi.Fieldbyname('ARTIKELNR').AsString;
    delete(artikel,1,3);  //ersten 3 Zeichen werden gelöscht da er die Artikel sonst nicht findet(wegen MAC am Anfang)

    a[z] := artikel; // Artikelnummern werden in das Array eingefügt
    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 ist der Einkaufspreis
    hek := hek * 1.19;
    hek := hek * 1.2;
    hek := (round(hek * 10)) / 10 ;  //gerundeter Brutto Preis

    hekchange := Floattostr(hek);

    //form1.qgdi.Close;
    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);           //Bruttopreis
    form1.qgdi.execsql;

    //form1.Qgdi.Fieldbyname('MATERIAL');
    //Hier würde er mir anzeigen das er das Feld Material nicht findet

    nettopreis := strtofloat(hekchange);
    nettopreis := nettopreis / 1.19;
    nettostr := floattostr(nettopreis);

    //form1.qgdi.Close;
    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);               //Nettopreis
    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.


Delphi-Quelltext
1:
a : array of string;                    


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
user profile iconMagred 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....