[ABAP] string-Formatierungen mit String-Templates

* ab V7.31
* http://zevolving.com/2013/07/abap-string-templates-new-feature-in-abap-731/

* Hinweis: String-Templates funktionieren nur Programmen bei denen die Unicodeprüfung aktiv ist!
* Z.B. kommt es in Modulpool-Programmen zu Fehlern beim kompilieren des Codes und der Compiler moniert die '|'-Symbole

DATA: text TYPE string VALUE 'Text'.
DATA: atext TYPE string VALUE '012345'.
DATA: num TYPE p DECIMALS 3 VALUE '-123.45'.

* Case
WRITE: / |RAW:   { text CASE = RAW }|.   " Text
WRITE: / |LOWER: { text CASE = LOWER }|. " text
WRITE: / |UPPER: { text CASE = UPPER }|. " TEXT

* Align
WRITE: / |LEFT:   ->{ text WIDTH = 20 ALIGN = LEFT }<--|.   " >Text                <
WRITE: / |RIGHT:  ->{ text WIDTH = 20 ALIGN = RIGHT }<--|.  " >                Text<
WRITE: / |CENTER: ->{ text WIDTH = 20 ALIGN = CENTER }<--|. " >        Text        <

* Padding, Auffüllen mit definiertem Zeichen
WRITE: / |PAD: { text ALIGN = LEFT WIDTH = 20 PAD = '_' }|.   " Text________________
WRITE: / |PAD: { text ALIGN = RIGHT WIDTH = 20 PAD = '_' }|.  " ________________Text
WRITE: / |PAD: { text ALIGN = CENTER WIDTH = 20 PAD = '_' }|. " ________Text________

* führende Nullen hinzufügen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_INPUT'
WRITE: / |ALPHA: { atext WIDTH = 20 ALPHA = IN }|. " 00000000000000012345
* führende Nullen entfernen, ersetzt FUBA 'CONVERSION_EXIT_ALPHA_OUTPUT'
WRITE: / |ALPHA: { atext ALPHA = OUT }|.           " 12345

* Zahlen 1
WRITE: / |RAW:         { num NUMBER = RAW }|.         " -123.45
WRITE: / |USER:        { num NUMBER = USER }|.        " -123,45
WRITE: / |ENVIRONMENT: { num NUMBER = ENVIRONMENT }|. " -123,45

* Zahlen 2
WRITE: / |SCIENTIFIC:                   { num STYLE = SCIENTIFIC }|.                   " -1.2345E+02
WRITE: / |SCIENTIFIC_WITH_LEADING_ZERO: { num STYLE = SCIENTIFIC_WITH_LEADING_ZERO }|. " -0.12345E+03
WRITE: / |SCALE_PRESERVING_SCIENTIFIC:  { num STYLE = SCALE_PRESERVING_SCIENTIFIC }|.  " -1.2345E+0002
WRITE: / |ENGINEERING:                  { num STYLE = ENGINEERING }|.                  " -123.45E+00

* Datumsformat
WRITE: / |RAW:         { sy-datum DATE = RAW }|.         " 20160705
WRITE: / |ISO:         { sy-datum DATE = ISO }|.         " 2016-07-05
WRITE: / |USER:        { sy-datum DATE = USER }|.        " 05.07.2016
WRITE: / |ENVIRONMENT: { sy-datum DATE = ENVIRONMENT }|. " 05.07.2016

* Uhrzeitformat
WRITE: / |RAW:         { sy-uzeit TIME = RAW }|.         " 102336
WRITE: / |ISO:         { sy-uzeit TIME = ISO }|.         " 10:23:36
WRITE: / |USER:        { sy-uzeit TIME = USER }|.        " 10:23:36
WRITE: / |ENVIRONMENT: { sy-uzeit TIME = ENVIRONMENT }|. " 10:23:36

* Timestampformat
DATA: lv_tsl TYPE timestampl.
* Zeitstempel lang
GET TIME STAMP FIELD lv_tsl.
WRITE: / |SPACE:       { lv_tsl TIMESTAMP = SPACE }|.       " 2016-07-05 08:23:36.0908600
WRITE: / |ISO:         { lv_tsl TIMESTAMP = ISO }|.         " 2016-07-05T08:23:36,0908600
WRITE: / |USER:        { lv_tsl TIMESTAMP = USER }|.        " 05.07.2016 08:23:36,0908600
WRITE: / |ENVIRONMENT: { lv_tsl TIMESTAMP = ENVIRONMENT }|. " 05.07.2016 08:23:36,0908600

* ABAP Serialization XML (axXML)
WRITE: / |XML: { lv_tsl XSD = YES }|. " 20160705082336.09086

[ABAP] RANGES

Ein RANGE definiert eine spezielle interne Tabelle vom Typ STANDARD TABLE mit Header Line zur Abbildung von Intervallen (z.B. für SELECT-OPTIONS und WHERE … IN).
Die Definition von RANGES an sich ist obsolet.

