[gelöst]Datensatz innerhalb eines Filters

6. März 2019 19:51

Guten Abend,
ich habe eine "entfaltetet" Stückliste eins Fertigungsartikels.
Jetzt möchte ich z.B. den Einstandspreis einzelner Artikel zusammenfassen.
Es soll möglich sein nur bestimmte Artikel zusammenzufassen. Diese Filter sind allerdings bezogen auf die Artikeltabelle und werden in einer extra Tabelle mit Feld ID, Table ID und Filter hinterlegt.
Stand jetzt habe ich eine RecRef genommen und für jedes Feld, das gefiltert werden soll, den Filter angewendet.
Jetzt stehe ich aber vor dem Problem, dass ich möglichst einfach prüfen möchte ob der Artikel, der in meiner Stückliste ist, die Filterkriterien erfüllt.
Bis jetzt habe ich das mit einer Temporären Tabelle gemacht. Das scheint mir aber schlecht für die Performance,da unter Umständen erst den kompletten Arikelstamm (oder große Teile) wegspeichern muss.
Mit "Get" kann ich auch nicht arbeiten, weil da die Filter ignoriert werden.
Hat jemand eine Idee wie man das effizient lösen kann?
Zuletzt geändert von ITNoob am 7. März 2019 15:05, insgesamt 1-mal geändert.

Re: Datensatz innerhalb eines Filters

6. März 2019 20:49

Ich verstehe nicht so ganz was passieren soll. Aber Filtern und RecordReferenzen passen m. E. nicht so ganz zusammen. Warum filterst du nicht "richtig"?

Re: Datensatz innerhalb eines Filters

6. März 2019 21:12

Die Filter sind definiert über ihre Feld ID. Ähnlich wie das in Rapid Start auch gelöst wird. Da habe ich mir das auch abgeschaut.
Das muss ich doch dann über eine RecordRef machen oder nicht?
Ich lauf quasi mit einer Schleife über alle Felder die gefiltert werden sollen (Sind mit Feld ID, Table ID und Filter in einer extra Tabelle hinterlegt)
Das ist auch nicht mein Problem. Man könnte das Problem auch vereinfachen.
Angenommen ich habe einen Artikel. Wie finde ich raus, ob dieser Artikel innerhalb meiner gefilterten Artikeltabelle ist.
Also z.B.
Code:
Item.SETFILTER("No.",'%1..%2','1000','1400');
Item.SETRANGE("Base Unit of Measure",'STÜCK');

Jetzt habe ich eine Artikelnr. z.B. "1100". Wie finde ich raus ob dieser Artikel innerhalb meiner Variablen "Item" ist.

Aktuell übergeb ich mit SETVIEW den Filter an meine Artikelvariable, lauf dann über alle Artikel und schreibe diese in eine Temporäre Tabelle.
Anschließen frage ich mit
Code:
IF TmpItem.GET("No.") THEN
//Artikel im Filter
ELSE //Artikel nicht im Filter


Danke für die Hilfe

Re: Datensatz innerhalb eines Filters

6. März 2019 21:17

Es gibt die GETFILTER Funktion für Records:
https://docs.microsoft.com/en-us/dynamics-nav/getfilter-function--record-

Damit könntest du den gesetzten Filter für das Feld "No." holen und dann prüfen.

Die GETFILTERS Funktion gibt es sowohl für Record als auch für Recordref:
https://docs.microsoft.com/en-us/dynamics-nav/getfilters-function--record-
https://docs.microsoft.com/en-us/dynamics-nav/getfilters-function--recordref-

Re: Datensatz innerhalb eines Filters

6. März 2019 21:23

Hallo enh,
danke für die Hilfe. Was passiert wenn kein Filter auf "No." gesetzt wird?
GetFilters verwende ich schon um den Filter von meiner RecordRef auf meinen Record zu übertragen.

Grüße

Re: Datensatz innerhalb eines Filters

6. März 2019 21:50

ITNoob hat geschrieben:danke für die Hilfe. Was passiert wenn kein Filter auf "No." gesetzt wird?


