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.

quinta-feira, 6 de julho de 2017

Alterando Request já liberada - RDDIT076

*  Na marioria das vezes, o transporte de request realizado de forma 
* organizada, padronização de nomenclatura, destino, essas coisas,
*  Mas as vezes fazemos requests fora do padrão, aguardando alguma informação
* que complete essa nomenclatura padrão, o problema é quando liberamos 
* para essa mesma request transporte ( =( ), procurando na internet algo 
* que resolvesse isso encontrei o programa 'RDDIT076', esse mesmo programa 
* Faz a alteração de quase tudo sobre a request ( incluindo Status, caso 
* queira deixar modificavel(D) novamente ). A execução dela é bem simples
* mas como tudo.... MUITO CUIDADO. Para não mexer em algo que não devesse.

* Abaixo uns prints com o processo.

*  Primeiramente Com o numero da request reservada vamos na transação se38,
* colocar 'RDDIT076' e dar 'F8', apos executado informar a request.





*  Irá aparaecer uma tela com dados principais da request e as tasks da mesma,
* clique duas vezes, ou seleciona a request e aperte o botão de detalhamento.


segunda-feira, 26 de junho de 2017

Função - REUSE_ALV_POPUP_TO_SELECT

REPORT zreuse_alv_popup_to_select.
*--------------------------------------------------------------------*
* Fala pessoal, hoje irei mostrar algo que facilita muito escolhas de
* registro em massa em um ALV, para fazer isso usarei a função
* 'REUSE_ALV_POPUP_TO_SELECT' que irá exibir todas as opções de seleção
* em massa.
*  Estarei trabalhando com um exemplo simples que trará todos os objetos
* criados pelo usuário que executar o programa.
* A lista de opções de seleção de linhas do ALV será criada baseada nos
* tipos de objetos ( TADIR-OBJECT ).
* Espero que gostem desse metodo que ajudará muito na seleção de linhas
* do ALV, onde além de fazer linha por linha, será feito conforme range
* definido no PopUP.
*  Segue no final do código os prints do processo.
* Valeo.

* Tipos.
TYPES :
  BEGIN OF ty_tadir,
    selected.
        INCLUDE TYPE tadir.
TYPES :
  END OF ty_tadir.
TYPES :
  BEGIN OF ty_popup,
    select,
    text(50),
  END OF   ty_popup.

* Tabela global.
DATA :
  gt_popup    TYPE TABLE OF ty_popup.

* Variaveis referente ao ALVV
DATA :
* Objetos
  o_docking   TYPE REF TO cl_gui_docking_container,
  o_grid      TYPE REF TO cl_gui_alv_grid,
* Tabelas internas
  gt_tadir    TYPE TABLE OF ty_tadir,
  gt_fieldcat TYPE TABLE OF lvc_s_fcat,
  gt_exclude  TYPE TABLE OF ui_func,
* Estruturas
  gs_layout   TYPE lvc_s_layo.

* Ranges
DATA :
  r_object TYPE RANGE OF char20.

* Inicio do processo.
START-OF-SELECTION.

* Quando criarem a tela do ALV ( 9001 ) coloquem o código abaixo na tela.
*--------------------------------------------------------------------*
*PROCESS BEFORE OUTPUT.
*  MODULE :
*    status_9001,
*    inicialization_9001.
*
*PROCESS AFTER INPUT.
*  MODULE :
*    user_command_9001.
*--------------------------------------------------------------------*

* Tela ALV principal.
  CALL SCREEN 9001.

*&---------------------------------------------------------------------*
*&      Form  POPUP_COM_MULTIPLA_ESCOLHA
*&---------------------------------------------------------------------*
FORM popup_com_multipla_escolha .

  DATA :
    ls_popup      LIKE LINE OF gt_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_object     LIKE LINE OF r_object.

* Catalogo de campos do PopUp de opções.
  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.

* Exclusão dos botões padrões do ALV.
  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.

  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
    EXPORTING
      i_title               'Tipos de Objetos'
      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              gt_popup
    EXCEPTIONS
      program_error         1
      OTHERS                2.

  FREE r_object.
  IF gt_popup[] IS NOT INITIAL.
    LOOP AT gt_popup INTO ls_popup.
      IF ls_popup-select abap_true..
        ls_object-sign   'I'.
        ls_object-option 'EQ'.
        ls_object-low    ls_popup-text.
        APPEND ls_object TO r_object.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.

quinta-feira, 25 de maio de 2017

Função - DD_DOMVALUES_GET

REPORT valores_de_dominios.

*  Fala Pessoal, estou desenvolvendo um relatorio que irá trabalhar com
* informações de requests do ambiente, para um controle mais detalhado
* para a gerencia técnica e os mesmos me pediram pra colocar tudo sobre
* as requests e objetos incluindo os status deles, como na maioria dos
* textos sempre ficam em tabela separada conforme exemplo
* ( Ex1. MARA( Material ) -> MAKT ( Textos Material )
*   Ex2. J_1BDOCTYPES ( Tipo de documento ) -> J_1BDOCTYPEST ( Textos ... )
* Visualizando as tabelas pela transação SE16N é possivel ver a tabela de
* Textos referente a tabela consultada.



*  Isso facilita muito pegar os textos, mas as vezes os textos não estão em
* tabelas, estão implícitas dentro do dominio.




*  Perceba que na imagem acima não está informado o campo 'Tab. Valores'
* onde estaria a tabela dos possiveis textos, além disso, os textos descritivos
* estão diretamente no dominio.
*  Pra conseguir reservar essas informações que estão no dominio e só usar
* a função do titulo do post e pronto, rsrs.

*  Segue um codigo que fiz como exemplo onde alimento a tabela com
* informações de dois dominios, para que vocês percebam que a tabela
* de retorno é a mesma e dentro da mesma é definido uma chave (DOMNAME), 
* assim facilitando a busca.


segunda-feira, 13 de março de 2017

Debuggando processo em UPDATE TASK e SM13

REPORT update_task.
*--------------------------------------------------------------------*
*  Fala Galera, hoje vou mostrar como faz para debuggar processos em
* Update Task. Funções que são executadas em update Task são reservadas
* e são somentes processadas quando executada o commando 'COMMIT WORK',
* esse comando irá processar tudo pue ficou na pilha pra ser processado
* depois. Vamos lá.
* Observações : Estarei realizando essa demonstração com vocês com uma
* função muito importante de atualização de dados da Nota fiscal, mas
* logo no começo dela já tem uma validação do campo DOC_NUMBER, portanto
* não alimente esse campo, para não ter problemas de atualizar algo que
* não deveria.

*  Primeiramente para usar uma função em 'update task', a mesma, tem que
* ser uma função de atualização.




*  Agora coloque o código abaixo e vamos pros testes.
*  Primeira coisa que devemos fazer quando parar no primeiro 'break' e ir
* no menu 'Configurações->Modificar Configurações/Perfil Depurador' e entrar
* nessa janela abaixo



* 'Flag' o campo 'Depur. Atualização'.