Zum Inhalt springen
Die Codezentrale
Programmierung, Tipps, Tricks, Snippets, Links (.Net, Java, JavaScript, C++, PHP, Python, SQL, SAP, ABAP, SAPUI5)
Zum Inhalt springen
  • Home
  • Links
    • Kachelmannwetter
    • MrLeehs Blog
    • Deskmodder
    • winfuture.de
    • Tricktresor
    • Python Online Compiler
    • [Raspberry Pi] Wichtige Terminal-Kommandos für Raspian
    • CodeSandbox JS Vanilla
  • Datenschutzerklärung
  • Impressum
Start Beiträge verschlagwortet mit "cl_salv_controller_metadata"

Schlagwort: cl_salv_controller_metadata

[ABAP] ALV-Grid: Einfaches Beispiel zur Anzeige von Daten in einem ALV-Grid (cl_gui_alv_grid)

START-OF-SELECTION.
* Daten holen
  SELECT *
    INTO TABLE @DATA(it_spfli)
    FROM spfli
    WHERE carrid = 'LH'.

* ALV-Gitter-Objekt erzeugen
  DATA(o_alv) = NEW cl_gui_alv_grid( i_parent      = cl_gui_container=>default_screen " in default container einbetten
                                     i_appl_events = abap_true ).                     " Ereignisse als Applikationsevents registrieren

* Feldkatalog automatisch durch SALV-Objekte erstellen lassen
  DATA: o_salv TYPE REF TO cl_salv_table.

  cl_salv_table=>factory( IMPORTING
                            r_salv_table = o_salv
                          CHANGING
                            t_table      = it_spfli ).

  DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                     r_aggregations = o_salv->get_aggregations( ) ).

* Layout des ALV setzen
  DATA(lv_layout) = VALUE lvc_s_layo( zebra      = abap_true             " ALV-Control: Alternierende Zeilenfarbe (Zebramuster)
                                      cwidth_opt = 'A'                   " ALV-Control: Spaltenbreite optimieren
                                      grid_title = 'Flugverbindungen' ). " ALV-Control: Text der Titelzeile

* ALV anzeigen
  o_alv->set_table_for_first_display( EXPORTING
                                        i_bypassing_buffer = abap_false  " Puffer ausschalten
                                        i_save             = 'A'         " Anzeigevariante sichern
                                        is_layout          = lv_layout   " Layout
                                      CHANGING
                                        it_fieldcatalog    = it_fcat     " Feldkatalog
                                        it_outtab          = it_spfli ). " Ausgabetabelle

* Focus auf ALV setzen
  cl_gui_alv_grid=>set_focus( control = o_alv ).

* leere SAP-Toolbar ausblenden
  cl_abap_list_layout=>suppress_toolbar( ).

* erzwingen von cl_gui_container=>default_screen
  WRITE: space.
admin 11. Juni 2019 11. Juni 2019ALV ABAP, cl_abap_list_layout, cl_gui_alv_grid, cl_gui_container, cl_salv_controller_metadata, cl_salv_table, default_screen, get_aggregations, get_columns, get_lvc_fieldcatalog, lvc_s_layo, set_focus, set_table_for_first_display, suppress_toolbar

[ABAP] Interne Tabellen mittels SALV-Klassen als MS Excel-Dateien (*.xlsx, *.xml) speichern

Variante 1 (to_xml)

DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* itab (data) -> xstring (bytes)
  DATA(lv_xml_bytes) = o_salv->to_xml( xml_type = if_salv_bs_xml=>c_type_xlsx ).

* xstring -> itab (bytes)
  DATA: lv_size TYPE i.
  DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
  cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                    im_xstring = lv_xml_bytes
                                  IMPORTING
                                    ex_size    = lv_size
                                    ex_xtab    = it_raw_data ).

  IF lines( it_raw_data ) > 0.
    DATA: lv_action TYPE i.
    DATA: lv_filename TYPE string.
    DATA: lv_fullpath TYPE string.
    DATA: lv_path TYPE string.

    TRY.
