segunda-feira, 17 de julho de 2017

Classe - 'CL_GUI_FRONTEND_SERVICES'

*--------------------------------------------------------------------*
*  Eae galera, sempre em nossas vidas de ABAP, vamos precisar saber
* fazer download e upload de arquivo, sabemos tambem que estas mesmas funções
* 'GUI_DOWNLOAD' e 'GUI_UPLOAD' estão obsoletas.




*  Conforme o 'F1' da função o mesmo indica você usar a classe
* 'CL_GUI_FRONTEND_SERVICES' que será a classe que vamos estudar hoje.
*  Tentarei mostrar alguns Metodos interessantes dessa classe que trabalham
* com arquivos e pastas.

*  A ideia desse programa será bem simples, ele te possibilita criar uma
* pasta e incluir nela copias dos arquivos de uma outra pasta, e no final
* , como tudo isso é só para teste, existe a possibilidade de deletar todos
* os arquivos copiados juntamente com a pasta caso deseje. Esse programa
* não fara nenhuma alteração de algum arquivo que você já tenha no Desktop,
* irá trabalhar somente com os criados pelo proprio programa.
*  Recomendo criar uma pasta qualquer, incluir um arquivo qualquer também
* e começar a brincadeira.
*  Como sempre faço, existem algums Breaks no código para forçá-los a
* entender o que cada metodo faz. Abaixo a lista dos metodos usados dessa
* Classe.

* cl_gui_frontend_services=>directory_browse
* cl_gui_frontend_services=>directory_create
* cl_gui_frontend_services=>directory_exist
* cl_gui_frontend_services=>directory_delete
* cl_gui_frontend_services=>directory_list_files
* cl_gui_frontend_services=>file_copy
* cl_gui_frontend_services=>file_exist
* cl_gui_frontend_services=>file_get_attributes
* cl_gui_frontend_services=>file_delete

*  Lembando que o código está simples, mais para estudos mesmo, sugestões,
* critina ou qualquer tipo de opnião estamos disponivel no final do post,
* a nomenclatura dos metodos estão bem intuitivas para não precisar comentar
* muito, mas qualquer duvida estamos aí também.
* Bons estudos aeeee.

REPORT z_cl_gui_frontend_services.

TABLES :
  sscrfields.

CLASS
  zcl_main DEFINITION DEFERRED.

DATA :
  o_main TYPE REF TO zcl_main.

DATA :
  subrc         TYPE sy-subrc,
  result        TYPE abap_bool,
  gt_file_table TYPE rstt_t_files.


* T01 - Pastas
* C01 - Processar
* T02 - Arquivos
* T03 - Deletar arquivos e pastas novas após o processo ?

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
PARAMETERS :
  folder   TYPE string,
  n_folder TYPE string DEFAULT 'teste'.
SELECTION-SCREEN END OF BLOCK   b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
PARAMETERS :
  folder2 TYPE string.
SELECTION-SCREEN END OF BLOCK   b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.
PARAMETERS :
  del_fold AS CHECKBOX DEFAULT abap_true,
  del_file AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN END OF BLOCK   b3.


CLASS zcl_main DEFINITION.
  PUBLIC SECTION.
    METHODS:
*--------------------------------------------------------------------*
      directory,
*--------------------------------------------------------------------*
      directory_browse
        IMPORTING
          iv_title  TYPE string
        CHANGING
          cv_folder TYPE string,
*--------------------------------------------------------------------*
      directory_create
        IMPORTING
          iv_directory TYPE string
        CHANGING
          cv_rc        TYPE sy-subrc,
*--------------------------------------------------------------------*
      directory_exist
        IMPORTING
          iv_directory TYPE string
        CHANGING
          cv_result    TYPE abap_bool,
*--------------------------------------------------------------------*
      directory_delete
        IMPORTING
          iv_directory TYPE string
        CHANGING
          cv_rc        TYPE sy-subrc,
*--------------------------------------------------------------------*
      directory_list_files
        IMPORTING
          iv_directory  TYPE string
        EXPORTING
          ev_count      TYPE i
        CHANGING
          ct_file_table TYPE rstt_t_files,
*--------------------------------------------------------------------*
      file
        CHANGING
          ct_file_table TYPE rstt_t_files,
