Show TOC

Filtern in einer TableLocate this document in the navigation structure

Verwendung

Die Web-Dynpro-Tabelle bietet eine Benutzungsoberfläche für das Filtern an. Die entsprechende Logik zum Filtern der Daten muss jedoch von der Anwendung selber zur Verfügung gestellt werden.

Das Filtern in einer Table gestaltet sich unterschiedlich, je nachdem, ob der Applikationsparameter WDUIGUIDLINE auf GL11 oder GL20 gesetzt ist.

WDUIGUIDELINE=GL11

Eine Table bzw. deren Spalten können prinzipiell durch einen Benutzer gefiltert werden, falls das Ereignis Table.onFilter gebunden ist. Dann wird unterhalb der untersten Tabellenspalten-Header-Zeile eine Filterzeile angezeigt. Ob und wie eine Tabellenspalte gefiltert werden kann, hängt von TableColumn.filterValue ab:

  • Ist TableColumn.filterValue nicht gebunden, so wird keine Filtermöglichkeit für diese Spalte angeboten. Die entsprechende Zelle in der Filterspalte ist inaktiv, wie z.B. in der Spalte Airline Currency im Beispiel..

    Beispiel

  • Ist TableColumn.filterValue gegen ein Attribut mit Werteliste oder ABAP-Dictionary-Festwerte gebunden, wird eine DropDown-Liste mit diesen Werten gerendert.

    Beispiel

  • Ist TableColumn.filterValue gegen ein Attribut ohne solche Festwerte gebunden, wird ein InputField gerendert.

    Beispiel

Beim Drücken der Filterikone am Anfang der Filterzeile oder beim Drücken von ENTER in einem Filter- InputField werden die Werte der Filterzeile in den entsprechenden Attribute für TableColumn.filterValue abgelegt und das Ereignis Table.onFilter ausgelöst. Das eigentliche Filtern der Daten muss von der Anwendung selber erledigt werden. Sie kann dazu in einfachen Fällen auf Methoden-Handler zugreifen und die dortige Funktion IF_WD_TABLE_METHOD_HNDL~APPLY_FILTERING() verwenden.

Hinweise

  • Wenn Sie eine DropDown-Liste zum Filtern einer Spalte verwenden, empfiehlt es sich, immer einen Eintrag für das Zurücksetzen des Filters zu haben. Entweder fügen Sie einen "leeren" Eintrag (d.h. value und key sind Leerstrings) in die Werteliste ein oder aber Sie setzen das Attribut, an das TableColumn.filterValue gebunden ist, auf nullable und initialisieren es mit IF_WD_CONTEXT_ELEMENT~SET_ATTRIBUTE_NULL().

  • Wenn Sie ein InputField zum Filtern einer Spalte benutzen, so empfiehlt es sich, immer einen textartigen Typ ( String oder C) für das Attribut zu verwenden, an das Sie TableColumn.filterValue gebunden haben. Dies ist selbst dann nützlich, wenn die entsprechende Spalte zum Beispiel Zahlen anzeigt. Dann können Sie z.B. auch Wildcards ( *) oder Operatoren wie >, etc. im Filterstring eingeben. Beachten Sie, dass IF_WD_TABLE_METHOD_HNDL~APPLY_FILTERING() solche Filterstrings interpretieren kann.

  • Falls Sie sich trotzdem entschließen, für TableColumn.filterValue keinen textartigen Typ, sondern z.B. Integers zu verwenden, so empfiehlt es sich, das Attribut nullable zu machen und mit IF_WD_CONTEXT_ELEMENT~SET_ATTRIBUTE_NULL() zu initialisieren. Damit können Sie dann unterscheiden, ob der Anwender nicht filtern will oder nach dem Initialwert (z.B. 0 im Falle von Integers) filtern will.

  • Das Property isFiltered an der TableColumn kann benutzt werden, um zu visualisieren, dass für eine Spalte ein Filter aktiv ist.

WDUIGUIDELINE=GL20

