SAP ABAP FRONTEND

From SapWiki
Revision as of 17:06, 22 June 2026 by WikiSysop (talk | contribs)

CL_GUI_FRONTEND_SERVICES

* OBTIENE PATH de "Mis Documentos"
CALL METHOD cl_gui_frontend_services=>get_upload_download_path
 CHANGING
   upload_path                 = ld_dir_u
   download_path               = ld_dir_d
 EXCEPTIONS
   CNTL_ERROR                  = 1
   ERROR_NO_GUI                = 2
   NOT_SUPPORTED_BY_GUI        = 3
   GUI_UPLOAD_DOWNLOAD_PATH    = 4
   UPLOAD_DOWNLOAD_PATH_FAILED = 5
   others                      = 6
       .

* Download File
call method cl_gui_frontend_services=>gui_download
  exporting
    filename                = tmpfilename
  changing
    data_tab                = it_logfile
  exceptions
    file_write_error        = 1
    no_batch                = 2
    gui_refuse_filetransfer = 3
    invalid_type            = 4
    no_authority            = 5
    unknown_error           = 6
    header_not_allowed      = 7
    separator_not_allowed   = 8
    filesize_not_allowed    = 9
    header_too_long         = 10
    dp_error_create         = 11
    dp_error_send           = 12
    dp_error_write          = 13
    unknown_dp_error        = 14
    access_denied           = 15
    dp_out_of_memory        = 16
    disk_full               = 17
    dp_timeout              = 18
    file_not_found          = 19
    dataprovider_exception  = 20
    control_flush_error     = 21
    not_supported_by_gui    = 22
    error_no_gui            = 23
    others                  = 24.
if sy-subrc <> 0.
  message id sy-msgid type sy-msgty number sy-msgno
             with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

Bajar tabla en formato CSV (función hr_cl_if_prvd_generate_file)

Ejemplo 1

FUNCTION hr_cl_if_prvd_generate_file.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      IT_DATA TYPE  STANDARD TABLE
*"----------------------------------------------------------------------
  FIELD-SYMBOLS: <f_source>.

  TYPES data_c(4096) TYPE c.
  TYPES t_data_c TYPE data_c OCCURS 0.

  CONSTANTS: c_field_separator TYPE c VALUE ';',
             c_darl_number(12)     TYPE c VALUE '1234567890 '.

  DATA: lt_data_csv      TYPE t_data_c,
        l_struc_index    TYPE syindex,
        l_len_string     TYPE i,
        l_max_field      TYPE data_c,
        l_struc_raw_data TYPE data_c,
        l_start_string   TYPE i,
        l_len_field_sep  TYPE i,
        l_type,
        l_date_extern(30) TYPE c,
        l_help_id LIKE tline-tdline,
        l_tabix TYPE sytabix.

  l_len_field_sep = STRLEN( c_field_separator ).

  LOOP AT it_data.
    CLEAR: l_struc_index, l_len_string, l_struc_raw_data, l_start_string.
    DO.
      ADD 1 TO l_struc_index.
      CLEAR l_len_string.
      ASSIGN COMPONENT l_struc_index OF STRUCTURE it_data TO <f_source>.
      IF sy-subrc <> '0'.
        EXIT.
      ELSE.
*         *       special processing when field is type data
        DESCRIBE FIELD <f_source> TYPE l_type.
        CASE l_type.
          WHEN 'P'.
            WRITE <f_source> TO l_date_extern.
            CATCH SYSTEM-EXCEPTIONS conversion_errors  = 4.
              IF sy-subrc <> '0'.
                MESSAGE e899(ux) WITH l_type <f_source> l_help_id
                                      l_tabix RAISING conversion_failed.
              ENDIF.
            ENDCATCH.
            ASSIGN l_date_extern TO <f_source>.
          WHEN 'X'.
            ASSIGN COMPONENT l_struc_index OF
                    STRUCTURE it_data TO <f_source> TYPE 'C'.
            WRITE <f_source> TO l_date_extern.
            ASSIGN l_date_extern TO <f_source>.
          WHEN 'T'.
            CLEAR l_date_extern.
            l_date_extern(2) = <f_source>(2).
            l_date_extern+2(1) = ':'.
            l_date_extern+3(2) = <f_source>+2(2).
            l_date_extern+5(1) = ':'.
            l_date_extern+6(2) = <f_source>+4(2).
            ASSIGN l_date_extern TO <f_source>.
          WHEN 'D'.
            CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
              EXPORTING
                date_internal = <f_source>
              IMPORTING
                date_external = l_date_extern
              EXCEPTIONS
                OTHERS        = 4.
            IF sy-subrc <> 0.
              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                    RAISING conversion_failed.
            ELSE.
              ASSIGN l_date_extern TO <f_source>.
            ENDIF.
          WHEN 'F'.
            CALL FUNCTION 'FLTP_CHAR_CONVERSION'
              EXPORTING
                input  = <f_source>
              IMPORTING
                flstr  = l_date_extern
              EXCEPTIONS
                OTHERS = 4.
            IF sy-subrc <> 0.
              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
                    RAISING conversion_failed.
            ELSE.
              ASSIGN l_date_extern TO <f_source>.
            ENDIF.
          WHEN OTHERS.
        ENDCASE.