* SaveDialog aufrufen
        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_extension   = 'xlsx'
                                                      default_file_name   = 'export.xlsx'
                                                      file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                      prompt_on_overwrite = abap_true
                                                    CHANGING
                                                      filename            = lv_filename
                                                      path                = lv_path
                                                      fullpath            = lv_fullpath
                                                      user_action         = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename                  = lv_fullpath
                                                    filetype                  = 'BIN'
                                                    bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                  CHANGING
                                                    data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
          cl_gui_frontend_services=>execute( application = 'excel.exe'
                                             parameter   = |"{ lv_fullpath }"| ).
        ENDIF.

      CATCH cx_root INTO DATA(e_txt).
        MESSAGE e_txt->get_text( ) TYPE 'S'.
    ENDTRY.
  ENDIF.

Variante 2 (cl_salv_bs_ex_office2007)

* produziert defekte *.xlsx-Datei
DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* Version prüfen
  IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
     cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.


* MVC-Feldkatalog erzeugen
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* CL_SALV_EX_RESULT_DATA_TABLE erzeugen
    DATA(o_salv_ex_res) = cl_salv_ex_util=>factory_result_data_table( r_data                 = REF #( it_spfli )
                                                                      t_fieldcatalog         = it_fcat ).

* CL_SALV_EX_RESULT_DATA_TABLE -> XML (Bytes)
    DATA(o_excel2007) = NEW cl_salv_bs_ex_office2007( o_salv_ex_res ).

    IF o_excel2007 IS BOUND.
      DATA(lv_xml_bytes) = o_excel2007->transform( ).

* xstring -> itab (bytes)
      DATA: lv_size TYPE i.
      DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
      cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                        im_xstring = lv_xml_bytes
                                      IMPORTING
                                        ex_size    = lv_size
                                        ex_xtab    = it_raw_data ).

      IF lines( it_raw_data ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

        TRY.
* SaveDialog aufrufen
            cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                          default_extension   = 'xlsx'
                                                          default_file_name   = 'export.xlsx'
                                                          file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                          prompt_on_overwrite = abap_true
                                                        CHANGING
                                                          filename            = lv_filename
                                                          path                = lv_path
                                                          fullpath            = lv_fullpath
                                                          user_action         = lv_action ).

            IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
              cl_gui_frontend_services=>gui_download( EXPORTING
                                                        filename                  = lv_fullpath
                                                        filetype                  = 'BIN'
                                                        bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                      CHANGING
                                                        data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
              cl_gui_frontend_services=>execute( application = 'excel.exe'
                                                 parameter   = |"{ lv_fullpath }"| ).

            ENDIF.

          CATCH cx_root INTO DATA(e_txt).
            MESSAGE e_txt->get_text( ) TYPE 'S'.
        ENDTRY.
      ENDIF.
    ENDIF.
  ENDIF.

Variante 3 (CL_SALV_BS_TT_UTIL)

* produziert defekte *.xlsx-Datei
DATA: it_spfli TYPE STANDARD TABLE OF spfli.
DATA: o_salv TYPE REF TO cl_salv_table.

START-OF-SELECTION.

* Daten holen
  SELECT * FROM spfli INTO TABLE @it_spfli.

* ALV-objekt erzeugen
  cl_salv_table=>factory( IMPORTING
                            r_salv_table   = o_salv
                          CHANGING
                            t_table        = it_spfli ).

* Version prüfen
  IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
     cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.


* MVC-Feldkatalog erzeugen
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* SALV-Result-Table erzeugen
    DATA(r_result_data) = cl_salv_ex_util=>factory_result_data_table( r_data         = REF #( it_spfli )
                                                                      t_fieldcatalog = it_fcat ).


    DATA: lv_xml_bytes TYPE xstring.

* SALV-Result-Table
    cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform( EXPORTING
                                                        xml_type      = if_salv_bs_xml=>c_type_xlsx
                                                        xml_version   = cl_salv_bs_a_xml_base=>get_version( )
                                                        r_result_data = r_result_data
                                                        xml_flavour   = if_salv_bs_c_tt=>c_tt_xml_flavour_export
                                                        gui_type      = if_salv_bs_xml=>c_gui_type_gui
                                                      IMPORTING
                                                        xml           = lv_xml_bytes ).

* xstring -> itab (bytes)
    DATA: lv_size TYPE i.
    DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
    cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                      im_xstring = lv_xml_bytes
                                    IMPORTING
                                      ex_size    = lv_size
                                      ex_xtab    = it_raw_data ).

    IF lines( it_raw_data ) > 0.
      DATA: lv_action TYPE i.
      DATA: lv_filename TYPE string.
      DATA: lv_fullpath TYPE string.
      DATA: lv_path TYPE string.

      TRY.