Falls das Sortiern oder Filtern für eine Spalte aktiv ist, so öffnet das Klicken auf den Header ein Menü, über das sortiert und gefiltert werden kann (siehe Test-Component WDR_TEST_TABLE_BTC). Dieses Menü wird "on demand" vom Server geladen. Es besteht aus folgenden Menüeinträgen:

  • Wie unter Sortieren in einer Table beschrieben, stehen eventuell.am Anfang zwei Menüeinträge zum Sortieren.

  • Falls das Ereignis Table.onFilter gebunden ist und TableColumn.filterValue gebunden ist, so werden folgende Menüeinträge zum Filtern hinzugefügt: (Alle) setzt den Filter zurück, (Anpassen…)öffnet ein Popup-Window, in dem der Benutzer einen Wert eingeben kann, und zum Schluss werden bis zu 100 Filtervorschlagswerte vorgegeben. Für die Filtereinträge des Menüs muss man zwei Fälle unterscheiden:

    1. Sie möchten ABAP-Dictionary-Festwerte oder eine Werteliste für die Filtervorschlagswerte benutzen.

      Dazu binden Sie TableColumn.filterValue an ein Attribut mit Werteliste oder ABAP-Dictionary-Festwerten. Außerdem muss dieses Attribut entweder nullable sein oder die Werteliste hat einen Leereintrag ( value und key sind Leerstrings), der dem Zurücksetzen des Filters entspricht. Dann werden folgende Einträge gerendert:

      • (Alle):

        Beim Auswählen wird TableColumn.filterValue entweder auf Null gesetzt (falls das entsprechende Attribut nullable ist) oder auf den Initialwert gesetzt und das Table.OnFilter-Event ausgelöst. Die Anwendung muss dann den Filter zurücksetzen.

      • Die Werte der Werteliste bzw. ABAP-Dictionary-Festwerte.

        Beim Auswählen wird TableColumn.filterValue auf diesen Wert gesetzt und das Table.onFilter-Ereignis ausgelöst.

      Sie finden ein Beispiel zum Testen im System in der Component WDR_TEST_TABLE_BTC, Tabellenspalte G/P Kunde in der unteren Tabelle ( TableColumn namens BOOK_TABLE_CUSTTYPE).

    2. Sie möchten eine allgemeine Liste an Filtervorschlagswerten anzeigen.

      Dazu binden Sie TableColumn.filterValue an ein Context-Attribut, dessen Typ am besten textartig ist. Falls Sie keinen textartigen Typ verwenden möchten, setzen Sie das Attribut auf nullable und initialisieren es entsprechend. Außerdem binden Sie das Attribut TableColumn.filterValueSuggestions an ein Attribut eines Context-Knotens mit Kardinalität 0..n oder 1..n und befüllen diesen mit Filtervorschlagswerten. Es werden folgende Menü-Einträge gerendert:

      • (Alle):

        Filter wird zurückgesetzt. Beim Auswählen wird TableColumn.filterValue auf den Initialwert gesetzt und auch auf Null (falls das entsprechende Attribut nullable ist) oder/und das Table.OnFilter-Ereignis ausgelöst.

      • (Anpassen..):

        Ein spezieller Filterdialog wird gerufen. Ist das Ereignis Table.onCustomFilter gebunden, so wird es ausgelöst. Andernfalls öffnet Web Dynpro ABAP ein Popup, in dem ein Filterwert eingegeben werden kann.

      • Die Werte aus TableColumn.filterValueSuggestion.

        Beim Auswählen wird TableColumn.filterValue auf diesen Wert gesetzt und das Table.onFilter-Ereignis ausgelöst. Falls die Anzahl der Einträge eine gewisse Zahl (sie kann mittels IF_WD_TABLE_METHOD_HNDL~GET_MAX_FILTER_SUGGESTIONS_CNT ermittelt werden) übersteigt, so wird statt der FilterSuggestions ein Eintrag in das Menü eingefügt, der dem Benutzer anzeigt, dass zu viele FilterSuggestions existieren.

Hinweise

  • Das Property isFiltered an der TableColumn kann benutzt werden, um zu visualiseren, dass für eine Spalte ein Filter aktiv ist.

  • Über den Event-Parameter Col des onFilter-Events kann man zusätzlich leicht herausfinden, in welcher Spalte eine Filteraktion aus dem Tabellen-Header-Menü ausgewählt worden ist.

  • Da beim Auswählen eines der Filtervorschlagswerte dieser Wert nach TableColumn.filterValue kopiert wird, sollten TableColumn.filterValue und TableColumn.filterValueSuggestions den gleichen Typ haben. Dies vermeidet Probleme bei etwaigen Konvertierungen.

  • Über Supply.-Funktionen können Sie es erreichen, das die FilterSuggestions erst beim Öffnen des Menüs berechnet werden müssen, was initial die Perforance verbessert. In einfachen Fällen kann dazu die Methode IF_WD_TABLE_METHOD_HNDL~SUPPLY_FILTER_SUGGESTIONS() benutzt werden.

  • Falls sich die Daten der Tableändern, sollte man auch den Context-Knoten an den TableCOlumn.filterVLauesuggestions gebunden ist, invalidieren oder neu befüllen.