*        remember der seperation character!
        IF l_struc_index <> 1.
          l_max_field+l_len_string(l_len_field_sep) = c_field_separator.
          l_len_string = l_len_field_sep.
        ENDIF.
        IF <f_source> CO c_darl_number.
          CONDENSE <f_source> NO-GAPS.
        ELSE.
          CONDENSE <f_source>.
        ENDIF.
        l_max_field+l_len_string = <f_source>.
        l_len_string = STRLEN( l_max_field ).
        CHECK l_len_string <> '0'.
        l_struc_raw_data+l_start_string(l_len_string) = l_max_field.
        l_start_string = l_start_string + l_len_string.
      ENDIF.
    ENDDO.
    IF NOT l_struc_raw_data IS INITIAL.
      APPEND l_struc_raw_data TO lt_data_csv.
    ENDIF.
  ENDLOOP.

  CALL FUNCTION 'HR_99S_DOWNLOAD'
    EXPORTING
      p_initial_directory     = 'C:\'
      p_filename              = 'PREVIRED.txt'
      p_filetype              = 'ASC'
      p_write_lf              = 'X'
      p_trunc_blanks_eol      = 'X'
      p_trunc_blanks          = ' '
    TABLES
      data_tab                = lt_data_csv
    EXCEPTIONS
      file_save_dialog        = 1
      file_write_error        = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      unknown_error           = 6
      wrong_tab_format        = 7
      OTHERS                  = 8.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFUNCTION.

EJEMPLO 2

TYPES: BEGIN OF ty_pernr,
         pernr TYPE p0001-pernr,
         begda type begda,
         dias type i,
         sueldo type p DECIMALS 0,
       END OF ty_pernr.

data: lt_pernr type TABLE OF ty_pernr,
      lt_tabla_csv TYPE ppe_cust_table,
      ls_pernr type ty_pernr.

ls_pernr-pernr = '00000001'.
ls_pernr-begda = sy-datum.
ls_pernr-sueldo = 620000.
ls_pernr-dias = 30.

append ls_pernr to lt_pernr.

PERFORM CREAR_CSV USING lt_pernr CHANGING lt_tabla_csv.
* salida: 00000001;03/09/2021;30;620000

form CREAR_CSV using p_tabla type ANY TABLE
                CHANGING P_TABLA_CSV type ppe_cust_table.
  CONSTANTS: c_field_separator TYPE c VALUE ';',
             c_darl_number(12) TYPE c VALUE '1234567890 '.

  DATA: cl_descr_struc_ref TYPE REF TO cl_abap_structdescr,
        it_components      TYPE abap_compdescr_tab,
        wa_components      LIKE LINE OF it_components.

  DATA: l_struc_index     TYPE syindex,
        l_len_string      TYPE i,
        l_max_field       TYPE char1024,
        l_struc_raw_data  TYPE char1024,
        l_start_string    TYPE i,
        l_len_field_sep   TYPE i,
        l_date_extern(30) TYPE c,
        l_help_id         type tline-tdline,
        l_tabix           TYPE sytabix.

  FIELD-SYMBOLS <fs_field> TYPE ANY.
  FIELD-SYMBOLS <ls_envio> TYPE ANY.

  l_len_field_sep = STRLEN( c_field_separator ).

  LOOP AT p_tabla ASSIGNING <ls_envio>.
    CLEAR: l_struc_index, l_len_string, l_struc_raw_data, l_start_string.

    IF it_components[] IS INITIAL.
      cl_descr_struc_ref ?= cl_abap_typedescr=>describe_by_data( <ls_envio> ).
* obtener campos de estructura
      it_components = cl_descr_struc_ref->components.
    ENDIF.

    DO.
      ADD 1 TO l_struc_index.
      CLEAR l_len_string.
      READ TABLE it_components INTO wa_components INDEX sy-index.
      IF sy-subrc = 0.
        ASSIGN COMPONENT wa_components-name OF STRUCTURE <ls_envio> TO <fs_field>.

        CASE wa_components-type_kind .
          WHEN 'P' or 'I'.
            WRITE <fs_field> TO l_date_extern NO-GROUPING.
            CATCH SYSTEM-EXCEPTIONS conversion_errors  = 4.
              IF sy-subrc <> '0'.
*                MESSAGE e899(ux) WITH l_type <f_source> l_help_id
*                                      l_tabix RAISING conversion_failed.
              ENDIF.
            ENDCATCH.
            CONDENSE l_date_extern.
            ASSIGN l_date_extern TO <fs_field>.
          WHEN 'D'.
            MOVE <fs_field> TO l_date_extern.
*20191220 -> 20/12/2019
            REPLACE FIRST OCCURRENCE OF REGEX '(\d{4})(\d{2})(\d{2})' IN l_date_extern
                                           WITH '$3/$2/$1'.
           ASSIGN l_date_extern TO <fs_field>.
        ENDCASE.

      ELSE.
        EXIT.
      ENDIF.

      IF l_struc_index <> 1.
        l_max_field+l_len_string(l_len_field_sep) = c_field_separator.
        l_len_string = l_len_field_sep.
      ENDIF.
*      IF <fs_field> CO c_darl_number.
*        CONDENSE <fs_field> NO-GAPS.
*      ELSE.
*        CONDENSE <fs_field>.
*      ENDIF.
      l_max_field+l_len_string = <fs_field>.
      l_len_string = STRLEN( l_max_field ).
      CHECK l_len_string <> '0'.
      l_struc_raw_data+l_start_string(l_len_string) = l_max_field.
      l_start_string = l_start_string + l_len_string.
    ENDDO.

    APPEND l_struc_raw_data TO P_TABLA_CSV..

  ENDLOOP.
endform.

Ejemplo 3