* SaveDialog aufrufen
          cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                        default_extension   = 'xlsx'
                                                        default_file_name   = 'export.xlsx'
                                                        file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                        prompt_on_overwrite = abap_true
                                                      CHANGING
                                                        filename            = lv_filename
                                                        path                = lv_path
                                                        fullpath            = lv_fullpath
                                                        user_action         = lv_action ).

          IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
            cl_gui_frontend_services=>gui_download( EXPORTING
                                                      filename                  = lv_fullpath
                                                      filetype                  = 'BIN'
                                                      bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                    CHANGING
                                                      data_tab                  = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
            cl_gui_frontend_services=>execute( application = 'excel.exe'
                                               parameter   = |"{ lv_fullpath }"| ).
          ENDIF.

        CATCH cx_root INTO DATA(e_txt).
          MESSAGE e_txt->get_text( ) TYPE 'S'.
      ENDTRY.
    ENDIF.
  ENDIF.

Variante 4 (CL_SALV_BS_LEX)

DATA: it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.

SELECT * FROM spfli INTO TABLE @it_spfli.

TRY.
    DATA: o_salv TYPE REF TO cl_salv_table.

* SALV-Objekt erzeugen
    cl_salv_table=>factory( IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_spfli ).

* Feldkatalog erstellen
    DATA(o_cols) = o_salv->get_columns( ).
    DATA(o_aggr) = o_salv->get_aggregations( ).
    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_cols
                                                                       r_aggregations = o_aggr ).

* CL_SALV_EX_RESULT_DATA_TABLE erzeugen
    DATA(o_salv_ex_res) = cl_salv_ex_util=>factory_result_data_table( r_data          = REF #( it_spfli )
                                                                      t_fieldcatalog  = it_fcat ).

    DATA: lv_xml_bytes TYPE xstring.
* CL_SALV_EX_RESULT_DATA_TABLE -> XML (Bytes)
* für CSV: is_format = if_salv_bs_lex_format=>mc_format_csv
    cl_salv_bs_lex=>export_from_result_data_table( EXPORTING
                                                     is_format            = if_salv_bs_lex_format=>mc_format_xlsx
                                                     ir_result_data_table = o_salv_ex_res
                                                   IMPORTING
                                                     er_result_file       = lv_xml_bytes ).

* wenn Byte-Daten vorhanden
    IF xstrlen( lv_xml_bytes ) > 0.
      DATA: lv_size TYPE i.
      DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
      cl_scp_change_db=>xstr_to_xtab( EXPORTING
                                        im_xstring = lv_xml_bytes
                                      IMPORTING
                                        ex_size    = lv_size
                                        ex_xtab    = it_raw_data ).

      IF lines( it_raw_data ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_extension   = 'xlsx'
                                                      default_file_name   = 'export.xlsx'
                                                      file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                      prompt_on_overwrite = abap_true
                                                    CHANGING
                                                      filename            = lv_filename
                                                      path                = lv_path
                                                      fullpath            = lv_fullpath
                                                      user_action         = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename                  = lv_fullpath
                                                    filetype                  = 'BIN'
                                                    bin_filesize              = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                  CHANGING
                                                    data_tab                  = it_raw_data ).
        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    MESSAGE e_txt->get_text( ) TYPE 'S'.
