FILTERGROUP(-1) – Cross Column Search in Dynamics NAV / BC

Von | 21. März 2020

Hallo zusammen,

in Gesprächen mit Kollegen und Freunden im Dynamics NAV / Business Central Bereich stelle ich immer wieder fest, dass viele noch nie etwas von FILTERGROUP(-1) gehört haben. Dabei ist das sogar auf der Microsoft Online Dokumentation beschrieben (FILTERGROUP Function (Record)).

Schauen wir uns die Dokumentation einmal an:

  • Number: -1
  • Name: Cross-column
  • Description: Used to support the cross-column search.

Dabei werden die Dynamics NAV Experten sicherlich schon wissen worum es sich hier handelt. Mit “Cross-column” kann über mehrere Felder gleichzeitig gesucht werden. Ich erkläre das gerne an einem Beispiel. Stellen wir uns vor, dass wir in der Kontakttabelle nach dem Suchwort “GmbH” suchen wollen. Dabei stellt sich die Herausforderung, dass manche Kontakte einen langen Namen haben und “GmbH” nicht im Feld “Name”, sondern im Feld “Name 2” steht.

  • Kontakte mit “GmbH” im Feld “Name”:

  • Kontakte mit “GmbH” im Feld “Name 2”:

Wie lösen wir dieses Problem? Dabei wird oft zur der Lösung gegriffen, die entsprechende Tabelle zwei Mal zu durchsuchen:

  • In diesem Beispiel rufen wir eine Funktion “GetNoOfContactsWithSearchTerm” auf und übergeben ‘GmbH’ als Suchbegriff.
  • Wir ermitteln die Anzahl der Kontakte, die diesem Filterkriterium entsprechen, indem wir auf das Feld “Name” filtern und die Anzahl der Datensätze in der Variable “NoOfRecords” speichern.
  • Wir wiederholen die Abfrage mit unserem Suchbegriff, indem wir den gleichen Filter auf das Feld “Name 2” setzen.

Das Ergebnis geben wir in einer Nachricht aus.

Wir haben also 6 Kontakte, die GmbH im Feld “Name” oder “Name 2” vorweisen können. Das ist natürlich nur ein Beispiel, aber wie könnte diese Problem besser gelöst werden? Wie wäre es mit FILTERGROUP(-1):

Das Ergebnis ist wie im Beispiel vorher:

FILTERGROUP(-1) bietet uns die Möglichkeit Filter in Dynamics NAV / Business Central mit ODER zu verknüpfen. Ohne FILTERGROUP(-1) werden alle Filter mit UND verbunden. Schlußfolgern können wir daraus, dass wir mit FILTERGROUP(-1) Daten innerhalb einer SQL Abfrage ermitteln können und über mehrere Spalten gleichzeitig suchen können.

Natürlich sollte das gut bedacht sein und für den entsprechenden Fall überprüft werden. Ab einer gewissen Datenmenge und ohne entsprechende Indexe muss die Abfrage nicht unbedingt schneller sein. Anwendung könnte FILTERGROUP(-1) beispielsweise in einer Entwicklung finden, die alle oder bestimmte Felder einer Stammdatentabelle nach einem Suchbegriff durchsucht. Das wäre in Verbindung mit FIELDREF möglich. Wir könnten daher mehrere Felder generisch nach einem Suchbegriff durchsuchen und dies dem Benutzer anzeigen. Dies ist nur eine der möglichen Anwendungsbereiche. Bei Prüfungen, ob eins von vielen Felder gefüllt sind, könnte sich der Cross-column search auch anbieten.

Ich bin mir sicher, dass die meisten Entwickler schon Ideen haben, FILTERGROUP für ihre Anforderung zu verwenden.

Viel Spaß.

9 Gedanken zu „FILTERGROUP(-1) – Cross Column Search in Dynamics NAV / BC

  1. Pingback: FILTERGROUP(-1) – Cross Column Search in Dynamics NAV / BC - Robert's Dynamics NAV Entwickler Blog - Dynamics 365 Business Central/NAV User Group - Dynamics User Group

    1. Robert Beitragsautor

      I know that there are some blogs about it, but i didn’t find one in german. Therefore I created one in german. 🙂

      Antworten
  2. Roland Stejskal

    Hi, leider funktioniert das im Classic Clienten in NAV 2009 nicht.Schade,genau die Funktion bräuchten wir.

    Antworten
    1. Robert Beitragsautor

      Das ist korrekt. 2009 Classic Client ist leider viel zu alt. Dort wurde dieses Feature noch nicht unterstützt. NAV 2009 ist aber schon etwas in die Jahre gekommen 🙂

      Antworten
  3. Danny

    Sehr informativer Artikel. Habe es gleich ausprobiert: In NAV2016 funzt es wie erwartet :).

    Antworten
  4. Hans Freitag

    Leider funktioniert dies bei der Übergabe eines Recordsets mit Settableview an eine Page nicht mehr. BC365 V16.5 .
    Das vorher gefilterte Recordset ist nach der Übergabe an die Page plötzlich reseted.

    Antworten
    1. Robert Beitragsautor

      Das klingt für mich nach einem Bug, kann aber auch sein das dies aus einem bestimmten Grund entfernt wurde. Das kann ich aus dem Stand nicht beantworten.

      Man kann bei github schauen, ob man dort etwas zu dem Thema findet oder dort auch Microsoft direkt fragen: https://github.com/microsoft/AL

      Es gibt einige Unterschiede zwischen C/AL und AL, daher kann ich mir auch vorstellen, dass dies als Feature fehlt.

      Antworten
  5. Robaat

    beim mir, NAV2017 funzt das nicht.

    Cust.RESET;
    Cust.FILTERGROUP(-1);
    FilterT := ‘@*Meier*’;

    Cust.setfilter(Name,FilterT);
    Cust.setfilter(“Name 2”,FilterT);

    Cust.FILTERGROUP(0);
    PAGE.RUN(0,Cust);

    muss am ServiceTier hierzu noch evtl. was eingestellt werden?

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert