[JavaScript] Array filtern

// Alter, nach dem das Personenarray gefiltert werden soll
let filter_age = 60;

// Array mit Namen und Alter
let arr_persons = [ { name:"Horst", age:50 },
                    { name:"Udo", age:55 },
                    { name:"Heinz", age:60 },
                    { name:"Ede", age:65 } ];

// neues, gefiltertes Array
let arr_filtered = arr_persons.filter( function(p){
  return p.age >= filter_age;
} );

// Ausgabe des gefilterten Arrays
arr_filtered.forEach(function(p){
  console.log(p.name + ": " + p.age);
});

[OData] Übersicht zu OData-Abfrageoptionen (Query-Optionen)

Option       | manuell implementieren
-------------+-----------------------
$count       | nein
$expand      | nein
$filter      | ja
$format      | nein
$inlinecount | ja
$link        | nein
$orderby     | ja
$select      | nein
$skip        | ja
$skiptoken   | ja
$top         | ja
$value       | nein

Links

[ABAP] Datensätze zwischen Tabellen mit unterschiedlichen Feldern und Datentypen kopieren

Beispiel 1 (APPEND CORRESPONDING)

* Typ für Tabelle mit kompletten Daten
TYPES: BEGIN OF ty_long,
         posnr   TYPE posnr,
         matnr   TYPE matnr,
         vbeln   TYPE vbeln,
         flag_ok TYPE boolean,
       END OF ty_long.

* Typ für Ausgabetabelle, Felder hier nur vom Datentyp string
TYPES: BEGIN OF ty_short,
         posnr TYPE string,
         matnr TYPE string,
         vbeln TYPE string,
       END OF ty_short.

DATA: it_long TYPE STANDARD TABLE OF ty_long WITH DEFAULT KEY.
DATA: it_short TYPE STANDARD TABLE OF ty_short WITH DEFAULT KEY.

* Beispieldaten
it_long = VALUE #( ( posnr = 1 matnr = '1111111111' vbeln = '3333333333' flag_ok = abap_true )
                   ( posnr = 2 matnr = '2222222222' vbeln = '4444444444' flag_ok = abap_false )
                   ( posnr = 3 matnr = '3333333333' vbeln = '5555555555' flag_ok = abap_true ) ).

* nur Datensätze kopieren, wo Flag gesetzt
LOOP AT it_long ASSIGNING FIELD-SYMBOL(<fs_l>) WHERE ( flag_ok = abap_true ).
* korrespondierende (namensgleiche) Felder des Datensatzes vom Typ ty_long an
* Tabelle mit Datensätzen vom Typ ty_short anhängen
  APPEND CORRESPONDING ty_short( <fs_l> ) TO it_short.
ENDLOOP.

* Testdaten ausgeben
LOOP AT it_short ASSIGNING FIELD-SYMBOL(<fs_s>).
  WRITE: / <fs_s>-posnr, <fs_s>-matnr, <fs_s>-vbeln.
ENDLOOP.

Beispiel 2 (CORRESPONDING, FILTER)

* Typ für Tabelle mit kompletten Daten
TYPES: BEGIN OF ty_long,
         posnr   TYPE posnr,
         matnr   TYPE matnr,
         vbeln   TYPE vbeln,
         flag_ok TYPE boolean,
       END OF ty_long.

* Typ für Ausgabetabelle, Felder hier nur vom Datentyp string
TYPES: BEGIN OF ty_short,
         posnr TYPE string,
         matnr TYPE string,
         vbeln TYPE string,
       END OF ty_short.

DATA: it_long TYPE SORTED TABLE OF ty_long WITH UNIQUE KEY posnr WITH NON-UNIQUE SORTED KEY flag COMPONENTS flag_ok.
DATA: it_short TYPE STANDARD TABLE OF ty_short WITH DEFAULT KEY.

* Beispieldaten
it_long = VALUE #( ( posnr = 1 matnr = '1111111111' vbeln = '3333333333' flag_ok = abap_true )
                   ( posnr = 2 matnr = '2222222222' vbeln = '4444444444' flag_ok = abap_false )
                   ( posnr = 3 matnr = '3333333333' vbeln = '5555555555' flag_ok = abap_true ) ).