ENDTRY.

Variante 5 (EDX_UTIL)

TRY.
    SELECT *
      INTO TABLE @DATA(it_t001)
      FROM mara
      UP TO 100 ROWS.

    IF sy-subrc = 0.
      DATA: lv_xstr TYPE xstring.

* Creates XLS fom the ITAB
      edx_util=>create_xls_from_itab( EXPORTING i_xlsx    = abap_true
                                      IMPORTING e_xstring = lv_xstr
                                      CHANGING  ct_data   = it_t001 ).

      IF xstrlen( lv_xstr ) > 0.
        DATA: lv_action TYPE i.
        DATA: lv_filename TYPE string.
        DATA: lv_fullpath TYPE string.
        DATA: lv_path TYPE string.

* Save-Dialog
        cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                      default_file_name = 'Excel.xlsx'
                                                      default_extension = 'xlsx'
                                                      file_filter       = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                    CHANGING
                                                      filename          = lv_filename
                                                      path              = lv_path
                                                      fullpath          = lv_fullpath
                                                      user_action       = lv_action ).

        IF lv_action EQ cl_gui_frontend_services=>action_ok.
* XSTRING -> SOLIX (RAW)
          DATA(it_raw_data) = cl_bcs_convert=>xstring_to_solix( EXPORTING iv_xstring = lv_xstr ).

* Datei lokal speichern
          cl_gui_frontend_services=>gui_download( EXPORTING
                                                    filename     = lv_fullpath
                                                    filetype     = 'BIN'
                                                    bin_filesize = xstrlen( lv_xstr )
                                                  CHANGING
                                                    data_tab     = it_raw_data ).


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

Links

  • http://abapblog.com/articles/tricks/33-create-xlsx-mhtml-file-from-internal-table-in-background
  • http://abapblog.com/articles/tricks/120-create-xlsx-file-from-internal-table-in-background-v2
  • https://blogs.sap.com/2014/02/15/how-to-extract-formatted-output-as-an-excel-document-using-salv-in-the-background/
  • https://blogs.sap.com/2013/03/04/simple-program-to-download-excel-in-mhtml-format-from-internal-table/
admin 7. Juli 2017 6. April 2020Export, Interne Tabellen, SALV, XML ABAP, cl_bcs_convert, cl_gui_frontend_services, cl_salv_bs_ex_office2007, cl_salv_bs_lex, cl_salv_bs_tt_util, cl_salv_controller_metadata, CL_SALV_EX_RESULT_DATA_TABLE, cl_salv_ex_util, cl_salv_table, cl_scp_change_db, create_xls_from_itab, c_type_excel_xml, c_type_xlsx, edx_util, execute, export_from_result_data_table, factory_result_data_table, file_save_dialog, get_lvc_fieldcatalog, gui_download, if_salv_bs_lex_format, if_salv_bs_tt_util, if_salv_bs_xml, mc_format_csv, mc_format_xlsx, SALV, to_xml, transform, XLSX, XML, xstring, xstring_to_solix, xstr_to_xtab

[ABAP] ALV-Grid: Im Selektionsbild anzeigen, Datenausgabe in editierbarem ALV-Grid darstellen, Standard-Button „Refresh“ abfangen, kein zusätzliches Dynpro

