quarta-feira, 21 de dezembro de 2011

'LEFT DELETING LEADING' e/ou 'RIGHT DELETING TRAILING'

  " As vezes precisamos trabalhar com valores que recebemos, principalmente
" para usar em Selects, funções e etc, mas temos que adaptar o valor no
" imput para não ter problema, abaixo segue um programa que mostra como
" os comandos LEFT DELETING LEADING' e 'RIGHT DELETING TRAILING' trabalham.
"  Debuggem e vejam o que acontece, mas vou dar uma resumo abaixo.

" 'LEFT DELETING LEADING' - Deleta o valor informado da Esquerda pra direita,
" quando chegar um valor diferente ele pára e fica com os dados alinhados a
" esquerda.
" 'RIGHT DELETING TRAILING' - Deleta o valor informado da direita pra
" esquerda, quando chegar um valor diferente ele pára e fica com os dados
" alinhados a direita.

REPORT zmj_ldl_rdt.

" Variáveis.
DATA varia1 TYPE string VALUE '000011110000111',
       varia2 TYPE string VALUE '010101010101010',
       varia3 TYPE string VALUE '000000000000001',
       varia4 TYPE string VALUE '100000000000000',
       varia5 TYPE string VALUE '111111111011111'
       .

" Tela de seleção.
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

PARAMETERS :
" Elemento de texto = 'LEFT DELETING LEADING'
rb_left  RADIOBUTTON GROUP rb_1 DEFAULT 'X',
" Elemento de texto = 'RIGHT DELETING TRAILING'
vb_right RADIOBUTTON GROUP rb_1
.

SELECTION-SCREEN END OF BLOCK   b1.
*&---------------------------------------------------------------------*

" Inicio do processo.
START-OF-SELECTION.

IF rb_left 'X'.
  PERFORM zf_left.
else.
  PERFORM zf_right.
ENDIF.

sexta-feira, 16 de dezembro de 2011

Função - SUSR_USER_READ

  *&---------------------------------------------------------------------*
"  Caso um dia precise trazer o email de algum usuário, então teremos que
" usar este função que pelo ID do usuário você consegue os campos chaves
" para fazer a busca dentro da tabela de Emails ( ADR6 ).

REPORT zmj_susr_user_read.

" Declaração estrutura
DATA st_address TYPE usaddress,
       st_adr6    TYPE adr6
       .

" Inicio.
START-OF-SELECTION.

PERFORM zf_busca_personal_number,
          zf_busca_email,
          zf_show_all.


*&---------------------------------------------------------------------*
*&      Form  ZF_BUSCA_PERSONAL_NUMBER
*&---------------------------------------------------------------------*
form ZF_BUSCA_PERSONAL_NUMBER .

"  Aqui estaremos executando a função, eu estou usando o sy-uname ( nome
" do usuário logado) mas caso queira saber de outro usuário que não seja
" voce é só colocar um parametro numa tela de seleção para que possa ser
" alimentado pelo usuário.

CALL FUNCTION 'SUSR_USER_READ'
  EXPORTING
    user_name            sy-uname
  IMPORTING
    user_address         st_address
  EXCEPTIONS
    user_name_not_exists 1
    internal_error       2
    OTHERS               3.

endform.                    " ZF_BUSCA_PERSONAL_NUMBER

*&---------------------------------------------------------------------*
*&      Form  ZF_BUSCA_EMAIL
*&---------------------------------------------------------------------*
form ZF_BUSCA_EMAIL .

"  Seleciona os dados de email do usuário pelo numero endereço e numero
" pessoal do usuário dentro do SAP.
SELECT SINGLE *
  FROM adr6
  INTO st_adr6
  WHERE addrnumber st_address-addrnumber
  AND   persnumber st_address-persnumber.

endform.                    " ZF_BUSCA_EMAIL

*&---------------------------------------------------------------------*
*&      Form  ZF_SHOW_ALL
*&---------------------------------------------------------------------*
form ZF_SHOW_ALL .

"  Mostra tudo rsrs, prestem atenção que eu coloquei (60) no final do campo
" que está o email porque este campo tem o tipo char(241) e por causa do
" tamanho da pagina a informação ficaria na linha abaixo se eu não colocasse
" este (60) no final limitando o tamanho do campo.

WRITE 'O email do Usuário'sy-uname ' é : 'st_adr6-smtp_addr(60).

endform.                    " ZF_SHOW_ALL

Função - MONTH_NAMES_GET

"  Agora vou passa pra vocês uma função muito facil e simples, ela traz
" os meses conforme a lingua que informar, tive que dar manutenção num
" programa onde eu teria que mostrar um relatorio onde o Titulo 'mês' estava
" em 'hardcode', mas o programa seria usado em varios paises e teria que
" mostrar conforme a lingua do acesso, então alem de criar elementos de
" textos e traduzí-los, preferi usar essa função e dar 'read table' na
" tabela it_mes e trazer os campos 'KTX' e 'LTX'.

REPORT zmj_month_names_get.