FORM crear_csv USING p_tabla TYPE ANY TABLE
                CHANGING p_tabla_csv TYPE ppe_cust_table.
  CONSTANTS: c_field_separator TYPE c VALUE ';',
             c_darl_number(12) TYPE c VALUE '1234567890 '.

  DATA: l_struc_index     TYPE syindex,
        l_len_string      TYPE i,
        l_max_field       TYPE char1024,
        l_struc_raw_data  TYPE char1024,
        l_start_string    TYPE i,
        l_len_field_sep   TYPE i,
        l_date_extern(30) TYPE c,
        l_help_id         TYPE tline-tdline,
        l_tabix           TYPE sytabix.

  FIELD-SYMBOLS <fs_field> TYPE any.
  FIELD-SYMBOLS <ls_envio> TYPE any.

  l_len_field_sep = strlen( c_field_separator ).

  DATA: lr_tab        TYPE REF TO data,
        lr_typedesc   TYPE REF TO cl_abap_typedescr,
        lr_tabdesc    TYPE REF TO cl_abap_tabledescr,
        lr_datadesc   TYPE REF TO cl_abap_datadescr,
        lr_structdesc TYPE REF TO cl_abap_structdescr.
  FIELD-SYMBOLS: <ls_structcomp> TYPE abap_compdescr.

*  GET REFERENCE OF p_tabla INTO lr_tab.
*  lr_typedesc   ?= cl_abap_tabledescr=>describe_by_data_ref( lr_tab ).
  lr_typedesc   ?= cl_abap_tabledescr=>describe_by_data( p_tabla ).
  lr_tabdesc    ?= lr_typedesc.
  lr_datadesc   =  lr_tabdesc->get_table_line_type( ).
  lr_structdesc ?= lr_datadesc.

  LOOP AT p_tabla ASSIGNING <ls_envio>.
    CLEAR: l_struc_index, l_len_string, l_struc_raw_data, l_start_string.

    DO.
      ADD 1 TO l_struc_index.
      CLEAR l_len_string.
      READ TABLE lr_structdesc->components ASSIGNING <ls_structcomp> INDEX sy-index.
      IF sy-subrc = 0.
        ASSIGN COMPONENT <ls_structcomp>-name OF STRUCTURE <ls_envio> TO <fs_field>.

        CASE <ls_structcomp>-type_kind .
          WHEN 'P' OR 'I'.
            IF <ls_structcomp>-type_kind = 'P'.
              WRITE <fs_field> TO l_date_extern CURRENCY 'CLP' NO-GROUPING.
            ELSE.
              WRITE <fs_field> TO l_date_extern NO-GROUPING.
            ENDIF.

            CATCH SYSTEM-EXCEPTIONS conversion_errors  = 4.
              IF sy-subrc <> '0'.
*                MESSAGE e899(ux) WITH l_type <f_source> l_help_id
*                                      l_tabix RAISING conversion_failed.
              ENDIF.
            ENDCATCH.
            CONDENSE l_date_extern.
            ASSIGN l_date_extern TO <fs_field>.
          WHEN 'D'.
            MOVE <fs_field> TO l_date_extern.
*20191220 -> 20/12/2019
            REPLACE FIRST OCCURRENCE OF REGEX '(\d{4})(\d{2})(\d{2})' IN l_date_extern
                                           WITH '$3/$2/$1'.
            ASSIGN l_date_extern TO <fs_field>.
        ENDCASE.

      ELSE.
        EXIT.
      ENDIF.

      IF l_struc_index <> 1.
        l_max_field+l_len_string(l_len_field_sep) = c_field_separator.
        l_len_string = l_len_field_sep.
      ENDIF.
*      IF <fs_field> CO c_darl_number.
*        CONDENSE <fs_field> NO-GAPS.
*      ELSE.
*        CONDENSE <fs_field>.
*      ENDIF.
      l_max_field+l_len_string = <fs_field>.
      l_len_string = strlen( l_max_field ).
      CHECK l_len_string <> '0'.
      l_struc_raw_data+l_start_string(l_len_string) = l_max_field.
      l_start_string = l_start_string + l_len_string.
    ENDDO.

    APPEND l_struc_raw_data TO p_tabla_csv.

  ENDLOOP.

ENDFORM.

Ejemplo 4

FORM crear_csv USING p_tabla TYPE ANY TABLE
                CHANGING p_tabla_csv TYPE ppe_cust_table.
  CONSTANTS: c_field_separator TYPE c VALUE ';',
             c_darl_number(12) TYPE c VALUE '1234567890 '.

  DATA: l_struc_index     TYPE syindex,
        l_len_string      TYPE i,
        l_max_field       TYPE char1024,
        l_struc_raw_data  TYPE char1024,
        l_start_string    TYPE i,
        l_len_field_sep   TYPE i,
        l_date_extern(30) TYPE c,
        l_help_id         TYPE tline-tdline,
        l_tabix           TYPE sytabix.

  FIELD-SYMBOLS <fs_field> TYPE any.
  FIELD-SYMBOLS <ls_envio> TYPE any.

  l_len_field_sep = strlen( c_field_separator ).

  DATA: lr_tab        TYPE REF TO data,
        lr_typedesc   TYPE REF TO cl_abap_typedescr,
        lr_tabdesc    TYPE REF TO cl_abap_tabledescr,
        lr_datadesc   TYPE REF TO cl_abap_datadescr,
        lr_structdesc TYPE REF TO cl_abap_structdescr.
  FIELD-SYMBOLS: <ls_structcomp> TYPE abap_compdescr.

  lr_typedesc   ?= cl_abap_tabledescr=>describe_by_data( p_tabla ).
  lr_tabdesc    ?= lr_typedesc.
  lr_datadesc   =  lr_tabdesc->get_table_line_type( ).
  lr_structdesc ?= lr_datadesc.

  DATA: lt_campo TYPE cl_abap_structdescr=>component_table,
        ls_campo TYPE abap_componentdescr.

  lt_campo = lr_structdesc->get_components( ).

  LOOP AT p_tabla ASSIGNING <ls_envio>.
    CLEAR: l_struc_index, l_len_string, l_struc_raw_data, l_start_string.

    DO.
      ADD 1 TO l_struc_index.
      CLEAR l_len_string.
      READ TABLE lt_campo INTO ls_campo INDEX sy-index.
      IF sy-subrc = 0.
        ASSIGN COMPONENT ls_campo-name OF STRUCTURE <ls_envio> TO <fs_field>.

        CASE ls_campo-type->type_kind. .
          WHEN 'P' OR 'I'.
            IF ls_campo-type->type_kind = 'P'.
              IF ls_campo-type->absolute_name = '\TYPE=PAD_AMT7S'.
                WRITE <fs_field> TO l_date_extern CURRENCY 'CLP' NO-GROUPING.
              ELSE.
                WRITE <fs_field> TO l_date_extern NO-GROUPING.
              ENDIF.
            ELSE.
              WRITE <fs_field> TO l_date_extern NO-GROUPING.
            ENDIF.

            CATCH SYSTEM-EXCEPTIONS conversion_errors  = 4.
              IF sy-subrc <> '0'.
              ENDIF.
            ENDCATCH.
            CONDENSE l_date_extern.
            ASSIGN l_date_extern TO <fs_field>.
          WHEN 'D'.
            MOVE <fs_field> TO l_date_extern.