**********************************************************************
*
* Variablen
*
**********************************************************************
DATA: gv_screen_status TYPE string VALUE 'INIT'.
DATA: gv_carrid   TYPE spfli-carrid.
DATA: gv_connid TYPE spfli-connid.
DATA: o_alv TYPE REF TO cl_gui_alv_grid.
DATA: it_spfli TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY.
**********************************************************************
*
* leeres Dynpro als Dummy für ALV-Grid
*
**********************************************************************
SELECTION-SCREEN BEGIN OF SCREEN 2000.
SELECTION-SCREEN END OF SCREEN 2000.
**********************************************************************
*
* SELECTION-SCREEN
*
**********************************************************************
SELECT-OPTIONS: so_carr FOR gv_carrid.
SELECT-OPTIONS: so_conn FOR gv_connid.
**********************************************************************
*
* Eventhandler
*
**********************************************************************
CLASS lcl_events DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS:
      on_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING
            e_object
            e_interactive
            sender.

    CLASS-METHODS:
      on_user_command FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING
            e_ucomm
            sender.

    CLASS-METHODS:
      on_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING
            er_data_changed
            sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.

  METHOD on_data_changed.
* geänderte Zellen durchgehen
    LOOP AT er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<c>).
      IF <c> IS ASSIGNED.
* Zeile x aus der iTab it_spfli rausholen und daraus die Zelle anhand des Spaltennamens (Feldnamens) holen
        ASSIGN COMPONENT <c>-fieldname OF STRUCTURE it_spfli[ <c>-row_id ] TO FIELD-SYMBOL(<f>).

        IF <f> IS ASSIGNED.
* Änderungswert in die Zelle der iTab (it_spfli) rückschreiben
          <f> = <c>-value.
        ENDIF.
      ENDIF.

    ENDLOOP.

* DB Update
    FIELD-SYMBOLS: <tab> TYPE table.
    FIELD-SYMBOLS: <row> TYPE spfli.

    ASSIGN er_data_changed->mp_mod_rows->* TO <tab>.

    LOOP AT <tab> ASSIGNING <row>.
* DB Update hier
    ENDLOOP.

  ENDMETHOD.

  METHOD on_user_command.
* wenn BTN_REFRESH geklickt
    IF e_ucomm = 'BTN_REFRESH'.
      IF o_alv IS BOUND.
        SELECT * FROM spfli INTO TABLE @it_spfli
          WHERE carrid IN @so_carr
            AND connid IN @so_conn.

        sender->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = abap_true
                                                                     col = abap_true )
                                       i_soft_refresh = abap_false ).
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD on_toolbar.
* alle Buttons entfernen, bis auf folgende:
    DELETE e_object->mt_toolbar WHERE
        function NE cl_gui_alv_grid=>mc_fc_refresh          " Refresh
    AND function NE cl_gui_alv_grid=>mc_mb_export           " Excel
    AND function NE cl_gui_alv_grid=>mc_fc_current_variant. " Layout

    LOOP AT e_object->mt_toolbar ASSIGNING FIELD-SYMBOL(<fs_button>) WHERE ( function = cl_gui_alv_grid=>mc_fc_refresh ).
* neues USER-Command setzen, damit bei Button-Klick on_user_command getriggert wird
      <fs_button>-function = 'BTN_REFRESH'.
    ENDLOOP.

  ENDMETHOD.
ENDCLASS.
**********************************************************************
*
* INITIALIZATION
*
**********************************************************************
INITIALIZATION.

* Vorbelegungen für Selektionsbild
  so_carr[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'LH' ) ).

**********************************************************************
*
* AT SELECTION-SCREEN OUTPUT
*
**********************************************************************
AT SELECTION-SCREEN OUTPUT.

* Wenn vorher das Selektionsbild 1000 angezeigt wurde
  IF gv_screen_status = 'IN_SELECTION'.
* Daten holen
    SELECT * FROM spfli INTO TABLE @it_spfli
       WHERE carrid IN @so_carr
         AND connid IN @so_conn.
* ALV-Gitter anzeigen
    o_alv = NEW #( i_parent      = cl_gui_container=>default_screen
                   i_appl_events = abap_true ).

