TYPE RANGE OF Tabelle zur Laufzeit erstellen

Range Elemente werden in ABAP Programmen immer wieder an diversen Stellen benötigt. Sei es für SELECT Anweisungen, Loops oder sonstige SQL Statements. Dabei ist es nicht immer möglich das RANGE Objekt bereits während der Entwicklung zu deklarieren. In meinem kleinem Beispiel möchte ich zeigen, wie man zur Laufzeit ein RANGE Objekt mit der richtigen Typisierung erzeugen kann.

Das Coding ist als statische Methode in einer Utility Klasse angelegt. Importparameter ist IV_DATA_ELEMENT_NAME vom Typ ROLLNAME.

Im ersten Abschnitt der Methode werden die ABAP Element Description Objekte für die Felder SIGN, OPTION, LOW und HIGH erzeugt. Da die Felder LOW und HIGH vom Typ des übergebenen Daten Elementes sind, benötigen wir hier nur ein Description Objekt..

Sind die ABAP Objekte erzeugt, wird damit die Komponenten Tabelle befüllt und die Struktur und Tabellen Description Objekte erstellt. Zuletzt wird mithilfe des Tabellen-Objektes das eigentliche RANGE Objekt generiert welches in der Beispielmethode als RETURN Parameter definiert wurde und vom Typ DATA ist.

method create_range_object.
  data: obj_sign_descr type ref to cl_abap_elemdescr,
        obj_option_descr type ref to cl_abap_elemdescr,
        obj_value_descr type ref to cl_abap_elemdescr.
  data: obj_table type ref to cl_abap_tabledescr,
        obj_struct type ref to cl_abap_structdescr.
  data: lt_components type cl_abap_structdescr=>component_table.

  field-symbols: <wa_components> type abap_componentdescr.

  if iv_data_element_name is initial.
    exit.
  endif.

* Create sign and option elements
  try.
      obj_sign_descr ?= cl_abap_elemdescr=>describe_by_name( 'DDSIGN' ).
      obj_option_descr ?= cl_abap_elemdescr=>describe_by_name( 'DDOPTION' ).
      obj_value_descr ?= cl_abap_elemdescr=>describe_by_name( iv_data_element_name ).

* Build component table
      append initial line to lt_components assigning <wa_components>.
      move 'SIGN' to <wa_components>-name.
      move obj_sign_descr to <wa_components>-type.

      append initial line to lt_components assigning <wa_components>.
      move 'OPTION' to <wa_components>-name.
      move obj_option_descr to <wa_components>-type.

      append initial line to lt_components assigning <wa_components>.
      move 'LOW' to <wa_components>-name.
      move obj_value_descr to <wa_components>-type.

      append initial line to lt_components assigning <wa_components>.
      move 'HIGH' to <wa_components>-name.
      move obj_value_descr to <wa_components>-type.

* Build structure and table
      obj_struct = cl_abap_structdescr=>create( lt_components ).
      obj_table ?= cl_abap_tabledescr=>create( p_line_type = obj_struct ).

* Create range object
      create data ro_range_object type handle obj_table.

    catch cx_root.
  endtry.

  free: obj_sign_descr, obj_option_descr, obj_value_descr, obj_struct, obj_table.
  free: lt_components.
endmethod.

Posted on 20. März 2015 in ABAP, Blog

Back to Top