Einzelnen Beitrag anzeigen

MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#8

Re: DBASE Datenbunk aktualisieren

  Alt 23. Okt 2005, 13:39
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
  Mit Zitat antworten Zitat