*--------------------------------------------------------------------*
      file_copy
        IMPORTING
          iv_source      TYPE string
          iv_destination TYPE string
          iv_overwrite   TYPE abap_bool OPTIONAL
        EXPORTING
          ev_rc          TYPE sy-subrc,
*--------------------------------------------------------------------*
      file_exist
        IMPORTING
          iv_file   TYPE string
        EXPORTING
          ev_result TYPE abap_bool,
*--------------------------------------------------------------------*
      file_get_attributes
        IMPORTING
          iv_file       TYPE string
        EXPORTING
          ev_attributes TYPE char10,
*--------------------------------------------------------------------*
      popup_to_confirm_files
        CHANGING
          ct_file_table TYPE rstt_t_files,
*--------------------------------------------------------------------*
      popup_to_confirm
        IMPORTING
          iv_title    TYPE string
          iv_question TYPE string
        EXPORTING
          ev_answer   TYPE char1,
*--------------------------------------------------------------------*
      delete_folder,
*--------------------------------------------------------------------*
      delete_file
        CHANGING
          ct_file_table TYPE rstt_t_files,
*--------------------------------------------------------------------*
      file_delete
        IMPORTING
          iv_file TYPE string
        EXPORTING
          ev_rc   TYPE sy-subrc
        .
ENDCLASS.


