Alternativen zu und Erweiterung von LOOP AT bzw. READ TABLE

  Entwicklung von und mit ABAP / ABAP Objects   Home  Links  Datenschutz  Impressum
 

 

Prüfen, ob Datensatz vorhanden ist

alt
 
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
...
READ TABLE lt_sbook TRANSPORTING NO FIELDS
    WITH KEY carrid = 'AA'.
IF sy-subrc = 0.
  WRITE: 'Booking found for flight AA'.
ELSE.
  WRITE: 'Booking not found for flight AA'.
ENDIF.
neu
 
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
...
TRY.
    DATA(ls_sbook) = lt_sbook[ carrid = 'AA' ].
    WRITE: 'Booking found for flight AA'.
  CATCH cx_sy_itab_line_not_found.
    WRITE: 'Booking not found for flight AA'.
ENDTRY.
 
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
...
IF LINE_EXISTS( lt_sbook[ carrid = 'AA' ] ).
  WRITE: 'Booking found for flight AA'.
ELSE.
  WRITE: 'Booking not found for flight AA'.
ENDIF.
 

 
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
DESCRIBE TABLE lt_sbook LINES DATA(lv_count).
WRITE: / 'No. of bookings:', lv_count.
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
DATA(lv_count) = LINES( lt_sbook ).
WRITE: / 'No. of bookings:', lv_count.
 
SELECT * FROM sbook INTO TABLE @DATA(lt_sbook).
WRITE: / 'No. of bookings:', LINES( lt_sbook ).

Datensatz in interner Tabelle über INDEX oder Feldwert(en) lesen

alt: mit READ TABLE
 
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  "1. Zugriff über hardcodierte Indexnumber
  READ TABLE lt_sflight INTO DATA(ls_sflight) INDEX 1.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