* Eventhandler registrieren
    SET HANDLER lcl_events=>on_toolbar FOR o_alv.
    SET HANDLER lcl_events=>on_data_changed FOR o_alv.
    SET HANDLER lcl_events=>on_user_command FOR o_alv.

* Ereignisse registrieren
    o_alv->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_enter ).
    o_alv->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_modified ).

* ALV-Grid selektionsbereit setzen
    o_alv->set_ready_for_input( i_ready_for_input = 1 ).

* Layout des ALV setzen
    DATA(lv_layout) = VALUE lvc_s_layo( zebra      = abap_true
                                        cwidth_opt = 'A'
                                        grid_title = 'Flugverbindungen' ).

* Feldkatalog automatisch durch SALV erstellen lassen
    DATA: o_salv TYPE REF TO cl_salv_table.

    cl_salv_table=>factory( IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_spfli ).

    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns      = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* im Feldkatalog alle Zellen der Spalte "CITYFROM" des ALV-Grids auf
* editierbar stellen, die restlichen Zellen sind nicht editierbar
    LOOP AT it_fcat ASSIGNING FIELD-SYMBOL(<fcat>).
      CASE <fcat>-fieldname.
        WHEN 'CITYFROM'.
          <fcat>-edit = abap_true.
        WHEN OTHERS.
          <fcat>-edit = abap_false.
      ENDCASE.
    ENDLOOP.

* ALV anzeigen
    o_alv->set_table_for_first_display( EXPORTING
                                          i_bypassing_buffer = abap_false
                                          i_save             = 'A'
                                          is_layout          = lv_layout
                                        CHANGING
                                          it_fieldcatalog    = it_fcat
                                          it_outtab          = it_spfli ).

* Drucktastenleiste: Button "Ausführen (F8)" entfernen
    DATA: it_exclude_btn TYPE STANDARD TABLE OF rsexfcode WITH DEFAULT KEY.
    it_exclude_btn = VALUE #( ( fcode = 'ONLI' ) ).

    CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
      EXPORTING
        p_status  = '%_00' " akt. Standard-PF-Status des Dypro 2000
      TABLES
        p_exclude = it_exclude_btn.

* leere SAP-Toolbar ausblenden
    cl_abap_list_layout=>suppress_toolbar( ).

* Focus auf ALV setzen
    cl_gui_alv_grid=>set_focus( control = o_alv ).

* Flag für Screen-Status auf ALV-Anzeige setzen
    gv_screen_status = 'IN_ALV'.
  ENDIF.
**********************************************************************
*
* START-OF-SELECTION
*
**********************************************************************
START-OF-SELECTION.

* Wir befinden uns im Anzeigebereich des Selektionsbildes
  gv_screen_status = 'IN_SELECTION'.

* Trick: leeren Dummy-Screen 2000 anzeigen und intern für das ALV-Grid in
* AT SELECTION-SCREEN OUTPUT als cl_gui_container=>default_screen nutzen
  CALL SELECTION-SCREEN 2000.
admin 13. Juni 2017 31. Januar 2019ALV ABAP, CALL SELECTION-SCREEN 2000, cl_gui_alv_grid, cl_gui_container, cl_salv_controller_metadata, cl_salv_table, data_changed, er_data_changed, get_aggregations, get_columns, get_lvc_fieldcatalog, lvc_s_layo, lvc_s_stbl, mc_evt_enter, mc_evt_modified, mc_fc_current_variant, mc_fc_refresh, mc_mb_export, mp_mod_rows, mt_good_cells, mt_toolbar, refresh_table_display, SELECT-OPTIONS, set_ready_for_input, set_table_for_first_display, toolbar, user_command

[ABAP] Interne Tabelle in einem ALV-Grid anzeigen, Spalten ausblenden

DATA: it_spfli TYPE STANDARD TABLE OF spfli.

DATA: o_dock TYPE REF TO cl_gui_docking_container.
DATA: o_alv TYPE REF TO cl_gui_alv_grid.