*20191220 -> 20/12/2019
            REPLACE FIRST OCCURRENCE OF REGEX '(\d{4})(\d{2})(\d{2})' IN l_date_extern
                                           WITH '$3/$2/$1'.
            ASSIGN l_date_extern TO <fs_field>.
        ENDCASE.

      ELSE.
        EXIT.
      ENDIF.

      IF l_struc_index <> 1.
        l_max_field+l_len_string(l_len_field_sep) = c_field_separator.
        l_len_string = l_len_field_sep.
      ENDIF.

      l_max_field+l_len_string = <fs_field>.
      l_len_string = strlen( l_max_field ).
      CHECK l_len_string <> '0'.
      l_struc_raw_data+l_start_string(l_len_string) = l_max_field.
      l_start_string = l_start_string + l_len_string.
    ENDDO.

    APPEND l_struc_raw_data TO p_tabla_csv.

  ENDLOOP.

ENDFORM.

Leer archivo CSV

REPORT  ytest_csv.

TYPE-POOLS truxs.

TYPES: BEGIN OF ty_data,
  col01(100),
  col02(100),
  col03(100),
  col04(100),
  col05(100),
END OF ty_data.
DATA gt_data TYPE TABLE OF ty_data WITH HEADER LINE.
DATA : rawdata TYPE truxs_t_text_data.
*--------------------------------------------------------------------*
*
*--------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE.

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
 CALL FUNCTION 'GUI_FILE_LOAD_DIALOG'
  IMPORTING
    FULLPATH                = p_file
           .
*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------------------------------------*

  PERFORM get_data.

*--------------------------------------------------------------------*
END-OF-SELECTION.
*--------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data.
  DATA ld_filename TYPE string.

  ld_filename = p_file.

  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = ld_filename
      filetype                = 'ASC'
    TABLES
      data_tab                = rawdata
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  DATA ls_rawdata LIKE LINE OF rawdata.

  CALL FUNCTION 'TEXT_CONVERT_CSV_TO_SAP'
    EXPORTING
      i_field_seperator    = ';'
      i_tab_raw_data       = rawdata
    TABLES
      i_tab_converted_data = gt_data
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  BREAK-POINT.

ENDFORM.                    "get_data

Para definir otro separador a parte de ; usar

data l_sep(1) type c value ','.

CALL FUNCTION 'TEXT_CONVERT_TEX_TO_SAP'
  EXPORTING
   I_FIELD_SEPERATOR           = l_sep
    i_tab_raw_data             = rawdata
  tables
    i_tab_converted_data       = gt_file
 EXCEPTIONS
   CONVERSION_FAILED          = 1
   OTHERS                     = 2
          .

Leer archivo Excel

REPORT YTEST_SUBIR_EXCEL.

DATA: gt_data TYPE TABLE OF T001,
      l_i_tab_raw_data  TYPE truxs_t_text_data,
      gd_tfile TYPE IBIPPARMS-PATH.

PARAMETERS p_file type string obligatory.

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_file_table TYPE filetable,
        ls_file_table LIKE LINE OF lt_file_table,
        l_subrc       TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Seleccione Archivo EXCEL'
      multiselection          = space
    CHANGING
      file_table              = lt_file_table
      rc                      = l_subrc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    p_file = ls_file_table.
  ENDIF.

*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------------------------------------*
data l_file type RLGRAP-FILENAME.

move p_file to l_file.

* Read data from Excel shet
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
  i_tab_raw_data       = l_i_tab_raw_data
  i_filename           = l_file
TABLES
  i_tab_converted_data = gt_data
EXCEPTIONS
  conversion_failed    = 1
  OTHERS               = 2.

IF sy-subrc <> 0.
  case sy-subrc.
    when 1.
  MESSAGE i000(0k) WITH 'Error en Cargar Archivo.'
                       'Favor de validar que archivo'
                       'no este abierto por otra aplicación' DISPLAY LIKE 'E'.
   when OTHERS.
     MESSAGE i000 WITH 'Operación Cancelada' DISPLAY LIKE 'W'.
   ENDCASE.
  RETURN.
ENDIF.

