New Function: LINE_EXISTS

  • Donnerstag, 03. März 2016 11:17
Artikel bewerten
(0 Stimmen)

Hier möchte ich euch die für mich neue Prädikatfunktion line_exists vorstellen.

Wie der Name bereits erahnen lässt, überprüft diese Funktion, ob ein bestimmer Datensatz in der internen Tabelle vorhanden ist.
Die Funktion überprüft, ob die im Tabellenausdruck table_exp angegebene Zeile einer internen Tabelle
vorhanden ist und gibt einen entsprechenden Wahrheitswert zurück. Für table_exp können außer einzelnen Tabellenausdrücken
auch alle Verkettungen angegeben werden, deren Resultat eine Zeile einer internen Tabelle ist.

Allgemeine Datendeklaration:

 *== Table with more components
*-- define type for table
TYPES: tt_data_single TYPE STANDARD TABLE OF i WITH DEFAULT KEY.
TYPES:
  BEGIN OF ty_data_multiple,
    field1 TYPE i,
    field2 TYPE c LENGTH 10,
    field3 TYPE abap_bool,
  END OF ty_data_multiple.
TYPES: tt_data_multiple TYPE STANDARD TABLE OF ty_data_multiple WITH DEFAULT KEY.

Simple Usage

In diesem Beispiel, verwende ich den neuen VALUE-Operator um schnell und flexibel eine interne Tabelle aufzubauen.
Anschließend werde ich mit Hilfer der klassischen Variante (READ TABLE ... ) prüfen, ob meine gesuchte Zeile vorhanden ist.
Danach werde ich mit Hilfer der neuen Variante (line_exists( ) ...) ebenfalls prüfen, ob meine gesuchte Zeile vorhanden ist.

 DATA(lt_data) =
  VALUE tt_data_single( ( 1 )
                        ( 2 )
                        ( 3 )
                        ( 5 )
                        ( 8 )
              ).
DATA(lv_value) = 2. "I´m looking for the second row
*-- classic way
READ TABLE lt_data TRANSPORTING NO FIELDS INDEX lv_value.
IF sy-subrc <> 0.
  WRITE: /(20) 'Not Found'.
ELSE.
  WRITE: /(20) 'Found'.
ENDIF.
*-- new way
IF line_exists( lt_data[ table_line = lv_value ] ).
  WRITE: /(20) 'Found'.
ELSE.
  WRITE: /(20) 'Not Found'.
ENDIF.

simple multiple component

Zuvor habe ich euch gezeigt, wie ihr bei einfachen Tabellen nach einer bestimmten Zeile suchen könnt. Wie kann ich aber nun
in einer komplexeren Tabelle nach einer Zeile suchen. Auch hier bietet uns SAP die Möglichkeit in der Funktion line_exists( ... )
Parameter mit zu übergeben.

In diesem Beispiel verwende ich wiederrum eine weitere neue Technik, um die interne Tabelle aufzubauen.Hierfür verwende ich
diesmal den neuen NEW-Instanzoperator. Nachdem ich als Resultat eine Datenreferenz habe, muss ich natürlich diese wieder
dereferenzieren, damit ich mit meiner internen Tabelle weiter arbeiten kann. Hierzu dereferenziere ich in ein Feldsymbol.
Anschließend zeige ich euch mit Hilfe von READ TABLE ... WITH KEY ... wie ich überprüfe ob meine gesuchte Zeile vorhanden ist.
Danach werde ich die selbe Funktionalität mit der neuen Funktion line_exists( ... ) durchführen.

 *-- set values
DATA(lr_data_multiple) =
  NEW tt_data_multiple( ( field1 = 1 field2 = 'String' field3 = abap_true )
               ( field1 = 2 field2 = 'String' field3 = abap_true )
              ).
*-- dereference to field symbolitab
*ASSIGN lr_data->* TO FIELD-SYMBOL(<fs_data_tab>).
FIELD-SYMBOLS: <fs_data_multiple_tab> TYPE tt_data_multiple.
ASSIGN lr_data_multiple->* TO <fs_data_multiple_tab>.
*== LINE_EXISTS to check record in ITAB
*-- LINE_EXISTS works with simple multiple component check as well.
*-- classic way
READ TABLE <fs_data_multiple_tab> TRANSPORTING NO FIELDS WITH KEY field1 = 1 field2 = 'String'.
IF sy-subrc <> 0.
  WRITE: /(20) 'Not Found'.
ELSE.
  WRITE: /(20) 'Found'.
ENDIF.
*-- new way
IF line_exists( <fs_data_multiple_tab>[ field1 = 1 field2 = 'String' ] ).
  WRITE: /(20) 'Found'.
ELSE.
  WRITE: /(20) 'Not Found'.
ENDIF.

Fazit:

Ich denke man kann sofort den Vorteil erkennen.  Zum einem benötigen wir weniger Zeilen an Code und zum anderem finde ich ich es sehr gut mehr mit Boolean Werten in ABAP zu arbeiten. Ich würde euch empfehlen fortan diese Funktion zu verwenden, sobald ihr sonst READ TABLE ... TRANSPORTING NO FIELDS ... verwenden würdet. Diese Funktion kann nicht zum Feststellen der Zeilennummern verwendet werden. Hierfür wird uns eine andere Funktion zur Verfügung gestellt. line_index( ... ) Ich selbst habe noch wenig Erfahrung mit dieser Funktion. Deshalb kann ich derzeit eher wenig dazu sagen. Aber vielleicht habt ihr ja schon Erfahrungen sammeln können. Über euer Feedback würde ich mich freuen.

In diesem Sinne

Blogging is a conversation, not a code.

Letzte Änderung am %AM, %09. %505 %2016 %11:%Mär
Kommentare einblenden

Copyright © 2017 ABAP-Workbench.de