neu: ohne READ TABLE ...
 
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  TRY.
      "1. Zugriff über hardcodierte Indexnumber
      DATA(ls_sflight) = lt_sflight[ 1 ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
  "2. Zugriff über variable Indexnumber
  DATA(lv_index) = lines( lt_sflight ).
  READ TABLE lt_sflight INTO ls_sflight INDEX lv_index.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
  TRY.
      "2. Zugriff über variable Indexnumber
      DATA(lv_index) = lines( lt_sflight ).
      DATA(ls_sflight) = lt_sflight[ lv_index ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
IF sy-subrc = 0.
  "3. Zugriff über einen bestimmten Feldwert
  READ TABLE lt_sflight INTO ls_sflight
    WITH KEY carrid = 'SQ'.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
IF sy-subrc = 0.
  TRY.
      "3. Zugriff über einen bestimmten Feldwert
      DATA(ls_sflight) = lt_sflight[ carrid = 'SQ' ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
  "4. Zugriff über bestimmte Feldwerte
  READ TABLE lt_sflight INTO ls_sflight
     WITH KEY carrid = 'SQ' connid = '0026'.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
IF sy-subrc = 0.
  TRY.
      "4. Zugriff über bestimmte Feldwerte
      DATA(ls_sflight) = lt_sflight[ carrid = 'SQ' connid = '0026' ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
IF sy-subrc = 0.
  "5. Zugriff mit komplexer Bedingung
  LOOP AT lt_sflight INTO ls_sflight
      WHERE carrid = 'LH'
      AND   connid = '0001'
      AND   seatsocc > 0.
    EXIT.
  ENDLOOP.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  TRY.
      "5. Zugriff mit komplexer Bedingung
      DATA(ls_sflight) = lt_sflight[ carrid = 'LH' connid = '0001' ]-seatsocc > 0.
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
 

Alternative zu READ TABLE ... BINARY SEARCH bzw. READ TABLE ... WITH TABLE KEY

alt
 
SELECT * FROM sflight
  ORDER BY PRIMARY KEY(
  INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  READ TABLE lt_sflight INTO ls_sflight
     WITH KEY carrid = 'LH' connid = '0400'
     BINARY SEARCH.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
neu
 
SELECT * FROM sflight
  ORDER BY PRIMARY KEY(
  INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  TRY.
      DATA(ls_sflight = lt_sflight[ carrid = 'LH' connid = '0400' ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
alt
 
DATA lt_sflight TYPE SORTED TABLE OF sflight
  WITH NON-UNIQUE KEY carrid connid.
SELECT * FROM sflight
  ORDER BY PRIMARY KEY
  INTO TABLE @lt_sflight.
IF sy-subrc = 0.
  READ TABLE lt_sflight INTO DATA(ls_sflight)
     WITH TABLE KEY carrid = 'LH' connid = '0400'.
  IF sy-subrc <> 0.
    "... Fehlerbehandlung
  ENDIF.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
neu
 
DATA lt_sflight TYPE SORTED TABLE OF sflight
  WITH NON-UNIQUE KEY carrid connid.
SELECT * FROM sflight
  ORDER BY PRIMARY KEY
  INTO TABLE @lt_sflight.
IF sy-subrc = 0.
  TRY.
      DATA(ls_flight) = lt_sflight[ carrid = 'LH' connid = '0400' ].
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_line_not_found).
      "... Fehlerbehandlung, z, B, MESSAGE lx_line_not_found->get_text( ) TYPE 'E'.
  ENDTRY.
ELSE.
  "... keine passenden Datensätze in SFLIGHT gefunden!
ENDIF.
 

 

Indikatorstrukturen für interne Tabellen

alt
neu
 
TYPES ts_sflight_indicator TYPE sflight WITH INDICATORS indicator TYPE abap_bool.
DATA lt_sflight TYPE STANDARD TABLE OF ts_sflight_indicator WITH EMPTY KEY.
FINAL(lcv_indicator_syntax) = 'SET STRUCTURE indicator'.
 
SELECT carrid, connid, fldate, price, seatsocc FROM sflight
  WHERE carrid = char`LH`
  AND   connid = numc`0400`
  AND   fldate = @( cl_demo_date_time=>get_user_date( ) )
  INTO CORRESPONDING FIELDS OF TABLE @lt_sflight.
IF sy-subrc = 0.
  LOOP AT lt_sflight ASSIGNING FIELD-SYMBOL(<ls_sflight>).
    DATA(lv_price) = COND sflight-price( WHEN <ls_sflight>-seatsocc >= 320 THEN <ls_sflight>-price * '0.75'
                                         WHEN <ls_sflight>-seatsocc <= 100 THEN <ls_sflight>-price * '1.66'
                                         ELSE <ls_sflight>-price ).
    IF <ls_sflight>-price <> lv_price.
      <ls_sflight>-indicator-price = abap_true.
    ENDIF.
    <ls_sflight>-price = lv_price.
  ENDLOOP.
  UPDATE sflight FROM TABLE @lt_sflight INDICATORS SET STRUCTURE indicator.
  "generic coding
  "FINAL(lcv_indicator_syntax) = 'SET STRUCTURE indicator'.
  "UPDATE sflight FROM TABLE @lt_sflight INDICATORS (lcv_indicator_syntax).
  CASE sy-subrc.
    WHEN 0.
      COMMIT WORK AND WAIT.
      cl_demo_output=>write( 'Neu berechnete Preise:' ).
      cl_demo_output=>write( lt_sflight ).
      cl_demo_output=>write( 'Datensätze in SFLIGHT nach der Änderung:' ).
      SELECT * FROM sflight
        WHERE carrid = char`LH`
        AND   connid = numc`0400`
        AND   fldate = @( cl_demo_date_time=>get_user_date( ) )
        INTO TABLE @DATA(lt_db_sflight).
      cl_demo_output=>display( lt_db_sflight ).
    WHEN OTHERS.
      ROLLBACK WORK.
  ENDCASE.
ENDIF.
 

 

Rekursion mittels LOOP AT ... GROUP BY anstelle von AT FIRST/AT NEW/AT END OF/...

alt
 
DATA lv_total_weight TYPE sbook-luggweight.
SELECT * FROM sbook
  WHERE carrid = 'LH'
  INTO TABLE @DATA(lt_sbook).
SORT lt_sbook BY carrid connid fldate luggweight DESCENDING.
WRITE: 'Carrier', 9 'Connection', 21 'Flight Date'.
ULINE.
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>).
  AT NEW fldate.
    CLEAR lv_total_weight.
    WRITE: / <ls_sbook>-carrid, 9 <ls_sbook>-connid, 21 <ls_sbook>-fldate.
    WRITE: 35 'Customer Id', 50 'Luggage Weight'.
  ENDAT.
 
  WRITE: /35 <ls_sbook>-customid, 50 <ls_sbook>-luggweight.
  lv_total_weight += <ls_sbook>-luggweight.
 
  AT END OF fldate.
    WRITE: /35 'Total Weight : ', 50 lv_total_weight.
    ULINE.
  ENDAT.
ENDLOOP.
neu
 
DATA lv_total_weight TYPE sbook-luggweight.
SELECT * FROM sbook
  WHERE carrid = 'LH'
  INTO TABLE @DATA(lt_sbook).
SORT lt_sbook BY carrid connid fldate luggweight DESCENDING.
WRITE: 'Carrier', 9 'Connection', 21 'Flight Date'.
ULINE.
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>)
    GROUP BY ( carrid = <ls_sbook>-carrid
               connid = <ls_sbook>-connid
               fldate = <ls_sbook>-fldate ).
  WRITE: / <ls_sbook>-carrid, 9 <ls_sbook>-connid, 21 <ls_sbook>-fldate.
  WRITE: 35 'Customer Id', 50 'Luggage Weight'.
 
  CLEAR lv_total_weight.
  LOOP AT GROUP <ls_sbook>
      ASSIGNING FIELD-SYMBOL(<ls_sbook_group>).
    WRITE: /35 <ls_sbook_group>-customid, 50 <ls_sbook_group>-luggweight.
    lv_total_weight += <ls_sbook_group>-luggweight.
  ENDLOOP.
 
  WRITE: /35 'Total Weight: ', 50 lv_total_weight.
  ULINE.
ENDLOOP.
 

 

Rekursion mittels LOOP AT ... GROUP BY: doppelte Werte verdichen

alt
 
SELECT * FROM sbook
  ORDER BY carrid
  INTO TABLE @DATA(lt_sbook).
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>).
  AT NEW carrid.
    WRITE: / <ls_sbook>-carrid.
  ENDAT.
ENDLOOP.
neu
 
SELECT * FROM sbook
  INTO TABLE @DATA(lt_sbook).
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>)
    GROUP BY ( carrid = <ls_sbook>-carrid )
    WITHOUT MEMBERS
    REFERENCE INTO DATA(lr_sbook).
  WRITE: / lr_sbook->carrid.
ENDLOOP.
 

 

Rekursion mittels LOOP AT ... GROUP BY: Anzahl Datensätze bestimmter Datensatzkombinationen ermitteln

alt
neu
 
SELECT * FROM sbook
  ORDER BY PRIMARY KEY
  INTO TABLE @DATA(lt_sbook).
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>)
    GROUP BY ( carrid = <ls_sbook>-carrid
               size   = GROUP SIZE
               index  = GROUP INDEX )
    ASCENDING
    REFERENCE INTO DATA(lr_sbook).
  WRITE:
    / lr_sbook->index LEFT-JUSTIFIED,
      lr_sbook->carrid, lr_sbook->size.
ENDLOOP.
 
SELECT * FROM sbook
  INTO TABLE @DATA(lt_sbook).
LOOP AT lt_sbook ASSIGNING FIELD-SYMBOL(<ls_sbook>)
    GROUP BY ( customid = <ls_sbook>-customid
               size     = GROUP SIZE
               index    = GROUP INDEX )
    REFERENCE INTO DATA(lr_sbook).
  WRITE:
    / lr_sbook->index LEFT-JUSTIFIED,
      lr_sbook->customid, lr_sbook->size.
ENDLOOP.
 

 

FOR Operator

alt
 
TYPES:
  BEGIN OF ts_connect,
    carrid TYPE sflight-carrid,
    separa TYPE c LENGTH 1,
    connid TYPE sflight-connid,
  END OF ts_connect,
  BEGIN OF ts_flight,
    index   TYPE i,
    carrier TYPE scarr-carrname,
    connect TYPE ts_connect,
    fldate  TYPE sflight-fldate,
  END OF ts_flight.
DATA lt_flight TYPE STANDARD TABLE OF ts_flight WITH DEFAULT KEY.
DATA ls_flight LIKE LINE OF lt_flight.
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  SELECT * FROM scarr
    ORDER BY PRIMARY KEY
    INTO TABLE @DATA(lt_scarr).
ENDIF.
 
LOOP AT lt_sflight ASSIGNING FIELD-SYMBOL(<ls_sflight>)
    WHERE carrid = 'AA' AND connid = '0017'.
  READ TABLE lt_scarr ASSIGNING FIELD-SYMBOL(<ls_scarr>)
    WITH KEY carrid = <ls_sflight>-carrid
    BINARY SEARCH.
  IF sy-subrc = 0.
    ls_flight-index += 1.
    ls_flight-carrier = <ls_scarr>-carrname.
    ls_flight-connect-carrid = <ls_sflight>-carrid.
    ls_flight-connect-separa = '-'.
    ls_flight-connect-connid = <ls_sflight>-connid.
    ls_flight-fldate = <ls_sflight>-fldate.
    APPEND ls_flight TO lt_flight.
  ENDIF.
ENDLOOP.
cl_demo_output=>display( lt_flight ).
neu
 
TYPES:
  BEGIN OF ts_connect,
    carrid TYPE sflight-carrid,
    separa TYPE c LENGTH 1,
    connid TYPE sflight-connid,
  END OF ts_connect,
  BEGIN OF ts_flight,
    index   TYPE i,
    carrier TYPE scarr-carrname,
    connect TYPE ts_connect,
    fldate  TYPE sflight-fldate,
  END OF ts_flight.
DATA lt_flight TYPE STANDARD TABLE OF ts_flight WITH EMPTY KEY.
SELECT * FROM sflight INTO TABLE @DATA(lt_sflight).
IF sy-subrc = 0.
  SELECT * FROM scarr INTO TABLE @DATA(lt_scarr).
ENDIF.
 
lt_flight = VALUE #( FOR ls_sflight IN lt_sflight INDEX INTO lv_index
                     WHERE ( carrid = 'AA' AND connid = '0017' )
                     LET lv_carrname = lt_scarr[ carrid = ls_sflight-carrid ]-carrname
                     IN carrier = lv_carrname
                      ( index = lv_index
                        connect-carrid = ls_sflight-carrid
                        connect-separa = '-'
                        connect-connid = ls_sflight-connid
                        fldate = ls_sflight-fldate ) ).
cl_demo_output=>display( lt_flight ).
 

 

verschachtelte FOR Schleifen

alt
 
LOOP AT lt_sflight ASSIGNING FIELD-SYMBOL(<ls_sflight>)
    WHERE carrid = 'AA' AND connid = '0017'.
  READ TABLE lt_scarr ASSIGNING FIELD-SYMBOL(<ls_scarr>)
    WITH KEY carrid = <ls_sflight>-carrid
    BINARY SEARCH.
  IF sy-subrc = 0.
    ls_flight-index += 1.
    ls_flight-carrier = <ls_scarr>-carrname.
    ls_flight-connect-carrid = <ls_sflight>-carrid.
    ls_flight-connect-separa = '-'.
    ls_flight-connect-connid = <ls_sflight>-connid.
    ls_flight-fldate = <ls_sflight>-fldate.
    APPEND ls_flight TO lt_flight.
  ENDIF.
ENDLOOP.
cl_demo_output=>display( lt_flight ).
neu
 
lt_flight = VALUE #( FOR ls_sflight IN lt_sflight INDEX INTO lv_index
                         WHERE ( carrid = 'AA' AND connid = '0017' )
                     FOR ls_scarr IN lt_scarr WHERE ( carrid = ls_sflight-carrid )
                     ( index = lv_index
                       carrier = ls_scarr-carrname
                       connect-carrid = ls_sflight-carrid
                       connect-separa = '-'
                       connect-connid = ls_sflight-connid
                       fldate = ls_sflight-fldate ) ).
