[ABAP] SALV IDA: SAP List Viewer with Integrated Data Access

* Beispielprogramme:
* Paket: SALV_IDA_TEST

CONSTANTS: co_table_name TYPE dbtabl VALUE 'SBOOK'.

DATA: lv_carrid TYPE sbook-carrid.

SELECT-OPTIONS: so_carr FOR lv_carrid.

START-OF-SELECTION.

  TRY.
* SALV Table IDA erzeugen
      DATA(o_salv_ida) = cl_salv_gui_table_ida=>create( iv_table_name = co_table_name ).

* Authority Check (löst evtl. Exception aus, wenn Berechtigungen fehlen)
      o_salv_ida->add_authorization_for_object( iv_authorization_object = 'S_CARRID'
                                                it_activities           = VALUE #( ( auth_field = 'ACTVT' value = '03' ) )
                                                it_field_mapping        = VALUE #( ( auth_field = 'CARRID' view_field = 'CARRID' ) ) ).

* SELECT-Konditionen festlegen
      DATA(o_cond_factory) = o_salv_ida->condition_factory( ).

* RANGE definieren: SELECT-OPTIONS
      DATA(o_ranges) = NEW cl_salv_range_tab_collector( ).
      o_ranges->add_ranges_for_name( iv_name = 'CARRID' it_ranges = so_carr[] ).
      o_ranges->get_collected_ranges( IMPORTING
                                        et_named_ranges = DATA(it_name_range_pairs) ).
* RANGE definieren: manuell
      DATA(it_fixed_ranges) = VALUE if_salv_service_types=>yt_named_ranges( ( name = 'FORCURKEY' sign = 'E' option = 'EQ' low = 'GBP' high = '' ) ).

      APPEND LINES OF it_fixed_ranges TO it_name_range_pairs.

* SELECT-Konditionen und RANGES übergeben
      o_salv_ida->set_select_options( it_ranges    = it_name_range_pairs
                                      io_condition = o_cond_factory->equals( name = 'FLDATE' value = '20120523' )->and(
                                                     o_cond_factory->covers_pattern( name = 'PASSNAME' pattern = '*Anna*')->and(
                                                     o_cond_factory->equals( name = 'FORCURKEY' value = 'EUR' )->or(
                                                     o_cond_factory->equals( name = 'FORCURKEY' value = 'USD' ) ) ) ) ).

* Spaltenüberschrift ändern
      o_salv_ida->field_catalog( )->set_field_header_texts( iv_field_name        = 'PASSNAME'
                                                            iv_header_text       = 'Name des Passagiers'
                                                            iv_tooltip_text      = 'Standard: 40 Zeichen zur Verfügung'
                                                            iv_tooltip_text_long = 'Erweiterung: 100 Zeichen zur Verfügung bei richtiger SAP GUI und SAP Basis Version' ).

* Sortierungen festlegen
      DATA(it_sort_order) = VALUE if_salv_gui_types_ida=>yt_sort_rule( ( field_name = 'PASSNAME'
                                                                         descending = abap_false
                                                                         is_grouped = abap_false ) ).

      o_salv_ida->default_layout( )->set_sort_order( it_sort_order = it_sort_order ).

* manuelle Sortierung für Spalte ausschalten
      o_salv_ida->field_catalog( )->disable_sort( iv_field_name = 'PASSNAME' ).

* Filter ausschalten
      o_salv_ida->field_catalog( )->disable_filter( iv_field_name = 'PASSNAME' ).

* nur bestimmte Spalten darstellen 1
      o_salv_ida->field_catalog( )->get_all_fields( IMPORTING ets_field_names = DATA(it_field_names) ).
      DELETE it_field_names WHERE table_line CP 'SEATS*'.

* nur bestimmte Spalten darstellen 2
*        DATA(it_field_names) = VALUE if_salv_gui_types_ida=>yts_field_name( ( CONV #( 'CARRID' ) )
*                                                                            ( CONV #( 'CONNID' ) )
*                                                                            ( CONV #( 'FLDATE' ) )
*                                                                            ( CONV #( 'FORCURKEY' ) )
*                                                                            ( CONV #( 'CUSTTYPE' ) )
*                                                                            ( CONV #( 'PASSNAME' ) ) ).

      o_salv_ida->field_catalog( )->set_available_fields( its_field_names = it_field_names ).

* passenden Beschreibungstext anhand der Domäne darstellen
      o_salv_ida->field_catalog( )->display_options( )->set_formatting( iv_field_name        = 'CUSTTYPE'
                                                                        iv_presentation_mode = if_salv_gui_types_ida=>cs_presentation_mode-description ).

* Textsuche im Gitter für Spalten 'CARRID' und 'PASSNAME' aktivieren (Button mit Lupe oben rechts)
      o_salv_ida->field_catalog( )->enable_text_search( 'CARRID' ).
      o_salv_ida->field_catalog( )->enable_text_search( 'PASSNAME' ).
      o_salv_ida->standard_functions( )->set_text_search_active( abap_true ).

* Layouts verwalten
      o_salv_ida->layout_persistence( )->set_persistence_options( is_persistence_key           = VALUE #( report_name = sy-repid )
                                                                  i_global_save_allowed        = abap_true
                                                                  i_user_specific_save_allowed = abap_true ).

      o_salv_ida->toolbar( )->enable_listbox_for_layouts( ).

* Titel
      o_salv_ida->display_options( )->set_title( 'Überschrift' ).

* Text für leere Tabelle
      o_salv_ida->display_options( )->set_empty_table_text( 'Keine Daten vorhanden.' ).

* Zebrastreifen
      o_salv_ida->display_options( )->enable_alternating_row_pattern( ).

* Datenbankfähigkeiten abfragen
      IF abap_true = cl_salv_gui_table_ida=>db_capabilities( )->is_text_search_supported( ).
* unscharfe Suche (Fuzzy) -> wird nur von HANA unterstützt
        o_salv_ida->text_search( )->set_field_similarity( '0.8' ).
        o_salv_ida->text_search( )->set_search_term( |Fehler| ).
      ENDIF.

* Wird eine Beschränkung der Anzahl der Datensätze empfohlen?
      IF cl_salv_gui_table_ida=>db_capabilities( )->is_max_rows_recommended( ).
* max. Anzahl der Datensätze beschränken
        o_salv_ida->set_maximum_number_of_rows( iv_number_of_rows = 500 ).
      ENDIF.

      o_salv_ida->fullscreen( )->display( ).

    CATCH cx_root INTO DATA(lo_exc).
      WRITE: / lo_exc->get_text( ).
  ENDTRY.

Links

[ABAP] Einschränkungen bei der Verwendung von SALV-Tables

  • Anzahl der Spalten ist auf 90 begrenzt
  • Ausgabelänge einer Spalte ist auf 128 Zeichen begrenzt
  • Basisfunktionen für das Drucken, komplexe Drucklayouts sind im ALV nicht vorgesehen
  • zur Sortierung und für Zwischensummen stehen max. neun Ebenen bzw. Spalten zur Verfügung
  • bei aggregierbaren Spalten -> interne Länge der Spalte <= Länge Einzelwerte + Länge Ergebnis
  • nur flach strukturierte Tabellen darstellbar, Darstellung verschachtelter Tabellen ist nicht möglich
  • Tabellen sind nicht eingabebereit
  • Tabelle als Grid im Container -> keinen Batch-Modus nutzbar
  • Ergebnisse (Summen und Zwischensummen) können nicht übergeben oder manipuliert werden

[ABAP] PopUp-Fenster für Datumsauswahl (Kalender) anzeigen

Variante 1 (Monatskalender, Monat und Jahr wählbar)

DATA: lv_dat TYPE sy-datum.
  
CALL FUNCTION 'F4_DATE'
  IMPORTING
    select_date                  = lv_dat
  EXCEPTIONS
    calendar_buffer_not_loadable = 1
    date_after_range             = 2
    date_before_range            = 3
    date_invalid                 = 4
    factory_calendar_not_found   = 5
    holiday_calendar_not_found   = 6
    parameter_conflict           = 7
    OTHERS                       = 8.

Variante 2 (Jahreskalender, scrollbar)

DATA: lv_dat TYPE sy-datum.
  
CALL FUNCTION 'POPUP_CALENDAR_SDB'
  EXPORTING
    sel_day    = abap_true
    focus_day  = sy-datum
  IMPORTING
    begin_date = lv_dat.

[ABAP] URL im SAP-Browser als PopUp-Fenster anzeigen

Beispiel 1

cl_abap_browser=>show_url( url          = 'www.google.de'
                           title        = 'ABAP-Browser'
                           size         = cl_abap_browser=>large
                           modal        = abap_true
                           printing     = abap_false
                           buttons      = abap_true
                           format       = cl_abap_browser=>landscape
                           position     = cl_abap_browser=>topleft
                           context_menu = abap_false ).

Beispiel 2

* HTML-Code generieren lassen
SELECT * FROM tnapr INTO TABLE @DATA(it_tnapr).
DATA(lv_html) = cl_demo_output=>get( it_tnapr ).

* HTML-Code anzeigen
cl_abap_browser=>show_html( html_string  = lv_html
                            size         = cl_abap_browser=>xlarge
                            format       = cl_abap_browser=>landscape
                            context_menu = abap_true
                            buttons       = cl_abap_browser=>navigate_html ).

[ABAP] Text-Editor (Textanzeige, Texteingabe) als Popup-Fenster anzeigen

Variante 1 (führt Wordwrap bei Pos. 72 durch)

DATA: it_textlines TYPE STANDARD TABLE OF string.

...

CALL FUNCTION 'TERM_CONTROL_EDIT'
  EXPORTING
    titel          = 'Titel'
    langu          = sy-langu
  TABLES
    textlines      = it_textlines
  EXCEPTIONS
    user_cancelled = 1
    OTHERS         = 2.

IF sy-subrc = 0.

ENDIF.

Variante 2 (maximale Zeilenlänge sind 72 Zeichen)

DATA: it_text TYPE catsxt_longtext_itab.

...

CALL FUNCTION 'CATSXT_SIMPLE_TEXT_EDITOR'
  EXPORTING
    im_title        = 'Title'
    im_display_mode = ' ' " 'X' -> ReadOnly
    im_start_column = 10
    im_start_row    = 10
  CHANGING
    ch_text         = it_text.         " Tabelle mit Text

[ABAP] Inhalt einer internen Tabelle in einem PopUp-Fenster anzeigen

Variante 1 (Rechtsklick im PopUp zeigt Funktionsmenü)

CALL FUNCTION 'POPUP_WITH_TABLE'
  EXPORTING
    endpos_col   = 160
    endpos_row   = 40
    startpos_col = 1
    startpos_row = 1
    titletext    = 'Titel'
*           IMPORTING
*             CHOICE       =
  TABLES
    valuetab     = itab " darf nur eine Spalte beinhalten 
  EXCEPTIONS
    break_off    = 1
    OTHERS       = 2.
IF sy-subrc = 0.

ENDIF.

Variante 2 (Darstellung max. 80 Zeichen breit)

CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY_OK'
  EXPORTING
    endpos_col   = 160
    endpos_row   = 40
    startpos_col = 1
    startpos_row = 1
    titletext    = 'Titel'
  tables
    valuetab     = itab " darf nur eine Spalte beinhalten 
  EXCEPTIONS
    break_off    = 1
    OTHERS       = 2.
IF sy-subrc = 0.

ENDIF.

[ABAP] Auswahl-PopUp-Fenster anzeigen

DATA: it_sel TYPE STANDARD TABLE OF spopli.

it_sel = VALUE #( ( inactive = '' selflag = ' ' varoption = 'Auswahl 1' )
                  ( inactive = '' selflag = 'X' varoption = 'Auswahl 2' )
                  ( inactive = 'X' selflag = ' ' varoption = 'Auswahl 3' )
                  ( inactive = '' selflag = 'Y' varoption = 'Auswahl 4' ) ).

CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
  EXPORTING
    i_title               = 'Bitte Einträge markieren!'
    i_selection           = abap_true
    i_zebra               = abap_true
    i_screen_start_column = 1
    i_screen_start_line   = 1
    i_screen_end_column   = 80
    i_screen_end_line     = 10
    i_checkbox_fieldname  = 'SELFLAG'
    i_tabname             = 'IT_SEL'   " wird im Zusammenhang mit dem Strukturnamen zur Erzeugung des internen Feldkatalogs gebraucht
    i_structure_name      = 'SPOPLI'   " wenn Struktur übergeben, erzeugt der FB selber einen Feldkatalog
  TABLES
    t_outtab              = it_sel
  EXCEPTIONS
    program_error         = 1
    OTHERS                = 2.

IF sy-subrc = 0.
  LOOP AT it_sel ASSIGNING FIELD-SYMBOL(<fs_sel>) WHERE selflag = abap_true.
    WRITE: / <fs_sel>-varoption.
  ENDLOOP.
ENDIF.