* Tipos
TYPES BEGIN OF ty_mes.
        INCLUDE STRUCTURE t247.
TYPES END   OF ty_mes.

* Tabela Internas
DATA it_mes TYPE TABLE OF ty_mes.

* Estruturas
DATA st_mes TYPE          ty_mes.

START-OF-SELECTION.

  PERFORM zf_month_names_get.

*&---------------------------------------------------------------------*
*&      Form  ZF_MONTH_NAMES_GET
*&---------------------------------------------------------------------*
FORM zf_month_names_get .

"  Executem uma vez com sy-langu e depois execute mudando o mesmo pra
" verem como retorna a tabela.
BREAK-POINT.

  CALL FUNCTION 'MONTH_NAMES_GET'
    EXPORTING
      language              sy-langu
    TABLES
" Tabela que receberá as informações.
      month_names           it_mes
    EXCEPTIONS
      month_names_not_found 1
      OTHERS                2.

  BREAK-POINT.
" Sussa né?

ENDFORM.                    " ZF_MONTH_NAMES_GET

segunda-feira, 5 de dezembro de 2011

OO - Herança

  *&---------------------------------------------------------------------*
"  Uma das grande vantagens da OO e a criação de classe que herdam informações
" de uma classe mais generica, fazer isso de se chama 'Hierarquia' que é
" passar atributos de uma classe generica ( classe mãe ) para uma classe mais
" especifica ( classe filho ).
"  Existe a classe Carro, mas existem varios tipos de carros... F1, kart, truck,
" e assim vai, mas todos tem os atributos de um carro como velocidade, rodas,
" modelo, mas seus atributos podem variar conforme o tipo de carro, aki nos
" vamos usar a velocidade como diferencial... mas primeiro vamos criar uma
" classe filho chamada 'ZCL_KART' conforme abaixo.
" Ahhhhh  antes disso tudo na classe mãe (ZCL_CAR) vá na aba 'Caract.' é tire
" o flag do campo 'Final', pois quando isso está com flag significa que ele não
" deixa ninguem herdar dele.



"  Entrem no aba 'Atributos' e verá que só existe o atributo 'Velocidade',
" não sei se vc se lembra mas a visibilidade deste atributo é 'Protect',
" porisso vc vê, rsrs vou explicar melhor a visibilidade de atributos...
" Private - Somente aquela classe consegue visualizar.
" Protect - Somente aquela classe e suas classes filha conseguem visualizar.
" Public  - Todo mundo visualiza. rs.

"  Agora entre na aba 'Metodos' o esquema de visibilidade e a mesma ideia.
"  Todos o metodos criados antes eram 'Public' porisso aparecem aki,

"  Perceba que o nome dos 'Atributos' e dos 'Metodos' estão em azul, o que
" mostra que aquilo não é da atual classe, pra ver somente o que é desta
" classe é soh colocar um flag no campo Filtro marcado na imagem abaixo.
"  Portanto a classe filha tem todos os Atributos 'Protect' e 'Public' da
" classe mãe, juntamente com todos os metodos 'Protect' e 'Public', mas
" não sei se vc concorda mas a velocidade que um carro é diferente da
" velocidade de um Kart portanto eles tem uma acelereção diferente, pois
" é isso que vamos fazer agora, usar o mesmo metodos de forma diferente
" pois a classe mesmo sendo filha e diferente da classe mãe.



" Clicando duas vezes na classe 'AUMENTA_VELO' você, logo de cara, verá
" que ele informa pra vc que aquele 'Metodo' e da classe mãe, portanto
" teremos que redefinir o metodo.
"  Para redefinir devemos selecionar o metodo e clicar no botão 'Redefinir'
" conforme na imagem acima. ( caso queira tirar a redefinição criada e só
" clicar nesse botão com uma setinha branca, do lado redefinir.)
" Coloque o código abaixo e volte.

*&---------------------------------------------------------------------*
method AUMENTA_VELO.
*CALL METHOD SUPER->AUMENTA_VELO
*    .

      add 3 to me->velocidade.
endmethod.
*&---------------------------------------------------------------------*

"  Agora execute o código abaixo e depois execute denovo só que trocando a
" classe de referencia do objeto.
"  Debbugem e veram que o metodo 'AUMENTA_VELO' reage de forma diferente 
" dependendo da classe mesmo sendo o mesmo metodo, dahora neh...



REPORT  zmj_oo_herança.

" Refenreciei um objeto a uma classe mas este objeto ainda não existe.
DATA: o_veiculo TYPE REF TO zcl_kart.

BREAK-POINT.

"  Agora o objeto tá criado, clique duas vezes neste objeto e vc verá seus
" atributos.
CREATE OBJECT o_veiculo.

" Metodo que informa a marca do carro.
CALL METHOD o_veiculo->set_marca
  EXPORTING
    marca = 'VW'.

BREAK-POINT.

" Faça três vezes ...
DO 3 TIMES.
" Metodo que adiciona +2 cada vez que executado.
  CALL METHOD o_veiculo->aumenta_velo.
ENDDO.

BREAK-POINT.