quinta-feira, 3 de novembro de 2011

Enhancements - Modificando o Standard

  "  Bem galera, vou mostrar algo que é muito importante que são as melhorias
" e aplicações em programas standards, conhecidos como enhancements.
"  Os enhancements servem para colocar algum processo, ou para trazer
" informações de objetos standards sem modificar o código.

"  Para começar a fazer isso você deve saber primeiro indentificar o lugar
" mas só isso não adianta, depois de identificar você deve encontrar os
" 'enhancements points' que são pontos dentro do programa onde você pode
" colocar o código. Para encontrar faça :
"  Primeiramente clique no botão 'Enhance' pra começa a trabalha com as
" melhorias.


 

"  Após isso, vá no menu 'Edit/ Enhanciments Operations / Show Implicit
" enhancements options'




"  Fazendo isso irá mostrar algumas linhas cheias de aspas duplas tipo
" assim """"""" ... Clicando com o botão direito neles aparecerá a opção
" 'enhancements implementetion/create' conforme abaixo.








" Agora eh soh criar, o enhanciment, caso queira crie o 'composite enhancement
" implementation' para uma melhor organização.



"  Falando em organização não faça que nem eu fiz.... crie um include pra
" ficar mais organizado e facil de dar manutenção, sem conta que é muito feio
" ver todo akele código no meio do standard.
"  Este brinquedinho e muito útil mas não sai testando em programas standards 
" sem o conhecimento do chefe rsrsrs... portanto pra treinar faça num programa
" 'Z' mesmo, oq não faz muito sentido, eu sei, mas para prática está otimo.

quinta-feira, 27 de outubro de 2011

Tela de seleção Dinâmica

  "  Tem uma dica de tela que todo o usuário gosta, que é deixar a tela dinâmica
" mostrando somente o que o usuário precisa conforme a necessidade, o código é
" simples e é um tipo de código muito usado, segue código abaixo.

REPORT zmjdinamicscreen.

" Tabelas transparentes ...
TABLES :
  ekko,
  ekpo
  .

" Constantes ...
CONSTANTS :
  c_r1(02)     TYPE c VALUE 'R1',           "Grupo campo tela seleção
  c_r2(02)     TYPE c VALUE 'R2'            "Grupo campo tela seleção
.

" Tela de seleção ...

*text-p03 = Opções de Processamento
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-p03.
PARAMETERS:
"  Olhem esse negocio de 'user command' é isso que informa que deve realizar
" alguma coisa antes de continuar,
  p_blc1    RADIOBUTTON GROUP gp01 DEFAULT 'X'
                             USER-COMMAND radio,
  p_blc2    RADIOBUTTON GROUP gp01
  .
SELECTION-SCREEN END OF BLOCK b1.


SELECTION-SCREEN BEGIN OF BLOCK b2.
PARAMETERS:
"  Aqui eu criei um parameters normal mas eu criei um ID para ele,
" informando que o campo 'group1' deste parameters recebe o valor 'r2'
" separando-o dos outros objetos da tela de seleção.
  p_bloc1  TYPE file_table-filename DEFAULT 'Bloco 1'
    MODIF ID r2
  .
SELECTION-SCREEN END   OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3.
PARAMETERS:
"  Fiz igualzinho ao de cima mas agora o valor e diferente, tendo o 'r1'
" para o campo 'group1' de cada parameters abaixo.
  P_bloc21  TYPE file_table-filename DEFAULT 'Bloco 21'
      MODIF ID r1,
  P_bloc22  TYPE file_table-filename DEFAULT 'Bloco 22'
      MODIF ID r1,
  P_bloc23  TYPE file_table-filename DEFAULT 'Bloco 23'
      MODIF ID r1
  .
SELECTION-SCREEN END   OF BLOCK b3.


*----------------------------------------------------------------------*
* At Selection-Screen                                                  *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* Conforme opção de processamento, desabilita campos da tela.

  IF NOT p_blc1 IS INITIAL.
    PERFORM f_controla_tela USING c_r2.
  ELSE.
    PERFORM f_controla_tela USING c_r1.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  f_controla_tela
*&---------------------------------------------------------------------*
*       Mostra e oculta os campos  da tela de seleção conforme opção
* de processamento escolhido
*----------------------------------------------------------------------*
*      -->p_campo    Campo que deve se habilitado
*----------------------------------------------------------------------*
FORM f_controla_tela USING p_campo TYPE c.

