Autor Beitrag
Magred
Hält's aus hier
Beiträge: 5

Win XP
Delphi 2006
BeitragVerfasst: Mi 13.08.08 11:47 
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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: 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.

_________________
Gruß Aga
Magred Threadstarter
Hält's aus hier
Beiträge: 5

Win XP
Delphi 2006
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 13.08.08 14:50 
user profile iconMagred hat folgendes geschrieben:

[...]
ausblenden 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 "+"?


ausblenden 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.

ausblenden SQL-Anweisung
1:
[...] set material = :Netto [...]					
Magred Threadstarter
Hält's aus hier
Beiträge: 5

Win XP
Delphi 2006
BeitragVerfasst: 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).
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 5

Win XP
Delphi 2006
BeitragVerfasst: 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....