[Gelöst] FlowField Filter bzw temporäre Tabelle erzeugen ...

5. August 2008 10:48

Hallo zusammen.

Ich muss noch mal als Anfänger auf euer geballtes Fachwissen zurück greifen ;)

Und zwar versuche ich gerade eine Artikel-Suche umzustricken.
Die Suche wird in der Übersicht über eine Funktion gestartet und soll anschließend z.B. nur die zur freien Verfügung stehenden Artikel Listen.
Filtern wollte ich per
Code:
SETFILTER(Inventory,'>%1',"Reserved Qty. on Inventory");


"Inventory" und "Reserved Qty. on Inventory" sind beides FlowFields.
Leider klappt das nicht so ganz.
Zu mindest bei mir ;)

Geht das überhaupt mit einem Filter auf FlowFields?

Eine andere Möglichkeit wäre ja noch die Daten in eine temp. Tabelle zu schreiben und dann zu filtern oder?
Aber wie muss ich da vorgehen?
Einen temp. Rec habe ich mir bereits erzeugt und versucht mit
Code:
TempItemRec := Rec;

die Daten rein zu "schreiben", anschließend zu filtern und dann mit
Code:
Rec := TempItemRec;

wieder zurück zu "schreiben".

Danke & Gruß
Zuletzt geändert von ChristophE am 5. August 2008 14:56, insgesamt 1-mal geändert.

Re: FlowField Filter bzw. temporäre Tabelle erzeugen und filtern

5. August 2008 11:11

ChristophE hat geschrieben:Die Suche wird in der Übersicht über eine Funktion gestartet und soll anschließend z.B. nur die zur freien Verfügung stehenden Artikel Listen.
Filtern wollte ich per
Code:
SETFILTER(Inventory,'>%1',"Reserved Qty. on Inventory");


"Inventory" und "Reserved Qty. on Inventory" sind beides FlowFields.
Leider klappt das nicht so ganz.
Zu mindest bei mir ;)

Das kann nicht funktionieren - nicht weil dies FlowFields sind, sondern weil du pro Zeile zwischen zwei Zeilen vergleichen willst. Das kann nicht funktionieren.
Was mit SETFILTER funktionieren würde: SETFILTER(Inventory,'>0');
Allerdings sind Filter auf FlowFields unperformant.

Um diesen zeilenbasierten Vergleich durchzuführen, müsstest tatsächlich ein Temp. Recordset pflegen: Nur Zeilen, die den Bedingungen entsprechen, werden in dieses Set eingefügt.
Hinweis zur Sicherheit: Deine Temp. Recordvariable muss unbedingt die Eigenschaft Temporary = Yes erhalten!

Eine andere Möglichkeit wäre ja noch die Daten in eine temp. Tabelle zu schreiben und dann zu filtern oder?

Letztes ist falsch: Füg einfach nur die Datensätze ein, die du dort brauchst. Keine zusätzliche Filterung. Was du evtl. filtern müsstest, sind die Daten, die du in die temp. Record kopieren möchtest.

Aber wie muss ich da vorgehen?

Code:
AusgangRecord.FIND('-');
REPEAT
  IF AusgangRecord erfüllt Bedingung THEN BEGIN
    TempRecord := AusgangRecord;
    TempRecord.INSERT;
  END;
UNTIL AusgangRecord.NEXT = 0;

Re: FlowField Filter bzw. temporäre Tabelle erzeugen und filtern

5. August 2008 12:38

Danke für Deine schnelle Antwort.
So sieht das ganze nun bei mir in der Funktion aus:
Code:
IF OnlyOnStock THEN BEGIN
  CALCFIELDS(Inventory,"Reserved Qty. on Inventory");
  grTempOnStockItem.DELETEALL;
  FINDFIRST;
  REPEAT
    IF Inventory > "Reserved Qty. on Inventory" THEN BEGIN
      grTempOnStockItem := Rec;
      grTempOnStockItem.INSERT;
    END;
  UNTIL NEXT = 0;
  Rec := grTempOnStockItem;
END ELSE
  SETRANGE(Inventory);

Zeigt aber das selbe wie vorher an.

Irgendwie muss der Inhalt aus der temp. Tabelle doch wieder zurück in den aktuellen Record um ihn darzustellen oder nicht?
deswegen auch das Rec := grTempOnStockItem;

Muss in die anderen Trigger auch noch irgendwas?
Mit der "Triggerei" kann ich mich echt noch nicht so anfreunden ;)

Gruß

Re: FlowField Filter bzw. temporäre Tabelle erzeugen und filtern

5. August 2008 13:25

Bitte das FINDFIRST durch FIND('-') oder FINDSET ersetzen, sonst nagt das unnötig an der Performance!

Zeigt aber das selbe wie vorher an.

Wundert mich nicht :-)
Wo rufst du den Code überhaupt auf?
Du musst am Schluss die Artikelübersicht-Form mit dem temporären Record aufrufen, also
z.B. FORM.RUN(FORM::"Item List", grTempOnStockItem);

Sprich: Dieser Quelltext gehört eigentlich nicht in die Form, die das Ganze darstellen soll.

Mit der "Triggerei" kann ich mich echt noch nicht so anfreunden ;)

Mmmmh diese Einstellung würd ich mir für die Programmiererei (nicht nur unter NAV) abgewöhnen ...

Re: FlowField Filter bzw. temporäre Tabelle erzeugen und filtern

5. August 2008 14:28

Natalie hat geschrieben:Bitte das FINDFIRST durch FIND('-') oder FINDSET ersetzen, sonst nagt das unnötig an der Performance!

Ich dachte das FINDFIRST sei performanter, habe aber gerade gelesen dass bei REPEAT UNTIL Schleifen wohl doch das FIND('-') zu bevorzugen ist.

Natalie hat geschrieben:Wundert mich nicht :-)
Wo rufst du den Code überhaupt auf?
Du musst am Schluss die Artikelübersicht-Form mit dem temporären Record aufrufen, also
z.B. FORM.RUN(FORM::"Item List", grTempOnStockItem);
Sprich: Dieser Quelltext gehört eigentlich nicht in die Form, die das Ganze darstellen soll.


Ich glaube diese Form ist eh gegen sämmtliche Styleguide Vorschriften.
Unser Trainer in HH hat uns fast gesteinigt als wir auf der Form programmiert haben ;)

Ich werde noch mal rum probieren.
Dank dir!