Clase cl_fdt_xl_spreadsheet

NOTA 2468709:

La clase CL_FDT_XL_SPREADSHEET se utiliza para cargar/descargar Excel en un programa personalizado. Sin embargo, se han observado ocurrencias inesperadas, incluida la carga de datos en blanco, la corrupción de los datos cargados o la incapacidad del sistema para reconocer valores en negrita, entre otros problemas.

Los objetos/métodos de Excel en FDT (BRFplus) están diseñados exclusivamente para uso interno dentro de BRFplus. No están pensadas para la importación/exportación de Excel genérico ni para ningún otro fin. Estos objetos/métodos se utilizan dentro de la tabla de decisiones BRFplus, que requiere un formato Excel específico. Su correcto funcionamiento solo está garantizado cuando se respeta este formato de tabla de decisiones específico. Consulte el ejemplo adjunto para obtener una ilustración del formato requerido.

leer excel

FORM leer_excel USING i_file . "CHANGING rt_table TYPE STANDARD TABLE.
  DATA: lt_xtab TYPE cpt_x255,
        lv_size TYPE i.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
*     percentage = l_percent
      text = TEXT-003.

*    IF i_filetype = abap_true. "******.XLSX UPLOAD*********
  cl_gui_frontend_services=>gui_upload( EXPORTING filename   = i_file
                                                  filetype   = 'BIN'
                                        IMPORTING filelength = lv_size
                                         CHANGING data_tab   = lt_xtab
                                         EXCEPTIONS
                                                  file_open_error = 1
                                                  file_read_error = 2
                                                  error_no_gui            = 3
                                                  not_supported_by_gui    = 4
                                                  OTHERS                  = 5 ).
  IF sy-subrc <> 0.
*        RAISE EXCEPTION TYPE zcx_excel_exception EXPORTING i_message = |Invalid File { i_file }| ##no_text.
  ENDIF.
*    ELSE."******.CSV UPLOAD*********
*
*      cl_gui_frontend_services=>gui_upload( EXPORTING filename   = i_file
*                                                      filetype   = 'ASC'
*                                                      has_field_separator = abap_true
*                                            IMPORTING filelength = lv_size
*                                            CHANGING data_tab   = lt_xtab
*                                            EXCEPTIONS
*                                                    file_open_error = 1
*                                                    file_read_error = 2
*                                                    error_no_gui            = 3
*                                                    not_supported_by_gui    = 4
*                                                    OTHERS                  = 5 ).
*      IF sy-subrc <> 0.
*        RAISE EXCEPTION TYPE zcx_excel_exception EXPORTING i_message = |Invalid File { i_file }| ##no_text.
*      ENDIF.
*
*    ENDIF.

  cl_scp_change_db=>xtab_to_xstr( EXPORTING im_xtab    = lt_xtab
                                            im_size    = lv_size
                                  IMPORTING ex_xstring = DATA(lv_xstring) ).

  DATA(lo_excel) = NEW cl_fdt_xl_spreadsheet( document_name = i_file
                                              xdocument     = lv_xstring ).
  lo_excel->if_fdt_doc_spreadsheet~get_worksheet_names(
    IMPORTING worksheet_names = DATA(lt_worksheets) ).

  DATA rt_table TYPE REF TO data.
  FIELD-SYMBOLS: <fs_carga> TYPE ty_carga,
                 <fs_data>  TYPE any,
                 <fs_field> TYPE any.
  FIELD-SYMBOLS: <fs_fname> TYPE file_table,
                 <ft_data>  TYPE STANDARD TABLE.

  LOOP AT lt_worksheets INTO DATA(ls_worksheets).
    rt_table = lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet( ls_worksheets ).

*  rt_table = lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet( lt_worksheets[ 2 ] ).

    ASSIGN rt_table->* TO <ft_data>.

    LOOP AT <ft_data> ASSIGNING <fs_data>.
      IF sy-tabix EQ 1. " Skip the Header
        CONTINUE.
      ENDIF.
      CHECK NOT <fs_data> IS INITIAL.
      UNASSIGN <fs_carga>.
      APPEND INITIAL LINE TO gt_carga ASSIGNING <fs_carga>.

      DO 20 TIMES.
        UNASSIGN <fs_field>.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_data> TO <fs_field>.
        CHECK <fs_field> IS ASSIGNED AND NOT <fs_field> IS INITIAL.
        CASE sy-index.
*  Fill the values into the internal table based on the columns in excel file
          WHEN 1.
            <fs_carga>-rut_p = <fs_field>.
          WHEN 2.
            <fs_carga>-dig_p = <fs_field>.
          WHEN 3.
            <fs_carga>-pat_p = <fs_field>.
          WHEN 4.
            <fs_carga>-mat_p = <fs_field>.
          WHEN 5.
            <fs_carga>-nom_p = <fs_field>.
          WHEN 6.
            <fs_carga>-rut_c = <fs_field>.
          WHEN 7.
            <fs_carga>-dig_c = <fs_field>.
          WHEN 8.
            <fs_carga>-pat_c = <fs_field>.
          WHEN 9.
            <fs_carga>-mat_c = <fs_field>.
          WHEN 10.
            <fs_carga>-nom_c = <fs_field>.
          WHEN 11.
            <fs_carga>-sex_c = <fs_field>.
          WHEN 12.
            <fs_carga>-pa_c  = <fs_field>.
          WHEN 13.
            <fs_carga>-pa_t  = <fs_field>.
          WHEN 14.
            <fs_carga>-tip_c = <fs_field>.
          WHEN 15.
            <fs_carga>-vig   = <fs_field>.
          WHEN 16.
            IF <fs_field> <> space.
              <fs_carga>-fec_ini = <fs_field>.
            ELSE.
              <fs_carga>-fec_ini = '00000000'.
            ENDIF.
          WHEN 17.
            IF <fs_field> <> space.
              <fs_carga>-fec_ven = <fs_field>.
            ELSE.
              <fs_carga>-fec_ven = '00000000'.
            ENDIF.
          WHEN 18.
            <fs_carga>-fec_der = <fs_field>.
          WHEN 19.
            <fs_carga>-tr = <fs_field>.
          WHEN 20.
            IF <fs_field> <> space.
              <fs_carga>-fec_nac  = <fs_field>.
            ELSE.
              <fs_carga>-fec_nac = '00000000'.
            ENDIF.
          WHEN OTHERS.
        ENDCASE.
      ENDDO.
    ENDLOOP.

  ENDLOOP.