* nur Datensätze kopieren, wo Flag gesetzt
* korrespondierende (namensgleiche) Felder des Datensatzes vom Typ ty_long in
* Tabelle mit Datensätzen vom Typ ty_short kopieren
it_short = CORRESPONDING #( FILTER #( it_long USING KEY flag WHERE flag_ok = abap_true ) ).

* Testdaten ausgeben
LOOP AT it_short ASSIGNING FIELD-SYMBOL(<fs_s>).
  WRITE: / <fs_s>-posnr, <fs_s>-matnr, <fs_s>-vbeln.
ENDLOOP.

[ABAP] OData: $filter implementieren

* für SAPUI5-Elemente muss zugehöriges EntitySet in der SEGW auf "Filterbar" gestellt sein

* Groß-/Kleinschreibung beachten
* Verknüpfungen: "or" und "and" klein geschrieben
* Datumswerte mit VarDate=datetime'yyyy-mm-ddThh:mm:ss' konvertieren
* Umlaute konvertieren

* Filter-Options sind: eq, ne, le, lt, ge, gt, substringof, startswith, endswith

* Abfrage-URL
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst'
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst' and Col2 eq 'Schmidt'
URL/SERVICENAME/ItemCollection?$filter=Col1 eq 'Horst'&$format=json

* Methode get_entityset implementieren
METHOD xyz_get_entityset.

* Variante 1 (Tabelle mit Filter-Properties + Options + RANGE)

* Achtung: Filterbedingungen, die mit 'or' verknüpft sind, werden aufgrund eines Fehlers vom MPC
*          nicht korrekt geparst -> get_filter_select_options liefert leere Tabelle
*
* Lösung 1: die or-Teile müssen korrekt in Klammern gesetzt werden
*           https://.../SERVICENAME/DataSet?$filter=(Col1 gt '1000' or Col1 lt '9999') and Col2 eq '10'
* Lösung 2: Filterbedingungen mit 'and' verknüpfen

* Filterkriterien holen
  DATA(it_filter_so) = io_tech_request_context->get_filter( )->get_filter_select_options( ).

  DATA(so_matnr) = VALUE /iwbep/t_cod_select_options( ).

  IF line_exists( it_filter_so[ property = 'MATNR' ] ).
    so_matnr = it_filter_so[ property = 'MATNR' ]-select_options.
  ENDIF.

  SELECT * FROM mara WHERE matnr IN so_matnr.

  ...

* Variante 2 (Tabelle mit Filter-Properties + Options auslesen)
  DATA: lv_matnr TYPE matnr
  DATA(it_filter_so) = io_tech_request_context->get_filter( )->get_filter_select_options( ).
  
  IF NOT it_filter_so IS INITIAL.
    TRY.
        lv_matnr = it_filter_so[ property = 'MATNR' ]-select_options[ 1 ]-low.

        ...
      CATCH cx_root.
    ENDTRY.
  ENDIF.
  
* Variante 3 (Filter-String)
  DATA(lv_filter_string) = io_tech_request_context->get_filter( )->get_filter_string( ).
  
  ...

* Variante 4 (String für WHERE-Clause)
  DATA(lv_osql_where_clause) = io_tech_request_context->get_osql_where_clause( ).

  ...

  SELECT * FROM xy INTO TABLE @it_itab
    WHERE (lv_osql_where_clause).

  ...
  
ENDMETHOD.

Links

[ABAP] Tabelleninhalt einer internen Tabelle anhand eines Kriteriums selektieren und kopieren (FILTER, VALUE, FOR, WHERE)

Variante 1 (VALUE, FOR, WHERE) – explizite Feldangabe

* Standardtabelle mit sortiertem Schlüssel carr_city definieren
TYPES: ty_it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

DATA: it_spfli TYPE ty_it_spfli.
DATA: it_for_spfli TYPE ty_it_spfli.

START-OF-SELECTION.

  SELECT * INTO TABLE it_spfli FROM spfli.

* Tabelleninhalt für Einträge mit carrid = 'LH' selektieren
* und mittels VALUE und FOR kopieren
  it_for_spfli = VALUE #( FOR l IN it_spfli WHERE ( carrid = 'LH' )
                          ( mandt = l-mandt
                            carrid = l-carrid
                            connid = l-connid
                            countryfr = l-countryfr
                            cityfrom = l-cityfrom
                            airpfrom = l-airpfrom
                            countryto = l-countryto
                            cityto = l-cityto
                            airpto = l-airpto
                            fltime = l-fltime
                            deptime = l-deptime
                            arrtime = l-arrtime
                            distance = l-distance
                            distid = l-distid
                            fltype = l-fltype
                            period = l-period ) ).

  LOOP AT it_for_spfli ASSIGNING FIELD-SYMBOL(<fs_l>).
    WRITE: / <fs_l>-carrid, <fs_l>-cityfrom, <fs_l>-deptime.
  ENDLOOP.