" Dá o loop em cada objeto da tela.
  LOOP AT SCREEN.

" Condicão para ativar ou desativar, Mostra ou não mostra na tela .
    IF screen-group1 NE p_campo AND
     NOT screen-group1 IS INITIAL.
      screen-active = 0.
    ELSE.
      screen-active = 1.
    ENDIF.

    MODIFY SCREEN.
  ENDLOOP.

ENDFORM.                    " f_controla_tela

quarta-feira, 26 de outubro de 2011

Função - TMP_GUI_DIRECTORY_LIST_FILES

  *&---------------------------------------------------------------------*
"  As vezes devemos trabalhar com arquivos que estão na rede, sabendo
" o endereço do diretório; com esta função você consegue listar os arquivos
" e pastas que existem no mesmo.

REPORT zmjteste.

" Diretório : ...
PARAMETERS: p_dir TYPE file_table-filename.

" Variáveis ...
DATA: v_title      TYPE string,              "Título da Janela
      v_folder     TYPE string,              "Diretório selecionado
      vg_filecount TYPE i,
      vg_dircount  TYPE i,
      it_filetab   TYPE TABLE OF sdokpath,
      it_dirtable  TYPE TABLE OF sdokpath
      .
" At select ....
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dir.
  PERFORM f_busca_arquivo CHANGING p_dir.

" Start-of-selection ...
START-OF-SELECTION.

  PERFORM :
  " pega os arquivos e pastas do diretório informado.
    f_get_files,
  " mostra os mesmos.....
    f_show_this.

*&---------------------------------------------------------------------*
*&      Form  F_BUSCA_ARQUIVO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_DIR  text
*----------------------------------------------------------------------*
FORM f_busca_arquivo  CHANGING p_file  TYPE file_table-filename.


  CLEAR: v_title, v_folder.

* Monta título da Janela:
* Msg: Selecione a Pasta Desejada para gravação do arquivo e Clique no
* Botão [OK]
  MOVE text-001 TO v_title.

* Chamada da janela para busca de diretório
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      window_title         = v_title
      initial_folder       = 'C:/'
    CHANGING
      selected_folder      = v_folder
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

* Se não executou abertura com sucesso
  IF sy-subrc NE 0.

*   Msg: Erro na busca do diretório.
    MESSAGE i836(sd) WITH text-002.

* Retornando o diretório ao campo da tela de seleção
  ELSE.
    MOVE v_folder TO p_file.
  ENDIF.

ENDFORM.                    " F_BUSCA_ARQUIVO

*&---------------------------------------------------------------------*
*&      Form  F_GET_FILES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_get_files .

  CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
    EXPORTING
      directory  = p_dir  " Diretório
      filter     = '*.*'  " Tipo de arquivo
    IMPORTING
      file_count = vg_filecount
      dir_count  = vg_dircount
    TABLES
      file_table = it_filetab  " Tabelas com os arquivos
      dir_table  = it_dirtable " Tabela com as pastas
    EXCEPTIONS
      cntl_error = 1
      OTHERS     = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    " F_GET_FILES


*&---------------------------------------------------------------------*
*&      Form  F_SHOW_THIS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_show_this .

  DATA : st_filetab  LIKE LINE OF it_filetab,
         st_dirtable LIKE LINE OF it_dirtable.

  WRITE : / 'Arquivos', / .
  LOOP AT it_filetab INTO st_filetab.
    WRITE : / st_filetab-pathname.
  ENDLOOP.

  WRITE :  / , / 'Pastas', / .
  LOOP AT it_dirtable INTO st_dirtable.
    WRITE : / st_dirtable-pathname.
  ENDLOOP.

ENDFORM.                    " F_SHOW_THIS

Soma por chave ( COLLECT )

  *&---------------------------------------------------------------------*
"  Se tiver querendo somar algo por alguma chave, usamos o 'COLLECT' ele
" funciona como um 'APPEND' mas antes de coloca o registro na tabela ele
" verifica se já existe este registro, se existir ( conforme chave ) é
" feito a adição do registro somando o ultimo campo.

" A chave são todos os campos anteriores, portanto se ele encontrar algo
" diferente neste campos isso é considerado outro registro.