cl_demo_output=>display( lt_flight ).
 

 

LOOP AT Methode

alt
 
LOOP AT lt_sflight ASSIGNING FIELD-SYMBOL(<ls_sflight>)
    WHERE carrid = 'AA' AND connid = '0017'.
  ls_flight-index += 1.
  READ TABLE lt_scarr ASSIGNING FIELD-SYMBOL(<ls_scarr>)
    WITH KEY carrid = <ls_sflight>-carrid
    BINARY SEARCH.
  IF sy-subrc = 0.
    ls_flight-carrier = <ls_scarr>-carrname.
  ENDIF.
  ls_flight-connect-carrid = <ls_sflight>-carrid.
  ls_flight-connect-separa = '-'.
  ls_flight-connect-connid = <ls_sflight>-connid.
  ls_flight-fldate = <ls_sflight>-fldate.
  APPEND ls_flight TO lt_flight.
ENDLOOP.
cl_demo_output=>display( lt_flight ).
neu
 
DATA ls_flight TYPE ts_flight.
LOOP AT lt_sflight INTO DATA(ls_sflight)
    WHERE carrid = 'AA' AND connid = '0017'.
  ls_flight-index += 1.
  ls_flight-carrier = lt_scarr[ carrid = ls_sflight-carrid ]-carrname.
  ls_flight-connect-carrid = ls_sflight-carrid.
  ls_flight-connect-separa = '-'.
  ls_flight-connect-connid = ls_sflight-connid.
  ls_flight-fldate = ls_sflight-fldate.
  APPEND ls_flight TO lt_flight.
ENDLOOP.
cl_demo_output=>display( lt_flight ).