[ABAP] OData: $orderby implementieren

Variante 1

* https://blogs.sap.com/2013/09/03/sap-gw-implement-a-better-orderby-for-cust-ext-class/
* http://www.techippo.com/2016/08/sorting-query-options-orderby-sap-odata-service.html
* http://www.saplearners.com/orderby-query-option-in-sap-netweaver-gateway/
* https://blogs.sap.com/2017/12/06/display-countfilterorderbyinlinecounttop-and-skip-operations-using-odata-services/

METHOD xyz_get_entityset.

  ...

  DATA(it_orderby) = io_tech_request_context->get_orderby( ).

  IF line_exists( it_orderby[ property = 'MATNR' ] ).
    DATA(lv_orderby) = it_orderby[ property = 'MATNR' ].

    CASE lv_orderby-order.
      WHEN 'asc'.
        SORT: et_entityset BY name ASCENDING.
      WHEN 'desc'.
        SORT: et_entityset BY name DESCENDING.
    ENDCASE.
  ENDIF.

  ...

ENDMETHOD.

Variante 2

METHOD xyz_get_entityset.

  ...

  DATA(it_orderby) = io_tech_request_context->get_orderby( ).

  READ TABLE it_orderby INTO DATA(ls_orderby) INDEX 1.
  IF sy-subrc = 0.
* generische Order-Property verwenden, wenn z.B. nur ein Sortierkriterium vorhanden
* (z.B. beim Anklicken von Tabellenfeldern)
    CASE ls_orderby-order.
      WHEN 'asc'.
        SORT: et_entityset BY (ls_orderby-property) ASCENDING.
      WHEN 'desc'.
        SORT: et_entityset BY (ls_orderby-property) DESCENDING.
    ENDCASE.
  ENDIF.

  ...

ENDMETHOD.

List-Objekt

  • dynamisches Listenobjekt zum verwalten beliebiger Objekte
using System.Collections.Generic;

// Objekt, dass in die Liste soll
class TParameter
{
     public double a = 0.0;
     public double b = 0.0;
     public string sName = "";

     public TParameter(double da, double db, string sText)
     {
          a = da;
          b = db;
          sName = sText;
     }
}

// Liste erzeugen
List<TParameter> Parameters = new List<TParameter>();

// Element hinzufügen
Parameters.Add(new TParameter(0.2, 0.4, "P1"));

// erstes Element der Liste holen
TParameter Par = Parameters[0];

// alle Parameter in der Liste durchgehen
foreach (TParameter Par in Parameters)
{
    Par.a = 0.1;
}

// alle Elemente aus der Liste löschen
Parameters.Clear();

// Liste in eine andere gleichen Typs kopieren
Parameters.AddRange(SourceParameterList);

// ersten Parameter suchen, dessen Wert von a > 10.0 ist
TParameter Par = Parameters.Find(delegate(TParameter Par) { return Par.a > 10.0; });

// neue Liste erzeugen in der nur bestimmte Elemente einer alten Liste stehen
List<TParameter> NewParameters = Parameters.FindAll(delegate(TParameter Par) { return Par.a > 10.0; });

// einfache Methode zum Sortieren einer Liste
Parameters.Sort(delegate(TParameter Par1, TParameter Par2) { return Par1.sName.CompareTo(Par2.sName); });
  • eine weitere Methode zum Sortieren von List
using System.Collections.Generic;

// Objekt, dass in die Liste soll
// muß von IComparable abgeleitet sein, damit es über
// CompareTo() bei Aufruf von Sort verglichen werden kann
class TParameter : IComparable
{
     public double a = 0.0;
     public double b = 0.0;

     public TParameter(double da, double db)
     {
          a = da;
          b = db;
     }

     public int CompareTo(Object o) 
     {
        TParameter P = o as TParameter;

        int iRetVal = 0; // Grundinitialisierung für this.a == ((TParameter)o).a

        if (P != null)
        {
            if (this.a < P.a) iRetVal = -1; // Objekt ist kleiner als das Übergebene 
            else if (this.a > P.a) iRetVal = 1; // Objekt ist größer als das Übergebene
        }
        
        return iRetVal;
     }
}

// Verwendung
List list = new List();
list.Add(new TParameter(0.8, 0.2));
list.Add(new TParameter(0.5, 0.4));
list.Add(new TParameter(0.1, 0.1));
list.Sort(); // ruft CompareTo() auf
foreach (TParameter Par in list) Console.WriteLine(Par.a.ToString()+", "+Par.b.ToString());
  • Ausgabe von Elementen einer Stringliste
using System.Collections.Generic;

List<string> namen = new List<string>() { "Horst", "Ulf", "Jochen" };
string ausgabe = string.Join(", ", namen.ToArray());