PARAMETERS: p_carr TYPE spfli-carrid DEFAULT '%'.

INITIALIZATION.
* Container und ALV-Grid erzeugen
  IF NOT o_dock IS BOUND.

* Container für ALV-Grid erzeugen
    o_dock = NEW #( side  = cl_gui_docking_container=>dock_at_bottom
                    ratio = 80 ).

* Feldkatalog automatisch erstellen lassen
    DATA: o_salv TYPE REF TO cl_salv_table.

    cl_salv_table=>factory( IMPORTING
                              r_salv_table = o_salv
                            CHANGING
                              t_table      = it_spfli ).

    DATA(it_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = o_salv->get_columns( )
                                                                       r_aggregations = o_salv->get_aggregations( ) ).

* Spalten/Zell-Eigenschaften (Anzeige, F4-Hilfe, Edit ...) des Feldkatalogs setzen
    LOOP AT it_fcat ASSIGNING FIELD-SYMBOL(<fs_fcat>).
      CASE <fs_fcat>-fieldname.
        WHEN 'MANDT'.
          <fs_fcat>-no_out = abap_true.     " ausblenden
      ENDCASE.
    ENDLOOP.

* ALV-Grid erzeugen
    o_alv = NEW #( i_parent      = o_dock
                   i_appl_events = abap_true ).

* ALV-Grid initialisieren
    DATA(lv_layout) = VALUE lvc_s_layo( grid_title = 'Flugverbindungen' " Titel
                                        no_toolbar = abap_false         " Toolbar sichtbar
                                        smalltitle = abap_false         " große Überschrift
                                        zebra      = abap_true          " Zebrastreifen
                                        cwidth_opt = abap_true ).       " Spaltenbreiten optimieren

    o_alv->set_table_for_first_display( EXPORTING
                                          is_layout            = lv_layout
                                          i_bypassing_buffer   = abap_false
                                        CHANGING
                                          it_fieldcatalog      = it_fcat
                                          it_outtab            = it_spfli ).
  ENDIF.

AT SELECTION-SCREEN OUTPUT.

  IF o_alv IS BOUND.
* SELECT mit LIKE, für % als Wildcard
    SELECT * FROM spfli
      INTO TABLE @it_spfli
      WHERE carrid LIKE @p_carr.

* Inhalt neu darstellen
    o_alv->refresh_table_display( ).

* Spaltenbreiten erneut optimieren
    DATA: lv_ucomm  TYPE sy-ucomm VALUE '&OPT'.
    o_alv->set_function_code( CHANGING
                                c_ucomm = lv_ucomm ).
  ENDIF.
admin 13. Dezember 2016 12. Juni 2024ALV %, ABAP, cl_gui_alv_grid, cl_gui_docking_container, cl_salv_controller_metadata, cl_salv_table, dock_at_bottom, get_aggregations, get_columns, get_lvc_fieldcatalog, LIKE, lvc_s_layo, refresh_table_display, SELECT, set_function_code, set_table_for_first_display, wildcard

[ABAP] Feldkatalog (LVC / SLIS) aus Dictionary-Struktur oder interner Tabelle erstellen

Variante 1 (cl_salv_controller_metadata)

DATA: o_alv TYPE REF TO cl_salv_table.
  
...

DATA(o_fcat_lvc) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = o_alv->get_columns( )
                                                                      r_aggregations = o_alv->get_aggregations( ) ).
                                                                      
DATA(o_fcat_slis) = cl_salv_controller_metadata=>get_slis_fieldcatalog( r_columns = o_alv->get_columns( )
                                                                        r_aggregations = o_alv->get_aggregations( ) ).

Variante 2 (FuBa, obsolet)

DATA : it_fcat_lvc TYPE lvc_t_fcat.

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name = 'SPFLI' " Dictionary-Struktur
  CHANGING
    ct_fieldcat      = it_fcat_lvc.