report zmjcollect.

" Tipos ...
" Tipo a - Chaves ( carrid, connid, fldate )
TYPES :
  BEGIN OF ty_soma_a,
    carrid TYPE sflight-carrid,
    connid TYPE sflight-connid,
    fldate TYPE sflight-fldate,
    price  TYPE sflight-price,
  END OF   ty_soma_a,

" Tipo b - Chaves ( carrid, connid )
  BEGIN OF ty_soma_b,
    carrid TYPE sflight-carrid,
    connid TYPE sflight-connid,
    price  TYPE sflight-price,
  END OF   ty_soma_b
  .

" Tabelas internas ...
data : it_sflight TYPE TABLE OF sflight,
       it_sfsomaa TYPE TABLE OF ty_soma_a,
       it_sfsomab TYPE TABLE OF ty_soma_b
       .

" Estruturas ...
data : st_sflight TYPE sflight,
       st_sfsomaa TYPE ty_soma_a,
       st_sfsomab TYPE ty_soma_b
       .

BREAK-POINT.


" Alimentação da tabela principal
SELECT *
  from sflight
  into TABLE it_sflight
  UP TO 100 rows
  .

" Ordenando tabela principal conforme condições
sort it_sflight by carrid ASCENDING
                   connid ASCENDING
                   fldate ASCENDING
                   .

" Loop na tabela principal
  LOOP AT it_sflight INTO st_sflight.
" Movo os campos correspondentes da estrutura principal para uma estrut. aux.
" que é do mesmo tipo que a tabela do 'Collect'.
    MOVE-CORRESPONDING st_sflight to st_sfsomaa.
" Aqui tah a mágica
    COLLECT st_sfsomaa INTO it_sfsomaa.

" Movo os campos correspondentes da estrutura principal para uma estrut. aux.
" que é do mesmo tipo que a tabela do 'Collect'.
    MOVE-CORRESPONDING st_sflight to st_sfsomab.
" Aqui tah a mágica (dinovo)
    COLLECT st_sfsomab INTO it_sfsomab.

  ENDLOOP.

" Ordenando as tabelas auxiliares.
  SORT : it_sfsomaa,
         it_sfsomab
         .

  BREAK-POINT.

terça-feira, 25 de outubro de 2011

Campos a mais que o 'Default'

  *&---------------------------------------------------------------------*
"  Como sempre precisamos selecionar campos que estão em tabelas transpa-
" rentes, então criamos uma tabela interna e uma estrutura com o mesmo tipo
" que a tabela transparente, mas as vezes precisamos incluir campos que não
" existem nessa tabela, pra fazer isso usamos o comando 'INCLUDE STRUCTURE'
" na declaração do tipo conforme abaixo.

REPORT zfield_ex.

" Tipos
"  Reparem aonde começa e termina o tipo.
TYPES BEGIN OF ty_eban.
"  Inclusão dos campos da tabela EBAN no tipo TY_EBAN
        INCLUDE STRUCTURE eban.
"  Inclusão do campo saldo SALDOQ no tipo TY_EBAN
TYPES  : saldoq TYPE c,
      END OF   ty_eban.


" Tabela interna.
data : it_eban TYPE TABLE OF ty_eban.


BREAK-POINT.

SELECT *
  from eban
  into TABLE it_eban.

BREAK-POINT.

**&---------------------------------------------------------------------*
*" Se quiserem também pode declarar direto a tabela, mas eu não aconselho,
*" porisso eu deixei comentado mais como item de curiosidade rsrs, é que
*" programas standards as vezes usam.
*
*data BEGIN OF it_eban_direto.
*    include STRUCTURE eban.
*data: teste TYPE mara-matnr,
*     END OF   it_eban_direto
*  .
**&---------------------------------------------------------------------*

quarta-feira, 12 de outubro de 2011

Field Symbol - Tabela dinâmica

  *&---------------------------------------------------------------------*
"  Tem uma maneira muito interessante pra quem gosta de resolver as coisas
" de uma forma mais rápida é usando o 'Field-Symbol' que serve como um link
" com algum objeto ou area de memória, mostrarei uma jeito legal pra aplicar
" o 'field-Symbol'.

"  Irei mostrar como modificar dados de uma tabela interna da forma tradici-
" onal e da forma rápida (dinâmica).

