Moin conny drexler!
1. Ist das, die richtige Syntax???
datamodule1.Table1LAGERBEST.AsFloat
Oder sollte es so sein:
datamodule1.Table1.FieldByName('LAGERBEST').AsFloat
2.Für bessere Lesbarkeit, benutze die "with" Anweisung:
z.B. statt:
Delphi-Quellcode:
DataModule1.Table1.First;
DataModule1.Table1.Next;
DataModule1.Table1.Edit;
DataModule1.Table1.FieldByName('VORNAME').AsString := 'John';
DataModule1.Table1.Post;
schreib:
Delphi-Quellcode:
with DataModule1.Table1 do
begin
First;
Next;
Edit;
FieldByName('VORNAME').AsString := 'John';
Post;
end;
3. Falls der gesuchte Artikel im ersten Record deiner Table1 ist, dann findest du ihn nicht!
Weil:
Delphi-Quellcode:
...
datamodule1.Table1.First; <- hier wird auf den ersten Record in der Table1 positioniert
gefunden := false;
while (not(datamodule1.Table1.Eof)) or
(datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer) do
Begin
datamodule1.table1.Next; <- hier wird der erste Record übersprungen ohne ihn zu prüfen <- und "gefunden" bleibt "false"
if datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer then
gefunden := true;
end;
...
4. Die Abbruchbedingung „datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer“ in der while-Schleife hat keinen Sinn. Die „while“-Schleife wird für jeden in der Table1 gefundenen Record gemacht. Und das unabhängig von Artikelnummern, weil wenn einen Record gefunden wird, ist „not EOF“ true.
Also „while not datamodule1.Table1.Eof“ ist auf dieser Stelle vollkommen ausreichend.
5. Brauchst du die Variable "gefunden" auf einer anderen Stelle in deinem Programm? Wenn nicht, dann ist sie ueberflussig:
Und statt:
Delphi-Quellcode:
Begin
datamodule1.Table1.First;
gefunden := false;
while (not(datamodule1.Table1.Eof)) or
(datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer) do
Begin
datamodule1.table1.Next;
if datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer then
gefunden := true;
end;
if gefunden then
Begin
datamodule1.Table1.Edit;
datamodule1.Table1LAGERBEST.AsFloat := datamodule1.Table1LAGERBEST.AsFloat - rechnungszeile.anzahl;
datamodule1.Table1.Post;
end;
end;
end;
Kannst du so schreiben:
Delphi-Quellcode:
Begin
datamodule1.Table1.First;
while (not(datamodule1.Table1.Eof)) or
(datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer) do
Begin
datamodule1.table1.Next;
if datamodule1.Table1ARTIKELNUM.asfloat = rechnungszeile.artikel.Artikelnummer then
begin
datamodule1.Table1.Edit;
datamodule1.Table1LAGERBEST.AsFloat := datamodule1.Table1LAGERBEST.AsFloat - rechnungszeile.anzahl;
datamodule1.Table1.Post;
end;
end;
6. An deiner Stelle würde ich den Ratschlägen von marabu und Union folgen.
Viele Grüße
Markus