Geschwindigkeitsproblem mit Programmteil

10. März 2009 11:55

Hallo

Wir haben in der Tabelle "Item Journal Line" ein neues Feld "Chargeeingabe" eingefügt. Die Funktion dieses Feldes ist, dass man im Artikelbuchblatt die Chargennummer eingeben kann und danach die restlichen Daten (Artikelnummer,Lagerplatz,Menge usw.) automatisch gefüllt werden.
Nun funktioniert dies zwar aber leider dauert es ca. 7 - 10 Sekunden bis die Daten gefunden werden. Anbei der Code der bei OnValidate für dieses Feld ausgeführt wird.

Soweit ich herausfinden konnte ist der Befehlszeile
IF NOT BinContent.FINDFIRST THEN für die schlechte Geschwindigkeit verantwortlich.

Nun meine Frage kann ich das lösen, sprich diese Abfrage beschleunigen.

Code:
IF ("Chargen Nr. Eingabe" <> '') AND ("Line No." <> 0) THEN BEGIN

  IF( decSetQuantity = 0 ) THEN BEGIN
    BinContent.RESET;
    BinContent.SETCURRENTKEY( "Bin Code" );

    IF( "Bin Code" <> '' ) THEN
      BinContent.SETRANGE( "Bin Code", "Bin Code" );
    BinContent.SETRANGE("Lot No. Filter","Chargen Nr. Eingabe");
    BinContent.SETFILTER(Quantity,'<>0');
    IF NOT BinContent.FINDFIRST THEN
      EXIT;
//    IF BinContent.FINDFIRST THEN
    BinContent.CALCFIELDS(Quantity);

    VALIDATE("Item No.",BinContent."Item No.");
    VALIDATE("Location Code",BinContent."Location Code");
    VALIDATE("Bin Code",BinContent."Bin Code");
    VALIDATE(Quantity,BinContent.Quantity);
  END ELSE BEGIN
    VALIDATE( Quantity, decSetQuantity );
  END;


lg
stony

Re: Geschwindigkeitsproblem mit Programmteil

10. März 2009 12:08

Der FINDFIRST ist sogar optimal, jedoch filterst du auf ein FlowField, somit muss NAV auf jeden Fall alle Datensätze durchlaufen, um das Feld Quantity zu errechnen.
Dies hebelt sozusagen den FINDFIRST (hinter den Kulissen) aus, da sowieso alle Daten durchlaufen werden müssen.

Re: Geschwindigkeitsproblem mit Programmteil

15. März 2009 12:35

stony hat geschrieben:Nun meine Frage kann ich das lösen, sprich diese Abfrage beschleunigen.

Dadurch lässt sich das Feld Zeilenweise berechnen, bis der erste Datensatz mit Quantity <> 0 gefunden wird:
Code:
IF( "Bin Code" <> '' ) THEN
  BinContent.SETRANGE( "Bin Code", "Bin Code" );

IF NOT BinContent.FIND(‘-‘) THEN
  EXIT;

Found := FALSE;   
BinContent.SETRANGE("Lot No. Filter","Chargen Nr. Eingabe");
REPEAT
  BinContent.CALCFIELDS(Quantity);
  IF BinContent.Quantity <> 0 THEN BEGIN
    Found = TRUE;
    VALIDATE("Item No.",BinContent."Item No.");
    VALIDATE("Location Code",BinContent."Location Code");
    VALIDATE("Bin Code",BinContent."Bin Code");
    VALIDATE(Quantity,BinContent.Quantity);
  END;
UNTIL (BinContent.NEXT = 0) OR (Found = TRUE);