Variante 2 (VALUE, FOR, WHERE) – alle Felder mit Variable

* Standardtabelle mit sortiertem Schlüssel carr_city definieren
TYPES: ty_it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

DATA: it_spfli TYPE ty_it_spfli.
DATA: it_for_spfli TYPE ty_it_spfli.

START-OF-SELECTION.

  SELECT * INTO TABLE it_spfli FROM spfli.

* Tabelleninhalt für Einträge mit carrid = 'LH' selektieren
* und mittels VALUE und FOR kopieren
* ( l ) -> komplette Zeile
  it_for_spfli = VALUE #( FOR l IN it_spfli WHERE ( carrid = 'LH' )
                          ( l ) ).

  LOOP AT it_for_spfli ASSIGNING FIELD-SYMBOL(<fs_l>).
    WRITE: / <fs_l>-carrid, <fs_l>-cityfrom, <fs_l>-deptime.
  ENDLOOP.

Variante 3 (VALUE, FOR, WHERE) – alle Felder mit Feldsymbol

* Standardtabelle mit sortiertem Schlüssel carr_city definieren
TYPES: ty_it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

DATA: it_spfli TYPE ty_it_spfli.
DATA: it_for_spfli TYPE ty_it_spfli.

START-OF-SELECTION.

  SELECT * INTO TABLE it_spfli FROM spfli.

* Tabelleninhalt für Einträge mit carrid = 'LH' selektieren
* und mittels VALUE und FOR kopieren
* ( l ) -> komplette Zeile
  it_for_spfli = VALUE #( FOR <fs> IN it_spfli WHERE ( carrid = 'LH' )
                          ( <fs> ) ).

  LOOP AT it_for_spfli ASSIGNING FIELD-SYMBOL(<fs_l>).
    WRITE: / <fs_l>-carrid, <fs_l>-cityfrom, <fs_l>-deptime.
  ENDLOOP.

Variante 4 (FILTER, KEY, WHERE)

* Standardtabellem mit sortiertem Schlüssel
TYPES: ty_it_spfli TYPE STANDARD TABLE OF spfli WITH NON-UNIQUE SORTED KEY carr_city COMPONENTS carrid cityfrom.

DATA: it_spfli TYPE ty_it_spfli.
DATA: it_filter_spfli TYPE ty_it_spfli.

START-OF-SELECTION.

  SELECT * INTO TABLE it_spfli FROM spfli.

* Tabelleninhalt für Einträge mit carrid = 'LH' mittels Filter selektieren und kopieren
* Daten sind anhand des Schlüssels vorsortiert
  it_filter_spfli = FILTER #( it_spfli USING KEY carr_city WHERE carrid = CONV #( 'LH' ) ).

  LOOP AT it_filter_spfli ASSIGNING FIELD-SYMBOL(<fs_l>).
    WRITE: / <fs_l>-carrid, <fs_l>-cityfrom, <fs_l>-deptime.
  ENDLOOP.

Mehrfachfilter auf Directory.GetFiles() anwenden

// Aufruf:
//
// string[] saFilterList = { "*.csv", "*.txt" };
// List<string-> lFileList = this.GetFilesByFilter(@"c:\temp\", saFilterList);
//
// foreach (string f in lFileList)
// {
//     ...
// }
//

using System.IO;

/// <summary>
/// listet Dateien eines Verzeichnisses anhand eines übergebenen Filters
/// </summary>
/// <param name="sPath">Suchpfad</param>
/// <param name="saFilterList">Filterliste (*.csv, *.txt)</param>
/// <returns>Dateiliste</returns>
public List<string-> GetFilesByFilter(string sPath, string[] saFilterList)
{
    List<string-> lFileList = new List<string->();

    if (Directory.Exists(sPath))
    {
        foreach (string filter in saFilterList)
        {
            lFileList.AddRange(Directory.GetFiles(sPath, filter));
        }
    }

    return lFileList;
}