*    IF rt_table IS INITIAL.
*      RAISE EXCEPTION TYPE zcx_excel_exception EXPORTING i_message = 'No Data found in Excel File' ##no_text.
*    ENDIF.

ENDFORM.

crear excel

TYPES: BEGIN OF ty_data,
         field01(80) TYPE c,
         field02(80) TYPE c,
         field03(80) TYPE c,
         field04(80) TYPE c,
       END OF ty_data.
TYPES ty_data_tab TYPE STANDARD TABLE OF ty_data.

DATA gt_data TYPE ty_data_tab .
DATA wa_data LIKE LINE OF gt_data.

wa_data-field01 = 'HHHHHH'.
wa_data-field03 = 'AAAAAAAAAAAAAA'.
APPEND wa_data TO gt_data.

wa_data-field01 = 'JJJJJJJJJJJJ'.
wa_data-field03 = 'BBBBBBBBBBBBBBBBBB'.
APPEND wa_data TO gt_data.

PERFORM crear_excel.
FORM crear_excel.
  DATA: lo_datadescr   TYPE REF TO cl_abap_datadescr.

  DATA: lt_column TYPE if_fdt_doc_spreadsheet=>t_column,
        ls_column TYPE if_fdt_doc_spreadsheet=>s_column,
        ld_name   TYPE if_fdt_types=>text,
        lv_name   TYPE if_fdt_types=>name.

  DATA: cl_descr_struc_ref TYPE REF TO cl_abap_structdescr,
        it_components      TYPE abap_compdescr_tab,
        wa_components      LIKE LINE OF it_components.

  FIELD-SYMBOLS <fs_field> TYPE any.

  IF it_components[] IS INITIAL.
    cl_descr_struc_ref ?= cl_abap_typedescr=>describe_by_data( wa_data ).
* obtener campos de estructura
    it_components = cl_descr_struc_ref->components.
  ENDIF.

*  ls_column-name         = 'Field01'.
*  ls_column-display_name = 'Field01'.
*  lo_datadescr          ?= cl_abap_typedescr=>describe_by_data( ld_name  ). " change it to the actual data type
*  ls_column-type         = lo_datadescr .
*  APPEND ls_column TO lt_column.
*
*  ls_column-name         = 'Field02'.
*  ls_column-display_name = 'Field02'.
*  lo_datadescr          ?= cl_abap_typedescr=>describe_by_data( ld_name  ). " change it to the actual data type
*  ls_column-type         = lo_datadescr .
*  APPEND ls_column TO lt_column.
*
*  ls_column-name         = 'Field03'.
*  ls_column-display_name = 'Field03'.
*  lo_datadescr          ?= cl_abap_typedescr=>describe_by_data( ld_name  ). " change it to the actual data type
*  ls_column-type         = lo_datadescr .
*  APPEND ls_column TO lt_column.
*
*  ls_column-name         = 'Field04'.
*  ls_column-display_name = 'Field04'.
*  lo_datadescr          ?= cl_abap_typedescr=>describe_by_data( ld_name  ). " change it to the actual data type
*  ls_column-type         = lo_datadescr .
*  APPEND ls_column TO lt_column.

  LOOP AT it_components INTO wa_components.
    ASSIGN COMPONENT wa_components-name OF STRUCTURE wa_data TO <fs_field>.

    ls_column-name         = wa_components-name.
    ls_column-display_name = wa_components-name.
    lo_datadescr          ?= cl_abap_typedescr=>describe_by_data( <fs_field> ). " change it to the actual data type
    ls_column-type         = lo_datadescr .
    APPEND ls_column TO lt_column.
  ENDLOOP.

  DATA lt_data TYPE REF TO data.
  DATA lv_xstring TYPE xstring.
  FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE.

  CREATE DATA lt_data TYPE ty_data_tab.

  ASSIGN lt_data->* TO <lt_data>.
  <lt_data> = gt_data.

  lv_xstring = cl_fdt_xl_spreadsheet=>if_fdt_doc_spreadsheet~create_document(
                                                      columns        = lt_column
                                                      itab           = lt_data
                                                      iv_call_type   = 1 "if_fdt_doc_spreadsheet=>gc_call_simulation
                                                      name           = 'testtest' ).

  DATA: l_xtab TYPE cpt_x255,
        l_size TYPE i.

  cl_scp_change_db=>xstr_to_xtab( EXPORTING im_xstring = lv_xstring
                                  IMPORTING ex_xtab    = l_xtab
                                            ex_size    = l_size ).

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize = l_size
      filename     = 'c:\temp\testtest.xlsx'
      filetype     = 'BIN'
    TABLES
      data_tab     = l_xtab
    EXCEPTIONS
      OTHERS       = 1.

  IF sy-subrc <> 0.

  ENDIF.