CLASS zcl_main IMPLEMENTATION.

  METHOD directory.

    BREAK-POINT.

    IF folder IS NOT INITIAL
      AND n_folder IS NOT INITIAL.

      me->directory_exist(
        EXPORTING
          iv_directory = folder && '\' && n_folder
        CHANGING
          cv_result    = result
      ).

      IF result IS INITIAL.

        me->directory_create(
          EXPORTING
            iv_directory = folder && '\' && n_folder
          CHANGING
            cv_rc        = subrc
        ).

        IF subrc IS INITIAL.
          WRITE : / `Pasta : ` && folder && '\'
            && n_folder && ` criada`.

        ELSE.
          WRITE : / `Pasta : ` && folder && '\'
            && n_folder && ` - Problema na criação.`.
        ENDIF.
      ELSE.
        WRITE : / `Pasta : ` && folder && '\'
          && n_folder && ` - Já existe.`.
      ENDIF.
    ELSE.
      WRITE : / `Não foi feito nada, pois você esquece de `
       && `colocar a pasta e/ou diretorio.`.
    ENDIF.


  ENDMETHOD.
  METHOD directory_browse.

    cl_gui_frontend_services=>directory_browse(
      EXPORTING
        window_title         = iv_title   " Title of Browsing Window
      CHANGING
        selected_folder      = cv_folder  " Folder Selected By User
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4
    ).

  ENDMETHOD.

  METHOD directory_create.

    cl_gui_frontend_services=>directory_create(
      EXPORTING
        directory                = iv_directory    " Directory name
      CHANGING
        rc                       = cv_rc    " Return Code
      EXCEPTIONS
        directory_create_failed  = 1
        cntl_error               = 2
        error_no_gui             = 3
        directory_access_denied  = 4
        directory_already_exists = 5
        path_not_found           = 6
        unknown_error            = 7
        not_supported_by_gui     = 8
        wrong_parameter          = 9
        OTHERS                   = 10
    ).

  ENDMETHOD.
  METHOD directory_exist.
    cl_gui_frontend_services=>directory_exist(
      EXPORTING
        directory            = iv_directory    " Directory name
      RECEIVING
        result               = cv_result    " Result
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        wrong_parameter      = 3
        not_supported_by_gui = 4
        OTHERS               = 5
    ).
  ENDMETHOD.

  METHOD directory_delete.
    cl_gui_frontend_services=>directory_delete(
      EXPORTING
        directory               = iv_directory " Directory to Delete
      CHANGING
        rc                      = cv_rc        " Return Code
      EXCEPTIONS
        directory_delete_failed = 1
        cntl_error              = 2
        error_no_gui            = 3
        path_not_found          = 4
        directory_access_denied = 5
        unknown_error           = 6
        not_supported_by_gui    = 7
        wrong_parameter         = 8
        OTHERS                  = 9
    ).
  ENDMETHOD.

  METHOD directory_list_files.

    cl_gui_frontend_services=>directory_list_files(
      EXPORTING
        directory                   = iv_directory
*        filter                      = '*.*'
*        files_only                  =
*        directories_only            =
      CHANGING
        file_table                  = ct_file_table
        count                       = ev_count
      EXCEPTIONS
        cntl_error                  = 1
        directory_list_files_failed = 2
        wrong_parameter             = 3
        error_no_gui                = 4
        not_supported_by_gui        = 5
        OTHERS                      = 6
    ).

  ENDMETHOD.

  METHOD file.

    BREAK-POINT.

    IF folder2 IS NOT INITIAL.

      DATA :
        ls_file_table LIKE LINE OF gt_file_table.

      me->directory_list_files(
        EXPORTING
          iv_directory  = folder2
        CHANGING
          ct_file_table = ct_file_table
      ).

      IF ct_file_table[] IS NOT INITIAL.
        me->popup_to_confirm_files(
          CHANGING
            ct_file_table = ct_file_table
        ).

        IF ct_file_table[] IS NOT INITIAL.
          LOOP AT ct_file_table INTO ls_file_table.

            me->file_exist(
              EXPORTING
                iv_file   = folder && '\' && n_folder
                  && '\' && ls_file_table-filename
              IMPORTING
                ev_result = result
            ).

            IF result IS NOT INITIAL.
              me->popup_to_confirm(
                EXPORTING
                  iv_title    = 'Arquivo Existente'
                  iv_question = `Arquivo : ` && folder && '\' &&
                    n_folder  && '\' && ls_file_table-filename
                    && ` - já existe, deseja sobrescrever ?`
                IMPORTING
                  ev_answer   = result
              ).

              IF result = '1'. " Sobrescrever !!!!
                result = abap_true.
              ELSE.
                CLEAR result.
              ENDIF.

            ENDIF.

            me->file_copy(
              EXPORTING
                iv_source      = folder2 && '\'
                  && ls_file_table-filename
                iv_destination = folder && '\' && n_folder
                  && '\' && ls_file_table-filename
                iv_overwrite   = result
              IMPORTING
                ev_rc = subrc
            ).

            IF subrc IS INITIAL.

              DATA :
                lv_attributes(10).

              me->file_get_attributes(
                EXPORTING
                  iv_file       = folder && '\' && n_folder
                    && '\' && ls_file_table-filename
                IMPORTING
                  ev_attributes = lv_attributes
              ).

              WRITE : / `Arquivo : ` && folder2 && '\'
                && ls_file_table-filename
                && ` - Copiado com exito. Atributo : ` && lv_attributes.

            ELSE.
              WRITE : / `Arquivo : ` && folder2
                && '\' && ls_file_table-filename && ` - Erro ao copiar.`.
            ENDIF.

          ENDLOOP.
        ELSE.
          WRITE : /  
           `Não foram selecionados arquivos para cópia da pasta de origem.`.
        ENDIF.
      ELSE.
        WRITE : /  

         `Não foram encontrados arquivos para cópia da pasta de origem.`.
      ENDIF.
    ELSE.
      WRITE : /  

       `Não foi definido a pasta de origem dos arquivos a serem copiados.`.
    ENDIF.

  ENDMETHOD.

  METHOD popup_to_confirm_files.

* Caso não lembre.
* http://abapjuniores.blogspot.com.br/2017/06/funcao-reusealvpopuptoselect.html


    TYPES :
      BEGIN OF ty_popup,
        select(1),
        text(50),
      END OF   ty_popup.

    DATA :
      lt_popup      TYPE TABLE OF ty_popup,
      ls_popup      LIKE LINE OF lt_popup,
      lt_fcat_popup TYPE TABLE OF slis_fieldcat_alv,
      ls_fcat_popup LIKE LINE OF lt_fcat_popup,
      lt_excl       TYPE slis_t_extab,
      ls_excl       TYPE slis_extab,
      ls_file_table LIKE LINE OF ct_file_table,
      l_tabix       TYPE i.

    ls_fcat_popup-tabname   = 'LT_POPUP'.

    ls_fcat_popup-col_pos   = '1'.
    ls_fcat_popup-fieldname = 'SELECT'.
    ls_fcat_popup-seltext_m = 'SELECT'.
    APPEND ls_fcat_popup TO lt_fcat_popup.

    ls_fcat_popup-col_pos   = '2'.
    ls_fcat_popup-fieldname = 'TEXT'.
    ls_fcat_popup-seltext_m = 'Status'.
    ls_fcat_popup-outputlen = 50.
    APPEND ls_fcat_popup TO lt_fcat_popup.

    ls_excl-fcode = '&ETA'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '%SC'.  APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '%SC+'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&OUP'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&ODN'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&ILT'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&OL0'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&CRB'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&CRL'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&CRR'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&CRE'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&ALL'. APPEND ls_excl TO lt_excl.
    ls_excl-fcode = '&SAL'. APPEND ls_excl TO lt_excl.