DATA: it_fcat_slis TYPE slis_t_fieldcat_alv.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_structure_name = 'SPFLI' " Dictionary-Struktur
  CHANGING
    ct_fieldcat      = it_fcat_slis.

Links

  • https://help.sap.com/saphelp_erp2005/helpdata/en/ff/4649a6f17411d2b486006094192fe3/content.htm?no_cache=true
  • https://codezentrale.de/abap-feldkatalog-aus-tabellendefinition-erstellen/
admin 12. November 2016 8. Mai 2025Funktionsbausteine, Interne Tabellen ABAP, cl_salv_controller_metadata, get_lvc_fieldcatalog, get_slis_fieldcatalog, LVC_FIELDCATALOG_MERGE
  • Kategorien

    aufklappen | zuklappen
  • Neueste Beiträge

    • [ABAP] User-Logondaten lesen
    • [ABAP] Prüfen, ob ein Druckername gültig ist
    • [ABAP] SALV: Druckausgabe eines SALV-Gitters in SAP-Spool (SP01)
    • KI-Software
    • [ABAP] SALV: Cell-Merging beim Sortieren der Spalten unterdrücken
    • Kartoffelsalat
    • [CDS-Views] SAP-Standard CDS Views suchen
    • [ABAP] Statuswerte zu einem IH-Auftrag lesen
    • [ABAP] Gantt-Chart anzeigen
    • [ABAP] SAPscript-Texte: Clusterdaten ohne READ_TEXT direkt aus Tabelle STXL lesen
  • Archiv

  • Meta

    • Anmelden
    • Feed der Einträge
    • Kommentar-Feed
    • WordPress.org
  • Related Posts

    • [ABAP] ALV-Grid: Dropdown-Liste verwenden
    • [ABAP] ALV-Grid: Im Selektionsbild anzeigen, Datenausgabe in editierbarem ALV-Grid darstellen, Standard-Button „Refresh“ abfangen, kein zusätzliches Dynpro
    • [ABAP] Interne Tabelle in einem ALV-Grid anzeigen, Spalten ausblenden
    • [ABAP] ALV-Grid ohne Dynpro – Daten anzeigen, editieren und als CSV-Datei speichern
    • [ABAP] Zwei SALV-Grids in einem Splittercontainer anzeigen
    • [ABAP] GUI-Toolbar mit statischem Context-Menü, Eventhandling
    • [ABAP] GUI-Toolbar mit dynamischen Context-Menü, Eventhandling, Umschaltung checked-state
    • [ABAP] SALV-Table: Eigenen Button einfügen und Ereignis abfangen
    • [ABAP] GUI-Simple-Tree und SALV-Grid in Split-Container ohne Dynpro anzeigen, Eventhandling
    • [ABAP] SALV-Table: Anzeige in einem DockingContainer, Einfügen von Buttons und Eventhandling
  • Tags

    ABAP (991) Android (16) CLASS (20) cl_abap_list_layout (19) cl_bcs_convert (29) cl_gui_alv_grid (24) cl_gui_container (39) cl_gui_docking_container (25) cl_gui_frontend_services (50) cl_salv_table (60) cntl_simple_event (16) create (27) Date (16) default_screen (28) display (14) EWM (17) Fiori (23) FREE OBJECT (15) get_columns (22) gui_download (15) HTML (16) JavaScript (78) JSON (23) MIME (17) NEW (20) OData (33) ole2_object (15) OpenSQL (44) Python (23) Raspberry Pi (50) Raspberry Pi 2 (27) Raspberry Pi 4 (23) Raspian (22) RegEx (18) SAP (355) SAPUI5 (27) SELECT (25) String (33) stringtab (15) suppress_toolbar (19) UTF-8 (15) Value (27) XML (29) xstring (20) xstring_to_solix (15)
(W) 2026 by codezentrale.de
Präsentiert von Tempera & WordPress.