ENDFORM.

Enviar Email con anexo Excel

Programa BCS_EXAMPLE_7 (clase cl_bcs_convert=>string_to_solix)

Leer archivo XML

REPORT YLEE_XML.
data gt_data type TABLE OF string.
data: g_string type string,
      g_xstring type xstring.

PARAMETERS p_file type string LOWER CASE OBLIGATORY.

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_file_table TYPE filetable,
        ls_file_table LIKE LINE OF lt_file_table,
        l_subrc       TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Seleccione Archivo XML'
      multiselection          = space
    CHANGING
      file_table              = lt_file_table
      rc                      = l_subrc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    p_file = ls_file_table.
  ENDIF.

*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------------------------------------*
CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    filename                      = p_file
    FILETYPE                      = 'ASC'
  tables
    data_tab                      = gt_data
 EXCEPTIONS
   FILE_OPEN_ERROR               = 1
   FILE_READ_ERROR               = 2
   NO_BATCH                      = 3
   GUI_REFUSE_FILETRANSFER       = 4
   INVALID_TYPE                  = 5
   NO_AUTHORITY                  = 6
   UNKNOWN_ERROR                 = 7
   BAD_DATA_FORMAT               = 8
   HEADER_NOT_ALLOWED            = 9
   SEPARATOR_NOT_ALLOWED         = 10
   HEADER_TOO_LONG               = 11
   UNKNOWN_DP_ERROR              = 12
   ACCESS_DENIED                 = 13
   DP_OUT_OF_MEMORY              = 14
   DISK_FULL                     = 15
   DP_TIMEOUT                    = 16
   OTHERS                        = 17
IF sy-subrc <> 0.
* Implement suitable error handling here
  return.
ENDIF.

loop at gt_data into data(ls_data).
  if sy-tabix = 1.
    g_string = ls_data.
  else.
    CONCATENATE g_string ls_data into g_string.
  endif.
ENDLOOP.

* encodings se puede ver en ayuda busqueda H_TCP00
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text           = g_string
*   MIMETYPE       = ' '
   ENCODING       = '1100' "ISO-8859-1  "'4110'  " utf-8
 IMPORTING
   BUFFER         = g_xstring
 EXCEPTIONS
   FAILED         = 1
   OTHERS         = 2
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

call function 'DISPLAY_XML_STRING'
  EXPORTING xml_string = g_xstring.

Leer Arhivo PDF y Visualizarlo

Programa

*&---------------------------------------------------------------------*
*& Report YLEE_PDF
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ylee_pdf.
DATA: g_html_container TYPE REF TO cl_gui_custom_container,
      g_html_control   TYPE REF TO cl_gui_html_viewer,
      g_url(255).

DATA gt_data  TYPE solix_tab.

DATA ok_code TYPE sy-ucomm.

PARAMETERS p_file TYPE string LOWER CASE OBLIGATORY.

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_file_tab TYPE STANDARD TABLE OF sdokpath,
        ls_file_tab TYPE sdokpath.

  CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG'
    EXPORTING
      window_title   = 'Seleccione Archivo PDF'
      multiselection = space
    TABLES
      file_table     = lt_file_tab
    EXCEPTIONS
      cntl_error     = 1
      OTHERS         = 2.
  IF sy-subrc = 0.
    READ TABLE lt_file_tab INTO ls_file_tab INDEX 1.
    p_file = ls_file_tab.
  ENDIF.

*--------------------------------------------------------------------*
START-OF-SELECTION.
*--------------------------------------------------------------------*
  DATA l_lenght TYPE i.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
      filetype                = 'BIN'
    IMPORTING
      filelength              = l_lenght
    TABLES
      data_tab                = gt_data
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
  IF sy-subrc <> 0.
    RETURN.
  ENDIF.

  CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS'. "Crear con 'BACK' 'EXIT' 'CANC' de tipo comando exit
  SET TITLEBAR 'T01'.      "PDF Viewer

  IF g_html_container IS INITIAL.
    CREATE OBJECT g_html_container
      EXPORTING
        container_name = 'PDF'.

    CREATE OBJECT g_html_control
      EXPORTING
        parent = g_html_container.

    CALL METHOD g_html_control->load_data
      EXPORTING
        type                   = 'application'
        subtype                = 'pdf'
      IMPORTING
        assigned_url           = g_url
      CHANGING
        data_table             = gt_data
      EXCEPTIONS
        dp_invalid_parameter   = 1
        dp_error_general       = 2
        cntl_error             = 3
        html_syntax_notcorrect = 4
        OTHERS                 = 5.
    IF sy-subrc <> 0.
    ENDIF.

    CALL METHOD g_html_control->show_url
      EXPORTING
        url                    = g_url
        in_place               = ' X'
      EXCEPTIONS
        cntl_error             = 1
        cnht_error_not_allowed = 2
        cnht_error_parameter   = 3
        dp_error_general       = 4
        OTHERS                 = 5.
    IF sy-subrc <> 0.
    ENDIF.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE exit INPUT.
  DATA l_ok_code TYPE sy-ucomm.

  l_ok_code = ok_code.
  CLEAR ok_code.

  CASE l_ok_code.
    WHEN 'BACK' OR 'EXIT' OR 'CANC'.
      CALL METHOD g_html_control->free
        EXCEPTIONS
          cntl_error        = 1
          cntl_system_error = 2
          OTHERS            = 3.
      IF sy-subrc <> 0.
*       Implement suitable error handling here
      ENDIF.

      SET SCREEN 0.
      LEAVE SCREEN.
  ENDCASE.
ENDMODULE.