* Atualiza as Opções do Pop-up
    LOOP AT ct_file_table INTO ls_file_table.
      ls_popup-text = ls_file_table-filename.
      APPEND ls_popup TO lt_popup.
    ENDLOOP.


    CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
      EXPORTING
        i_title               = 'Copiar os arquivos :'
        i_zebra               = abap_true
        i_screen_start_column = 1
        i_screen_start_line   = 1
        i_checkbox_fieldname  = 'SELECT'
        i_tabname             = 'LT_POPUP'
        it_fieldcat           = lt_fcat_popup
        it_excluding          = lt_excl
      TABLES
        t_outtab              = lt_popup
      EXCEPTIONS
        program_error         = 1
        OTHERS                = 2.

    IF sy-subrc IS INITIAL.
      DELETE lt_popup WHERE select = space.
    ENDIF.

* Valida as opções selecionadas
    LOOP AT ct_file_table INTO ls_file_table.
      l_tabix = sy-tabix.
      READ TABLE lt_popup TRANSPORTING NO FIELDS
        WITH KEY text = ls_file_table-filename.
      IF sy-subrc IS NOT INITIAL.
        DELETE ct_file_table INDEX l_tabix.
      ENDIF.
    ENDLOOP.

  ENDMETHOD.

  METHOD file_copy.

    cl_gui_frontend_services=>file_copy(
      EXPORTING
        source               = iv_source      " Source
        destination          = iv_destination " Destination
        overwrite            = iv_overwrite   " Overrides if Destination Exists
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        wrong_parameter      = 3
        disk_full            = 4
        access_denied        = 5
        file_not_found       = 6
        destination_exists   = 7
        unknown_error        = 8
        path_not_found       = 9
        disk_write_protect   = 10
        drive_not_ready      = 11
        not_supported_by_gui = 12
        OTHERS               = 13
    ).

    ev_rc = sy-subrc.

  ENDMETHOD.

  METHOD file_exist.

    cl_gui_frontend_services=>file_exist(
      EXPORTING
        file                 =  iv_file   " File to Check
      RECEIVING
        result               =  ev_result " Result
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        wrong_parameter      = 3
        not_supported_by_gui = 4
        OTHERS               = 5
    ).

  ENDMETHOD.

  METHOD popup_to_confirm.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
      EXPORTING
        titlebar       = iv_title
        text_question  = iv_question
      IMPORTING
        answer         = ev_answer
      EXCEPTIONS
        text_not_found = 1
        OTHERS         = 2.

  ENDMETHOD.

  METHOD file_get_attributes.

    DATA :
      l_readonly(1),
      l_normal(1),
      l_hidden(1),
      l_archive(1).

    cl_gui_frontend_services=>file_get_attributes(
      EXPORTING
        filename                   = iv_file   " File Name
      IMPORTING
        readonly                   = l_readonly " Attribute: readonly
        normal                     = l_normal   " Attribute: Normal
        hidden                     = l_hidden   " Attribute: Hidden
        archive                    = l_archive  " Attribute: Archive
      EXCEPTIONS
        cntl_error                 = 1
        error_no_gui               = 2
        not_supported_by_gui       = 3
        wrong_parameter            = 4
        file_get_attributes_failed = 5
        OTHERS                     = 6
    ).

    CASE abap_true.
      WHEN l_readonly.
        ev_attributes = 'READONLY'.
      WHEN l_normal.
        ev_attributes = 'NORMAL'.
      WHEN l_hidden.
        ev_attributes = 'HIDDEN'.
      WHEN l_archive.
        ev_attributes = 'ARCHIVE'.
    ENDCASE.

  ENDMETHOD.

  METHOD delete_folder.

    BREAK-POINT.

    me->directory_exist(
      EXPORTING
        iv_directory = folder && '\' && n_folder
      CHANGING
        cv_result    = result
    ).

    IF result IS NOT INITIAL.
      WRITE : / `Pasta : ` && folder && '\' && n_folder && ` - Existe`.
      me->directory_delete(
        EXPORTING
          iv_directory = folder && '\' && n_folder
        CHANGING
          cv_rc        = subrc
      ).

      IF sy-subrc IS INITIAL.
        WRITE : / `Pasta : ` && folder
          && '\' && n_folder && ` - Deletada`.
      ELSE.
        WRITE : / `Pasta : ` && folder
          && '\' && n_folder && ` - Problema na deleção.`.
      ENDIF.

    ELSE.
      WRITE : / `Pasta : ` && folder
        && '\' && n_folder && ` - Não existe`.
    ENDIF.

  ENDMETHOD.

  METHOD delete_file.

    DATA :
       ls_file_table LIKE LINE OF ct_file_table.

    BREAK-POINT.

    LOOP AT ct_file_table INTO ls_file_table.
      me->file_exist(
        EXPORTING
          iv_file   = folder && '\' && n_folder
            && '\' && ls_file_table-filename
        IMPORTING
          ev_result = result
      ).

      IF result IS NOT INITIAL.
        me->file_delete(
          EXPORTING
            iv_file = folder && '\' && n_folder
              && '\' && ls_file_table-filename
          IMPORTING
            ev_rc   = subrc
        ).

        IF subrc IS INITIAL.
          WRITE : / `Arquivo : ` && folder
            && '\' && n_folder && '\'
            && ls_file_table-filename && ` - Deletado`.
        ELSE.
          WRITE : / `Arquivo : ` && folder
            && '\' && n_folder && '\'
            && ls_file_table-filename && ` - Erro ao deletar`.
        ENDIF.

      ELSE.
        WRITE : / `Arquivo : ` && folder
          && '\' && n_folder && '\'
          && ls_file_table-filename && ` - Não existe`.
      ENDIF.

    ENDLOOP.

  ENDMETHOD.

  METHOD file_delete.
    cl_gui_frontend_services=>file_delete(
      EXPORTING
        filename             = iv_file " Name of the file to be deleted
      CHANGING
        rc                   = ev_rc   " Return Code
      EXCEPTIONS
        file_delete_failed   = 1
        cntl_error           = 2
        error_no_gui         = 3
        file_not_found       = 4
        access_denied        = 5
        unknown_error        = 6
        not_supported_by_gui = 7
        wrong_parameter      = 8
        OTHERS               = 9
    ).

  ENDMETHOD.