Weiterführende Infos: Link und Link

Tabellenfelder einer RANGE-Tabelle

  • SIGN (Bereichabgrenzung)
    • Typ: DDSIGN
    • Domäne: DDSIGN
    • Werte
      • I Bereichsabgrenzung eingeschlossen (Inclusive)
      • E Bereichsabgrenzung ausgeschlossen (Exclusive)
  • OPTION (Optionen)
    • Typ: DDOPTION
    • Domäne: DDOPTION
    • Werte
      • EQ gleich
      • BT zwischen … und …
      • CP enthält das Template
      • LE kleiner oder gleich
      • GE größer oder gleich
      • NE ungleich
      • NB nicht zwischen … und …
      • NP enthält das Template nicht
      • GT größer
      • LT kleiner
  • LOW (niedrigster Wert des Intervalls)
    • Typ: C
    • Länge: 1…n (abh. vom Such-Datentyp)
  • HIGH (höchster Wert des Intervalls)
    • Typ: C
    • Länge: 1…n (abh. vom Such-Datentyp)
      (leer, wenn z.B. OPTION = EQ)

DDIC-Zeilentypen, die RANGEs abbilden

* SELOPT
* RSDSSELOPT
* RSIS_S_RANGE

DDIC-Tabellentypen, die RANGEs abbilden

* RSELOPTION
* CMS_TAB_BII_CAG_TYP_RNG
* FIWTIN_T_SELOPT
* PIQ_SELOPT_T
* PSI_WE_SELOPT_TT

Hilfsklasse mit Konstanten für die Selektionstabellen bzw. Ranges-Tabellen

IF_FSBP_CONST_RANGE (Konstanten für die Selektionstabellen bzw. Ranges-Tabellen)

* OPTION_BETWEEN		'BT'
* OPTION_CONTAINS_PATTERN	'CP'
* OPTION_EQUAL			'EQ'
* OPTION_GREATER		'GT'
* OPTION_GREATER_EQUAL		'GE'
* OPTION_LESS			'LT'
* OPTION_LESS_EQUAL		'LE'
* OPTION_NOT_BETWEEN		'NB'
* OPTION_NOT_CONTAINS_PATTERN	'NP'
* OPTION_NOT_EQUAL		'NE'
* SIGN_EXCLUDE			'E'
* SIGN_INCLUDE			'I'

Beispiel 1 (Übergabe von RANGES (SELECT-OPTIONS) an Klassenmethoden)

REPORT zrange_demo.

* Klasse für Demo der Übergabe von RANGEs (SELECT-OPTIONS)
CLASS lcl_matnr DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      get_data
        IMPORTING
          i_it_matnr TYPE STANDARD TABLE. " RANGE (SELECT-OPTIONS) als STANDARD TABLE übergeben
ENDCLASS.

CLASS lcl_matnr IMPLEMENTATION.
  METHOD get_data.
    DATA: it_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

* STANDARD TABLE im SQL verwenden
     SELECT * FROM mara INTO TABLE @it_mara
       WHERE matnr IN @i_it_matnr.

     ...

  ENDMETHOD.
ENDCLASS.

* SELECT-OPTIONS festlegen
DATA: lv_matnr TYPE mara-matnr.
* RANGE so_matnr für MATNR definieren
SELECT-OPTIONS: so_matnr FOR lv_matnr.

INITIALIZATION.
* RANGE so_matnr initialisieren
  so_matnr[] = VALUE #( ( sign   = 'I'
                          option = 'EQ'
                          low    = '0000012345'
                          high   = '' ) ).

START-OF-SELECTION.
* Datenbereich des RANGE so_matnr übergeben
  lcl_matnr=>get_data( i_it_matnr = so_matnr[] ).

Beispiel 2 (RANGE OF)

* erzeugt eine interne Tabelle vom Typ STANDARD TABLE mit Header Line mit den Datenfeldern
* SIGN (C(1)) | OPTION (C(2)) | LOW (C(10)) | HIGH (C(10))
DATA: it_kunnr TYPE RANGE OF kunnr.

Beispiel 3 (STANDARD TABLE)

TYPES: BEGIN OF ty_range,
         sign   TYPE ddsign,
         option TYPE ddoption,
         low    TYPE char18, " char18 für 18-stellige MATNR
         high   TYPE char18, " char18 für 18-stellige MATNR
       END OF ty_range.

* erzeugt eine interne Tabelle vom Typ STANDARD TABLE mit den Datenfeldern
* SIGN (C(1)) | OPTION (C(2)) | LOW (C(18)) | HIGH (C(18))
DATA: it_matnr TYPE STANDARD TABLE OF ty_range WITH DEFAULT KEY.

Beispiel 4 (STANDARD TABLE mit generischen DDIC-Strukturen)

DATA(rg_so_carrid) = VALUE rseloption( ( sign   = 'I'
                                         option = 'EQ'
                                         low    = 'AA'
                                         high   = '' ) ).

