martedì 5 settembre 2017

Salvare una tabella interna in un file XLSX in background

*----------------------------------------------------------------------*
* DECLARATIONS                                                         *
*----------------------------------------------------------------------*
DATA gt_spfli TYPE STANDARD TABLE OF spfli.

*----------------------------------------------------------------------*
* LAYOUT                                                               *
*----------------------------------------------------------------------*
PARAMETERS: pa_file(255) TYPE c LOWER CASE.

*----------------------------------------------------------------------*
* PROGRAM BODY                                                         *
*----------------------------------------------------------------------*
START-OF-SELECTION.

  SELECT *
    FROM spfli
    INTO TABLE gt_spfli.

END-OF-SELECTION.
  PERFORM export_xlsx.

*----------------------------------------------------------------------*
* FORM EXPORT_XLSX                                                     *
*----------------------------------------------------------------------*
FORM export_xlsx.

*dichiarazioni
  DATA: lt_fcat        TYPE lvc_t_fcat,
        lt_data        TYPE REF TO data,
        lv_flavour     TYPE string,
        lv_version     TYPE string,
        lo_result_data TYPE REF TO cl_salv_ex_result_data_table,
        lo_columns     TYPE REF TO cl_salv_columns_table,
        lo_aggreg      TYPE REF TO cl_salv_aggregations,
        lo_salv_table  TYPE REF TO cl_salv_table,
        lv_file_type   TYPE salv_bs_constant,
        ls_layout      TYPE lvc_s_layo,
        lt_sort        TYPE lvc_t_sort,
        lt_filt        TYPE lvc_t_filt,
        lv_xstring     TYPE xstring,
        lv_size        TYPE i,
        lt_bintab      TYPE solix_tab,
        lv_path        TYPE string.
  FIELD-SYMBOLS: <lf_tab> TYPE ANY TABLE.
*alv semplice
  GET REFERENCE OF gt_spfli INTO lt_data.
  ASSIGN lt_data->* TO <lf_tab>.
  TRY .
      cl_salv_table=>factory(
      EXPORTING
        list_display = abap_false
      IMPORTING
        r_salv_table = lo_salv_table
      CHANGING
        t_table      = <lf_tab> ).
    CATCH cx_salv_msg.
  ENDTRY.
*colonne, aggregati e fieldcatalog
  lo_columns = lo_salv_table->get_columns( ).
  lo_aggreg  = lo_salv_table->get_aggregations( ).
  lt_fcat    = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
                           r_columns      = lo_columns
                           r_aggregations = lo_aggreg ).
  IF cl_salv_bs_a_xml_base=>get_version( ) = if_salv_bs_xml=>version_25
  OR cl_salv_bs_a_xml_base=>get_version( ) = if_salv_bs_xml=>version_26.
*genera i dati dal modello
    lo_result_data = cl_salv_ex_util=>factory_result_data_table(
      r_data         = lt_data
      s_layout       = ls_layout
      t_fieldcatalog = lt_fcat
      t_sort         = lt_sort
      t_filter       = lt_filt ).
*impostazioni varie
    CASE cl_salv_bs_a_xml_base=>get_version( ).
      WHEN if_salv_bs_xml=>version_25.
        lv_version = if_salv_bs_xml=>version_25.
      WHEN if_salv_bs_xml=>version_26.
        lv_version = if_salv_bs_xml=>version_26.
    ENDCASE.
    lv_file_type = if_salv_bs_xml=>c_type_xlsx.
    lv_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.
*trasformazione dei dati in Excel
    cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
      EXPORTING
        xml_type      = lv_file_type
        xml_version   = lv_version
        r_result_data = lo_result_data
        xml_flavour   = lv_flavour
        gui_type      = if_salv_bs_xml=>c_gui_type_gui
      IMPORTING
        xml           = lv_xstring ).
  ENDIF.
  IF lv_xstring IS NOT INITIAL.
*conversione in binario
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = lv_xstring
      IMPORTING
        output_length = lv_size
      TABLES
        binary_tab    = lt_bintab.
*salvataggio del file xlsx
    OPEN DATASET pa_file FOR OUTPUT IN BINARY MODE.
    CHECK sy-subrc = 0.
    TRANSFER lv_xstring TO pa_file.
    CLOSE DATASET pa_file.
  ENDIF.

ENDFORM.

*----------------------------------------------------------------------*

Nessun commento: