FIND('=')

29. Oktober 2014 14:18

Hallo,

ich habe diese Funktion noch nie benutzt....

stosse jetzt aber darauf

//Funktionsanfang+++++++++++++++++++
WITH TempSKU DO
IF NOT FIND('=') THEN BEGIN

was möchte der Programmierer mir hier sagen?
nach welchem Eintrag sucht er denn?
Welche Bedingungen gelten, da er ja frisch in die Funktion eingestiegen ist?

Weiß das jemand?

Re: FIND('=')

29. Oktober 2014 14:23

FIND('=') sucht einen Datensatz mit übereinstimmenden Primärschlüsselwerten, diese Werte belegt man ggf. vor der Suche.
= to search for a record that equals the key values (default)

http://msdn.microsoft.com/en-us/library/dd301096.aspx

Re: FIND('=')

29. Oktober 2014 14:40

In Report 794 gibt es Beispielcode, wie man diese Parameter (=,<,>) anwenden kann.
In der Rundungstabelle wird ein Wert gesucht, der entweder genau stimmt, oder, falls nicht vorhanden, kleiner ist:
Dazu wird RoundingMethod."Minimum Amount" mit dem Suchwert vorbelegt.
Code:
IF RoundingMethod.Code <> '' THEN BEGIN
  RoundingMethod."Minimum Amount" := NewFieldValue;
  IF RoundingMethod.FIND('=<') THEN BEGIN
    NewFieldValue := NewFieldValue + RoundingMethod."Amount Added Before";
    IF RoundingMethod.Precision > 0 THEN BEGIN
      NewFieldValue := ROUND(NewFieldValue,RoundingMethod.Precision,COPYSTR('=><',RoundingMethod.Type + 1,1));
      PriceIsRnded := TRUE;
    END;
    NewFieldValue := NewFieldValue + RoundingMethod."Amount Added After";
  END;
END;

Re: FIND('=')

29. Oktober 2014 14:46

So ähnlich habe ich es mir gedacht.

ABER er geht als erstes in die Funktion .... was ist dann da "Vorbelegt"???
und wenn doch nichts vorbelegt ist, nach was sucht er denn ????

Re: FIND('=')

29. Oktober 2014 16:17

Pegasus hat geschrieben:und wenn doch nichts vorbelegt ist, nach was sucht er denn ????

Wenn wirklich nichts vorbelegt ist, vielleicht nach Datensätzen mit leeren Primärschlüsseldeldern. Am besten den Programmierer selber fragen. Könnte ja auch ein Programmfehler sein :wink: .
Wenn man nach Datensätzen mit Werten sucht, müssen der Suchwerte vorab zugewiesen werden.
If this parameter contains '=', '>' or '<', then you must assign value to all fields of the current and primary keys before you call FIND.

Re: FIND('=')

29. Oktober 2014 16:29

Ich würde sagen

Code:
WITH TempSKU DO
 IF NOT FIND('=') THEN BEGIN

ist zum Verständnis "ohne Vorbelegung" vergleichbar mit:

Code:
WITH TempSKU DO
 IF ISEMPTY THEN BEGIN


Ob eines von beiden performanter ist, kann ich dir aber nicht sagen. :?:

mfg,
winfy
Zuletzt geändert von winfy am 29. Oktober 2014 17:46, insgesamt 3-mal geändert.

Re: FIND('=')

29. Oktober 2014 17:26

Dieses Beispiel kommt aus dem Dynamics NAV Standard, zumindest gibt es ein solches Konstrukt dort in der Codeunit 99000854 "Inventory Profile Offsetting".
Dieses Konstrukt findet sich dort in der lokalen Funktion InsertTempSKU(). Da es sich bei TempSKU um eine globale Variable handelt, wird diese jeweils vor dem Aufruf initialisiert.

Zum Beispiel hier:
Code:
IF SKU.FINDSET THEN BEGIN
  REPEAT
    PlngGetParameters.AdjustInvalidSettings(SKU);
    IF (SKU."Safety Stock Quantity" <> 0) OR (SKU."Reorder Point" <> 0) OR
       (SKU."Reorder Quantity" <> 0) OR (SKU."Maximum Inventory" <> 0)
    THEN BEGIN
      TempSKU.TRANSFERFIELDS(SKU);
      IF TempSKU.INSERT THEN ;
      WHILE (TempSKU."Replenishment System" = TempSKU."Replenishment System"::Transfer) AND
            (TempSKU."Reordering Policy" <> TempSKU."Reordering Policy"::" ")
      DO BEGIN
        TempSKU."Location Code" := TempSKU."Transfer-from Code";
        TransferPlanningParameters(TempSKU);
        IF TempSKU."Reordering Policy" <> TempSKU."Reordering Policy"::" " THEN
          InsertTempSKU;
      END;
    END;
  UNTIL SKU.NEXT = 0;
END ELSE
[...]
in Funktion FindCombination().

Der Inhalt ist also keineswegs leer, sondern der Code prüft ohne "aufwändige" SETRANGE() oder SETFILTER(), ob der Datensatz im temporären SKU bereits enthalten ist. Wenn nicht, wird dieser, nach anreichern mit einigen Werten, hinzugefügt:

Code:
WITH TempSKU DO
  IF NOT FIND('=') THEN BEGIN
    PlngGetParameters.LotForLot(SKU2,"Item No.","Variant Code","Location Code");
    TempSKU := SKU2;
    IF "Reordering Policy" <> "Reordering Policy"::" " THEN
      INSERT;
  END;

Als nützlicher Nebeneffekt werden die "Parameter" Item No., Variant Code und Location Code im TempSKU noch mitgeschleift und können an PlngGetParameters.LotForLot() übergeben werden.

Re: FIND('=')

29. Oktober 2014 17:51

Hallo Carsten klingt plausibel.

Man spart sich damit den erneuten SETFILTER/SETRANGE auf den Datensatz.
Man kann das natürlich auch mit ISEMPTY nachstellen, dann müsste man allerdings wirklich auf diesen Datensatz vorher filtern. :wink:

mfg,
winfy

Re: FIND('=')

29. Oktober 2014 18:08

winfy hat geschrieben:
Code:
WITH TempSKU DO
 IF NOT FIND('=') THEN BEGIN

ist zum Verständnis "ohne Vorbelegung" vergleichbar mit:
Code:
WITH TempSKU DO
 IF ISEMPTY THEN BEGIN


ISEMPTY kann vielfach NOT FIND('-') bzw. NOT FINDFIRST performanter ersetzen, aber nur dann, wenn man gar nichts finden will. FIND('-') und FIND('=') darf man aber nicht verwechseln, das sind zwei getrennte Anwendungsbereiche dieser Anweisung.

Re: FIND('=')

30. Oktober 2014 16:43

:-) genau an der Stelle des Planungslaufes bin ich gewesen :-)

letzten Endes jedoch erfolglos :-(

Re: FIND('=')

31. Oktober 2014 10:10

Pegasus hat geschrieben: genau an der Stelle des Planungslaufes bin ich gewesen

Die Angabe, dass das Codefragment aus einem Standardobjekt stammt, hätte dann allerdings bereits in den ersten Beitrag gehört.

Re: FIND('=')

31. Oktober 2014 11:22

Die Stelle kennt man doch...

Re: FIND('=')

31. Oktober 2014 12:06

SilverX hat geschrieben:Die Stelle kennt man doch...

Es soll ja Programmierer geben, die Funktionen aus anderen Objekten in ihre eigenen kopieren und sich dann wundern, weshalb die dort nicht so funktionieren wie erwartet :mrgreen: .