Dynpro 0100

  • Crear custom container con Nombre PDF
  • Agregar Elemento OK_CODE de tipo OK
  • Crear Status GUI STATUS con 'BACK' 'EXIT' 'CANC' de tipo comando exit
  • Crear Título T01 "PDF Viewer"
PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
  module exit at EXIT-COMMAND.
* MODULE USER_COMMAND_0100.

FM EFG_DISPLAY_PDF visualizar un archivo PDF desde un xstring

Grabar XSTRING en equipo como Binario(XML,PDF,etc.)

CONCATENATE ls_dir_d '\' i_vbeln '.xml'
             INTO ls_fullpath.
CALL METHOD cl_faa_tenv_services=>gui_download_xstring
  EXPORTING
    id_fullpath = ls_fullpath
    id_xstring  = i_xml.
IF sy-subrc <> 0.
ENDIF.
form gui_download USING i_xstring type xstring
                        i_fullpath type string
               CHANGING c_subrc type sy-subrc.
* Stores a XSTRING as file on frontend client

  DATA: lt_xtable   TYPE faa_t_tenv_xmlraw.
  DATA: ld_filesize TYPE i.

* Converting XString to XTable
  CALL METHOD cl_faa_tenv_services=>convert_xstring_to_xtable
    EXPORTING
      id_xstring    = i_xstring
    IMPORTING
      et_xtable     = lt_xtable
    EXCEPTIONS
      invalid_table = 1
      OTHERS        = 2.

  IF sy-subrc <> 0.
    c_subrc = sy-subrc.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    RETURN.
  ENDIF.

* . Save XTable
  ld_filesize = xstrlen( i_xstring ).
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      bin_filesize = ld_filesize
      filename     = i_fullpath
      filetype     = 'BIN'
    CHANGING
      data_tab     = lt_xtable
    EXCEPTIONS
      OTHERS       = 4.
  c_subrc = sy-subrc.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


ENDform.                    "gui_download


*----------------------------------------------------------------------*
FORM download_server USING p_xstring TYPE xstring
                           p_path TYPE string
                  CHANGING p_subrc TYPE sy-subrc.
  DATA: lt_bin_tab    TYPE solix_tab,
        l_file_length TYPE i.
  data wa like LINE OF lt_bin_tab.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = p_xstring
    IMPORTING
      output_length = l_file_length
    TABLES
      binary_tab    = lt_bin_tab.

  OPEN DATASET p_path IN BINARY MODE FOR OUTPUT.
  IF sy-subrc = 0.
    p_subrc = 0.
    LOOP AT lt_bin_tab INTO wa.
      TRANSFER wa TO p_path.
    ENDLOOP.
    CLOSE DATASET p_path.
  ELSE.
    p_subrc = 1.
  ENDIF.

ENDFORM.                    "download_server

Obtener vía F4 archivo y directorio en un reporte

PARAMETERS p_file TYPE string LOWER CASE OBLIGATORY.
PARAMETERS p_dir TYPE string LOWER CASE.

Archivo

  • Ejemplo 1
*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_file_table TYPE filetable,
        ls_file_table LIKE LINE OF lt_file_table,
        l_subrc       TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Seleccione Archivo XML'
*     default_extension       =
*     default_filename        =
*     file_filter             =
*     with_encoding           =
*     initial_directory       =
      multiselection          = space
    CHANGING
      file_table              = lt_file_table
      rc                      = l_subrc
*     user_action             =
*     file_encoding           =
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    p_file = ls_file_table.
  ENDIF.
  • Ejemplo 2, el archivo seleccionado queda en el history de p_file
*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_file_tab TYPE STANDARD TABLE OF sdokpath,
        ls_file_tab TYPE sdokpath.
  
  CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG'
    EXPORTING
      window_title   = 'Seleccione Archivo XML'
      multiselection = space
    TABLES
      file_table     = lt_file_tab
    EXCEPTIONS
      cntl_error     = 1
      OTHERS         = 2.
  IF sy-subrc = 0.
    READ TABLE lt_file_tab INTO ls_file_tab INDEX 1.
    p_file = ls_file_tab.
  ENDIF.

Directorio

Ejemplo 1

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dir.
*--------------------------------------------------------------------*
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = 'Seleccione Directorio'
*     initial_folder       = 'C:\TEMP\'
    CHANGING
      selected_folder      = p_dir
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
*               Implement suitable error handling here
  ENDIF.

Ejemplo 2

*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*--------------------------------------------------------------------*
  DATA: lt_dr TYPE STANDARD TABLE OF dynpread,
        ls_dr LIKE LINE OF lt_dr.
  DATA: lv_dynprog TYPE sy-repid,
        lv_dynpnr  TYPE sy-dynnr VALUE '1000'.

  CLEAR ls_dr.
  REFRESH lt_dr.

  ls_dr-fieldname = 'P_LOC'.
  ls_dr-stepl = 0.
  APPEND ls_dr TO lt_dr.

  MOVE sy-repid TO lv_dynprog.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname               = lv_dynprog
      dynumb               = lv_dynpnr
    TABLES
      dynpfields           = lt_dr
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      invalid_parameter    = 7
      undefind_error       = 8
      double_conversion    = 9
      OTHERS               = 10.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  READ TABLE lt_dr INTO ls_dr INDEX 1.

  IF ls_dr-fieldvalue = 'X'.
    CALL METHOD cl_gui_frontend_services=>directory_browse
*      EXPORTING
*        window_title         = 'Seleccione Directorio'
      CHANGING
        selected_folder      = p_file
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.
    IF sy-subrc <> 0.
*               Implement suitable error handling here
    ENDIF.
  ENDIF.