Beispiel 5 (Verwendung in OpenSQL-WHERE-Condition)

DATA(rg_carrid) = VALUE rseloption( ( sign = 'I' option = 'EQ' low = 'AA' high = '' )
                                    ( sign = 'I' option = 'EQ' low = 'LH' high = '' )
                                  ).

SELECT *
  INTO TABLE @DATA(it_sflight)
  FROM sflight
  WHERE carrid IN @rg_carrid.

cl_demo_output=>display( it_sflight ).

Beispiel 6 (Verwendung eines RANGESs zum Filtern von internen Tabellen)

* Liste mit Namen
DATA(it_names) = VALUE string_table( ( |Horst| ) ( |Heiner| ) ( |Ida| ) ( |Lotte| ) ( |Hanna| ) ).

* Range mit Suchbegriffen
DATA(rg_search) = VALUE rseloption( ( sign = 'I' option = 'EQ' low = 'Ida' high = '' )
                                    ( sign = 'I' option = 'EQ' low = 'Lotte' high = '' )
                                  ).

* Filtern der Liste mittels WHERE-Condition + RANGE
LOOP AT it_names ASSIGNING FIELD-SYMBOL(<n>) WHERE table_line IN rg_search.
  WRITE: / <n>.
ENDLOOP.

[ABAP] Datentypen für Zeitdarstellung und deren Verwendung

DATA: lv_dt TYPE d.           " Datum (YYYYMMDD)
DATA: lv_tm TYPE t.           " Zeit (HHMMSS)
DATA: lv_ts TYPE timestamp.   " Zeitstempel kurz (YYYYMMDDhhmmss)
DATA: lv_tsl TYPE timestampl. " Zeitstempel lang (YYYYMMDDhhmmss,mmmuuun)

* Systemzeit holen
lv_tm = sy-uzeit.

* Systemdatum holen
lv_dt = sy-datum.

* Zeitstempel kurz holen
GET TIME STAMP FIELD lv_ts.

* Zeitstempel lang holen
GET TIME STAMP FIELD lv_tsl.

* Zeit formatiert ausgeben
WRITE: / lv_dt MM/DD/YYYY.

* Datum formatiert ausgeben
WRITE: /(8) lv_tm USING EDIT MASK '__:__:__'.

* Zeitstempel kurz entsprechend der lokalen Zeitzone des Users ausgeben
WRITE: / lv_ts TIME ZONE sy-zonlo.

* Zeitstempel lang entsprechend der lokalen Zeitzone des Users ausgeben
WRITE: / lv_tsl TIME ZONE sy-zonlo.

[ABAP] ComboBoxen / Listboxen auf dem Selektionsbild anzeigen

DATA: it_cbval TYPE STANDARD TABLE OF vrm_value WITH DEFAULT KEY.

* TYPE / Länge des Typs hat Einfluss auf key
PARAMETERS: p_l_lang TYPE char3 AS LISTBOX VISIBLE LENGTH 20 USER-COMMAND lb_cmd.

INITIALIZATION.

  it_cbval = VALUE #( ( key = 'A_1' text = 'Punkt eins' )
                      ( key = 'A_2' text = 'Punkt zwei' ) ).

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'P_L_LANG'
      values          = it_cbval
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

  IF sy-subrc = 0.
    IF lines( it_cbval ) > 0.
* Vorselektion 'Punkt eins'
      p_l_lang = 'A_1'.
    ENDIF.
  ENDIF.

START-OF-SELECTION.
* akt. Selektion der ComboBox heraussuchen
  TRY.
      DATA(s) = it_cbval[ key = p_l_lang ].

      WRITE: / s-text.
    CATCH cx_root.
  ENDTRY.

[ABAP] Strukturbeschreibung für System-Datenobjekt SCREEN

Komponente      Länge Typ Attribut                    Bedeutung

name            132   c   Name                        Name
group1          3     c   Gruppe1                     Modifikationsgruppe
group2          3     c   Gruppe2                     Modifikationsgruppe
group3          3     c   Gruppe3                     Modifikationsgruppe
group4          3     c   Gruppe4                     Modifikationsgruppe
required        1     c   Muss-Feld                   obligatorisches Feld
input           1     c   Eingabe                     eingabebereites Feld (enabled)
output          1     c   Ausgabe                     Anzeigefeld
intensified     1     c   Hell                        hervorgehobenes Feld
invisible       1     c   Unsichtbar                  unsichtbares Element
length          1     x   visLänge                    Feldlänge
active          1     c   Eingabe/Ausgabe/Unsichtbar  aktives Feld (visible)
display_3d      1     c   Zweidimensional             Rahmen
value_help      1     c   Eingabehilfe                Eingabehilfetaste
request         1     c   -                           Eingabe vorhanden
values_in_combo 1     c   Dropdown-Listbox            Wertehilfe vorhanden
color           10    i                               Farbe vom Wert 0 - 7