" 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.
quarta-feira, 21 de dezembro de 2011
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
" 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
" 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.
" 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.
Assinar:
Postagens (Atom)