ENDCLASS.

INITIALIZATION.
  CREATE OBJECT o_main.

AT SELECTION-SCREEN OUTPUT.

* Caso não lembre.

* http://abapjuniores.blogspot.com.br/2013/10/programas-sem-objetos-de-textos.html
 
  TRY .
      %_folder_%_app_%-text    = 'Destino da nova pasta :'.
      %_n_folder_%_app_%-text  = 'Nome da nova Pasta : '.
      %_folder2_%_app_%-text   = 'Pasta com os arquivos a copiar : '.
      %_del_fold_%_app_%-text  = '---> Pasta'.
      %_del_file_%_app_%-text  = '--->Arquivo'.
    CATCH cx_root.

  ENDTRY.



AT SELECTION-SCREEN ON VALUE-REQUEST FOR folder.
  o_main->directory_browse(
    EXPORTING
      iv_title  = 'Diretório aonde será criado a pasta'
    CHANGING
      cv_folder = folder
  ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR folder2.
  o_main->directory_browse(
    EXPORTING
      iv_title  = 'Diretório de origem dos arquivos a serem copiados'
    CHANGING
      cv_folder = folder2
  ).


START-OF-SELECTION.
  o_main->directory( ).               " Cria a pasta
  o_main->file(                       " Cria a copia dos arquivos
    CHANGING
      ct_file_table = gt_file_table
  ).

  IF del_file IS NOT INITIAL.
    o_main->delete_file(              " Deletas os arquivos 'COPIA'
      CHANGING
        ct_file_table = gt_file_table
    ).
  ENDIF.

  IF del_fold IS NOT INITIAL.
    o_main->delete_folder( ).         " Deleta a pasta
  ENDIF.
Comentários
0 Comentários

Nenhum comentário:

Postar um comentário