REPORT  z_field_symbol.

" Declaração da tabela interna e da estrutura.
DATA : it_spfli TYPE TABLE OF spfli,
       st_spfli TYPE          spfli
       .

" Alimenta a tabela interna .
SELECT *
  FROM spfli
  INTO TABLE it_spfli
  .

" Aqui está a forma tradicional, muito eficaz, mas normal rsrsrs
LOOP AT it_spfli INTO st_spfli.

  st_spfli-fltype 'X'.
  modify it_spfli from st_spfli.

ENDLOOP.


" Aqui da forma mais rápida e dinâmica.
" Declaração dos fields symbols.
FIELD-SYMBOLS : <fs2> type spfli.

BREAK-POINT .

** Altera dinamicamente os dados da tabela interna.
LOOP AT it_spfli ASSIGNING <fs2>.
  <fs2>-fltype 'X'.
" Reparem bem que não existe nenhum modify.
ENDLOOP.

segunda-feira, 10 de outubro de 2011

Função - Read Text

  *----------------------------------------------------------------------*
"  Função usada para trazer o texto dos objetos, lembrado que caso vc não
" saiba id do texto, procure na tabela transparente TTXIT que nesta tabela
" mostra todas as informações de chaves para trazer o texto.

REPORT zmj_read_text.

"
data : c_id_c   TYPE tdid     VALUE 'F01',  " ID de texto (cabec)
       v_nm_txt TYPE thead-tdname,          " Chave de busca do Texto Cabec
       c_obj_c  TYPE tdobject VALUE 'EKKO'" obj. de aplicação (cabec)
       it_lines TYPE TABLE OF tline,        "linhas de textos (cabec)
       st_lines TYPE          tline
       .


PERFORM f_bapi_texto_cabec USING '0000000001'.


FORM f_bapi_texto_cabec USING v_nm_txt.

** O nome do texto (chave) é o Nº do documento de compras
*  v_nm_txt = '0000000001'.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = c_id_c
      language                = sy-langu
      name                    = v_nm_txt
      object                  = c_obj_c
    TABLES
      lines                   = it_lines
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.


BREAK-POINT.


  IF sy-subrc EQ 0.

    LOOP AT it_lines INTO st_lines.
      WRITE  st_lines.
    ENDLOOP.

* Gera mensagem de informação no Log de Processamento
  ELSE.

    MESSAGE 'Texto não encontrado' TYPE 'I'.

  ENDIF.

ENDFORM.                    " f_bapi_texto_cabec

Relacionamento de tabelas

  "  Um dos grandes problemas de um Abap é saber o relacionamento entre as
" tabelas que você está trabalhando, qual é o header, qual é o item, aonde 
" eu pego a informação disso, quais são as chaves que devo usar na cláusula 
" 'where' do meu 'For all entries', bem..... tem em bastante lugar um 
" arquivo .pdf com os relacionamentos de tabelas mais usadas, mas eu irei
" mostrar como faz pra ver esse relacionamento dentro do SAP mesmo,
" Iremos primeiro na transação se11, e colocar no campo tabela TTXIT   


 

"  Dentro da tela principal do tabela veremos que existe um botãozinho que
" está do lado do botão 'conteúdo', chamado 'Gráfico', conforme imagem abaixo.





" Após clicar neste botão irá aparecer está tela.





" Esta tela mostra a tabela que você está, e todas as outras tabelas q fazem
" contato com ela, eu peguei a tabela TTXIT porque eu sabia que a relação era
" pequena, mas todas as tabelas têm, peguem uma tabela grande como mara ou
" kna1 pra vocês verem o relacionamento monstro que tem.. rsrs
"  Se forem atentos vocês perceberam que existe uma linha que conecta as 
" tabelas umas com as outras, clique duas vezes nessa linha...



"  Prontinho, nesta tela você consegue visualizar os campos que fazem o 
" relacionamento entre as duas tabelas assim.

"  Desse jeito que eu mostrei a gente consegue visualizar as tabelas que 
" fazem relação com a tabela principal e ainda mostra as chaves de relaciona-
"mento entre elas, isso pode ajudar muito você em seus selects porai.

"  Espero ter ajudado vocês, continuem mandando emails com sugestões e opniões,
" prometo que estarei atendendo o máximo possivel.. t+.