String := Record.GETFILTER(Field)

Dann liefert GETFILTER leer zurück. Das müsste man dann entsprechend abfangen/prüfen:
IF Item.GETFILTER("No.") = '' THEN ...

Re: Datensatz innerhalb eines Filters

6. März 2019 22:07

Hallo enh,
danke für die Hilfe.
Wenn der Filter aber leer ist, kann ich ja gar keine Aussage treffen. ober der Artikel drin ist oder nicht kann ich im Normalfall nicht anhand von einem Feld erkennen.
ich müsste jedes Feld in der "Filtertabelle" ausprogrammieren oder nicht?
Was mache ich z.B. bei einem Filter "1000..1005|5000..7000". Das würde ich ja als string zurück bekommen. Wenn dann z.B. noch ein Filter auf 7 andere Felder gesetzt ist habe ich ein Problem.
Da ist denk ich ist die temporäre Tabelle doch um einiges einfacher.

Danke

Grüße

Re: Datensatz innerhalb eines Filters

6. März 2019 22:12

Stimmt, temporäre Tabelle füllen, dann kann man dort suchen.

Re: Datensatz innerhalb eines Filters

6. März 2019 22:15

Danke für die unterstützung. Schon komisch. Eigentlich würde man erwarten, dass es da irgend eine einfach Lösung gibt.
Zu Prüfen ob ein Datensatz innerhalb einer gefilterten Tabelle ist hört sich nach einem täglichen Problem an.
Ich lass den Punkt mal noch offen, vielleicht hat jemand noch eine Idee.
Ich hab mir auch schon überlegt ob man mit Filtergroups arbeiten kann und dann mit get. Aber Get ignoriert das auch.

Grüße

Re: Datensatz innerhalb eines Filters

7. März 2019 10:44

ITNoob hat geschrieben: Eigentlich würde man erwarten, dass es da irgend eine einfach Lösung gibt.


Gibt es, meiner Meinung Nach gibt es hier 2 mögliche Lösungen das Ganze ohne temporäre Tabelle zu lösen
1. Du makierst die alle deine Records und filterst in den markierten. Ich denke aber das bringt dir keine Performance.
Code:
Item.SETFILTER("No.",'%1..%2','1000','1400');
Item.SETRANGE("Base Unit of Measure",'STÜCK');
If Item.FindSet() then
    repeat
        Item.Mark(true);
    until Item.Next() = 0;

Item.MarkedOnly(true);

Item.SetRange("No.", 'MeineNummer')


2. du kannst filtergroups nutzen
Code:
Item.FilterGroup(2);
Item.SETFILTER("No.",'%1..%2','1000','1400');
Item.SETRANGE("Base Unit of Measure",'STÜCK');
Item.FilterGroup(0);
Item.SetRange("No.", 'MeineNummer')

Die Filter in den verschiedenen Filtergroups ueberschreiben sich nicht gegenseitig.

Re: Datensatz innerhalb eines Filters

7. März 2019 13:06

Hallo Ted,
danke für die Antwort. Das Probiere ich gleich noch aus.
Ich müssten dann quasi nur noch ein Findfirst machen. Das liefert mir dann ob der Datensatz enthalten ist.

Grüße

Re: Datensatz innerhalb eines Filters

7. März 2019 13:29

wenn du die Daten aus dem Record danach nicht brauchst nutzt "IsEmpty"
Code:
if not Item.IsEmpty() then
  // mein datensatz existiert

weil nen FindFirst() überträgt den Datensatz von der Datenbank zum NAS, IsEmpty() überträgt dir nur nen true oder false.
Wenn du das Ganze dann in einer Schleife machst, macht sich das Performance technisch bei größeren Tabellen schon bemerkbar

Re: Datensatz innerhalb eines Filters

7. März 2019 13:35

Hallo Ted,
Danke für den Tipp.

Grüße

Re: Datensatz innerhalb eines Filters

7. März 2019 15:04

Hallo,
funktioniert prima. Danke

Grüße