Documente Academic
Documente Profesional
Documente Cultură
Sumário
1 Prefácio
2 Memória eidética: O mundo procedural
2.1 Definição dos dados
2.2 Definição da lógica
2.3 Refletindo sobre as definições no mundo procedural
2.3.1 Divisão de responsabilidades
2.3.2 Reaproveitamento de código
2.3.3 Testes Unitários
2.3.4 Encapsulamento
2.3.5 Falsos mitos sobre as vantagens de OO
2.4 O TOP Include do Grupo de Função
3 Conceitos básicos
3.1 Classes
3.2 Referências
3.3 Objetos (ou instâncias)
3.4 O processo de construção e destrução de um objeto
3.4.1 Criação de objetos
3.4.2 Destruição de Objetos e o Garbage Collector
3.4.3 Tabela interna de referências
3.4.4 LIKE REF TO
3.5 Atributos
3.6 Métodos
4 Conceitos intermediários
4.1 Construtores
4.1.1 Construtor de Instância
4.1.2 Construtor estático (ou de classe)
4.2 Auto‐referência “me”
4.3 Sessões de visibilidade
4.3.1 PUBLIC SECTION
4.3.2 PRIVATE SECTION
4.4 Atributos e Métodos de Instância vs Estáticos
1
Orientação a Objetos em ABAP
Cópia de Marcos
2
Orientação a Objetos em ABAP
Cópia de Marcos
1 Prefácio
Este livro foi criado no ano de 2016 para tentar solucionar um problema
que deveria na opinião do autor ter sido resolvido por volta de uma
década antes: o problema de ainda haver desenvolvedores ABAP sem o
conhecimento necessário em orientação a objetos para exercer com
sucesso suas atividades no dia‐a‐dia.
Mas mesmo que tal pessoa nunca tenha tido dificuldades para
implementar BAdI’s, será que esta pessoa recebe outros tipos de
demanda das 8 as 5? Será que ela é alocada em projetos que envolvem
coisas diferentes ou modernas e até mesmo obrigatórias para quem quer
se considerar um desenvolvedor ABAP sério?
3
Orientação a Objetos em ABAP
Cópia de Marcos
A quem diga que o ABAP não é orientado a objetos pois não tem todos os
recursos que o Java tem. Se encontrar alguém na rua que lhe diga tal
blasfêmia (palavra mais próxima do que o autor gostaria de dizer
encontrada) diga a ela que Java não implementa todos os recursos de
orientação a objetos do SmallTalk, que foi criado em 1969. Encerre a
conversa neste ponto para não perder o amigo.
Caso você queira continuar sua jornada como ABAP, continue na próxima
página.
4
Orientação a Objetos em ABAP
Cópia de Marcos
5
Orientação a Objetos em ABAP
Cópia de Marcos
6
Orientação a Objetos em ABAP
Cópia de Marcos
Esta boa prática permite que deixemos o código mais legível, adaptável e
reutilizável.
➔ Legível pois fica fácil saber o que a função espera de nós para que
ela funcione.
➔ Adaptável pois não precisamos alterar algo que está fora da função
para poder alterar o seu comportamento
➔ Reutilizável pois podemos passar os mesmos parâmetros em
diferentes lugares para ter o mesmo efeito. Tais lugares podem ser
simplesmente diferentes pontos na mesma aplicação (bom cenário
para rotinas locais) ou até em aplicações diferentes (bom cenário
para o uso de módulos de função).
7
Orientação a Objetos em ABAP
Cópia de Marcos
Algumas rotinas servem para calcular enquanto outras servem para exibir
um resultado.
2.3.4 Encapsulamento
Apesar de ser um termo constantemente usado na orientação a objetos, o
mundo procedural também provê encapsulamento. Um report que chama
uma função de seleção de dados não precisa conhecer nada além dos
parâmetros necessários para fazer a chamada. Se internamente a função
faz 1 ou 15 SELECTs não é possível descobrir lendo somente o trecho de
código do programa que contém a instrução CALL FUNCTION.
8
Orientação a Objetos em ABAP
Cópia de Marcos
O que será discutido nesta sessão com certeza deveria ser sabido por
quem já trabalha com ABAP há algum tempo, mas me arrisco em dizer
que a importância dado a tal conhecimento é de certa forma ignorado ou
menosprezado.
9
Orientação a Objetos em ABAP
Cópia de Marcos
O TOP Include acaba sendo tão usado e importante, que será estudado
em detalhes. Como geralmente ele é usado no começo de uma aplicação,
recebe tal nome diferenciado. Geralmente o desenvolvedor ABAP está
acostumado a trabalhar com TOP Includes em programas executáveis
(report) e pools de módulos (“online”)
. Contúdo, tais includes também
estão presentes em grupos de função.
*******************************************************************
*
System
defined
Include
files
.
*
*******************************************************************
INCLUDE LZOO_FGTOP
.
" Global Data
INCLUDE LZOO_FGUXX
.
" Function Modules
10
Orientação a Objetos em ABAP
Cópia de Marcos
*******************************************************************
*
User
defined
Include
files
(
if
necessary
).
*
*******************************************************************
*
INCLUDE LZOO_FGF
...
" Subroutines
*
INCLUDE LZOO_FGO
...
" PBOModules
*
INCLUDE LZOO_FGI
...
" PAIModules
*
INCLUDE LZOO_FGE
...
" Events
*
INCLUDE LZOO_FGP
...
" Local class implement.
*
INCLUDE LZOO_FGT99
.
" ABAP Unit tests
Grupo de Função ZOO_FG
FUNCTION
POOL zoo_fg
.
"MESSAGEID ..
*
INCLUDE LZOO_FGD
...
" Local class definition
DATA v_count TYPE i.
Include LZOO_FGTOP
FUNCTION Z_OO_INCREMENT_COUNTER.
ADD
1
TO v_count.
ENDFUNCTION.
Módulo de Função Z_OO_INCREMENT_COUNTER
11
Orientação a Objetos em ABAP
Cópia de Marcos
FUNCTION Z_OO_GET_COUNTER
EXPORTING
EX_COUNT TYPE I.
ex_count
=
v_count.
ENDFUNCTION.
Módulo de Função Z_OO_GET_COUNTER
1
Não considera‐se aqui o acesso a variável na pilha de execução via FIELD‐SYMBOLS e o comando
ASSIGN
12
Orientação a Objetos em ABAP
Cópia de Marcos
Vamos agora criar uma aplicação simples que chama tais módulos de
função. Nosso foco será em entender o que acontece com a variável
v_count contida dentro do grupo de funções ‐ mesmo que do ponto de
vista da aplicação nem se saiba da sua existência.
REPORT zoo_fg_caller.
DATA current_value TYPE i.
DO
5
TIMES.
CALL FUNCTION
'Z_OO_GET_COUNTER'
IMPORTING
ex_count
=
current_value.
WRITE
/
current_value.
CALL FUNCTION
'Z_OO_INCREMENT_COUNTER'.
ENDDO.
Programa ZOO_FG_CALLER
➔ DESAFIO !!!
Você consegue imaginar qual seria a saída do programa?
2
Tais variáveis poderiam ser acessadas por telas e outros includes definidos no grupo de função, caso
existissem.
13
Orientação a Objetos em ABAP
Cópia de Marcos
14
Orientação a Objetos em ABAP
Cópia de Marcos
Assim que algum módulo de função deste é chamado. Logo, não importa
qual foi o primeiro grupo de função chamado. Antes da chamada ser de
fato realizada o ABAP aloca todo o grupo de função em memória: isso
incluir as variáveis definidas no TOP include do grupo de função.
15
Orientação a Objetos em ABAP
Cópia de Marcos
Tal procedimento funciona, mas é considerado aqui inviável uma vez que
quanto mais variáveis temos, mais comandos CLEAN/REFRESH/FREE
devemos executar, além de ser necessário chamar o módulo responsável
pela limpeza explicitamente.
16
Orientação a Objetos em ABAP
Cópia de Marcos
3 Conceitos básicos
É preciso entender que a orientação a objetos não muda as demandas que
já temos como desenvolvedor, ela simplesmente muda a forma como as
entregamos.
3.1 Classes
Comparado ao mundo procedural, uma classe seria o mais próximo de um
grupo de funções. Todavia existem muitas diferenças. Para evitar
comparações num nível técnico, tentarei deixar a apresentação deste
importante conceito um pouco mais lúdica.
17
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda DEFINITION.
ENDCLASS.
Exemplo de classe
18
Orientação a Objetos em ABAP
Cópia de Marcos
3.2 Referências
Agora que temos uma classe o mais básica possível, precisamos saber o
que é possível fazer com ela e a resposta para este caso é: não muito.
Conforme dito antes, uma classe é como se fosse uma forma de bolo.
Para fazer o bolo precisamos usar as mãos: independente se for para
quebrar os ovos e batê‐los ou para abrir a caixa com o bolo em pó pronto.
Uma referência é como uma mão que segura um (e somente um) bolo. A
nossa mão pode não estar segurando um bolo e do mesmo modo uma
referência pode não estar com objeto algum.
Uma vez que tenhamos posse de uma forma (classe), usamos nossas mãos
para enchermos a forma quantas vezes quisermos.
Da mesma maneira que uma forma de bolo pode ser usada por diversas
pessoas, precisamos declarar quais mãos manipularão quais formas.
DATA
:
r_ordem_a TYPE REF TO lcl_ordem_de_venda,
r_ordem_b TYPE REF TO lcl_ordem_de_venda,
r_ordem_c TYPE REF TO lcl_ordem_de_venda,
r_ordem_d LIKE r_ordem_c.
Referências a classes
19
Orientação a Objetos em ABAP
Cópia de Marcos
Sim, criadas com a variação REF TO. Isso quer dizer que são variáveis que
internamente guardam o endereço de memória de outras variáveis.
TYPES tt_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.
DATA
:
v_i TYPE i,
v_string TYPE
string,
v_num_10 TYPE numc10,
wa TYPE syst,
itab TYPE tt_mara.
20
Orientação a Objetos em ABAP
Cópia de Marcos
BREAK
POINT
.
" Debug a partir daqui
v_i
=
10.
v_string
=
'Orientação a Objetos'.
v_num_10
=
'01234'.
wa
=
sy.
SELECT
*
FROM mara INTO TABLE itab.
Preenchimento de objetos de dados comuns (variáveis, work area e
tabela interna)
21
Orientação a Objetos em ABAP
Cópia de Marcos
TYPES tt_mara TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.
DATA
:
r_i TYPE REF TO i,
22
Orientação a Objetos em ABAP
Cópia de Marcos
r_string TYPE REF TO
string,
r_num_10 TYPE REF TO numc10,
r_wa TYPE REF TO syst,
r_itab TYPE REF TO tt_mara.
BREAK
POINT
.
" Debug a partir daqui
CREATE DATA:
r_i,
r_string,
r_num_10,
r_wa,
r_itab.
r_i
>*
=
10.
r_string
>*
=
'Orientação a Objetos'.
r_num_10
>*
=
'01234'.
r_wa
>*
=
sy.
SELECT
*
FROM mara INTO TABLE r_itab
>*.
Criação de refências e preenchimento de objetos de dados a que elas se
referem (variáveis, work area e tabela interna)
Temos agora não 5 variáveis porém 10. Cinco delas ainda são as variáveis
anteriores porém para ter acesso a elas agora precisamos usar 5
referências que nos levam até de fato o endereço de memória delas.
23
Orientação a Objetos em ABAP
Cópia de Marcos
24
Orientação a Objetos em ABAP
Cópia de Marcos
Caso você tente usar uma referência ainda não criada na sua aplicação
(usar ‐>* sem antes ter realizado o comando CREATE), um DUMP ocorre.
➔ Checkbox REF TO
Em diversas transações de desenvolvimento, existe um checkbox chamado
REF TO, justamente que define se o que está sendo criada é um
tipo/variável simples ou uma referência a algo.
25
Orientação a Objetos em ABAP
Cópia de Marcos
CREATE OBJECT
:
r_ordem_a,
r_ordem_b TYPE lcl_ordem_de_venda.
r_ordem_c
=
NEW lcl_ordem_de_venda
(
).
Criação de objetos
DATA
(
r_ordem_e
)
=
NEW lcl_ordem_de_venda
(
).
26
Orientação a Objetos em ABAP
Cópia de Marcos
Sem dúvida alguma, esta sessão é uma das mais importantes deste livro.
Não passe para a próxima sessão sem antes ter entendido bem o tema
atual, o processo de construção e destrução de um objeto.
Isso devido ao fato que é neste âmbito que mora uma das principais
diferenças entre o mundo procedural e o orientado a objetos ‐ a
utilização da memória de uma aplicação.
27
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda DEFINITION.
ENDCLASS.
DATA
:
r_ordem_a TYPE REF TO lcl_ordem_de_venda,
r_ordem_b TYPE REF TO lcl_ordem_de_venda,
r_ordem_c TYPE REF TO lcl_ordem_de_venda,
r_ordem_d LIKE r_ordem_c.
Declaração de classe e referências
Graficamente, temos:
28
Orientação a Objetos em ABAP
Cópia de Marcos
Vamos criar nosso primeiro objeto. Já sabemos que para criar um objeto
precisamos de uma referência.
CREATE OBJECT r_ordem_a.
Criação de primeiro objeto
29
Orientação a Objetos em ABAP
Cópia de Marcos
r_ordem_b
=
NEW lcl_ordem_de_venda
(
).
Criação de segundo objeto através do comando NEW
Até o momento, esta tal de orientação a objetos não parece ser tão
difícil não é mesmo?
➔ DESAFIO !!!
30
Orientação a Objetos em ABAP
Cópia de Marcos
Dado o cenário apresentado até então onde temos dois objetos criados, o
que acontece quando executamos a instrução abaixo? Tente imaginar ou
desenhar como a representação em memória ficaria.
r_ordem_c
=
r_ordem_b.
Atribuição entre referências
31
Orientação a Objetos em ABAP
Cópia de Marcos
Sim e isso é muito mais comum do que talvez pareça por hora. Toda
aplicação orientada a objetos vai ter em algum certo momento muito
mais que duas referências apontando para o mesmo objeto.
Não. Assim como uma variável declarada como inteiro só pode ter um
valor, uma referência só pode guardar um endereço de memória, além de
estar vazia. A diferença no caso das referência é que caso algum comando
seja exercido em uma referência “vazia” (que não aponta para objeto
algum), um DUMP ocorre. A única exceção a esta regra é sobre os
32
Orientação a Objetos em ABAP
Cópia de Marcos
CLEAR r_ordem_a.
Limpando uma referência
33
Orientação a Objetos em ABAP
Cópia de Marcos
Garbage Collector
Depois da atuação do , temos:
34
Orientação a Objetos em ABAP
Cópia de Marcos
➔ DESAFIO !!!
35
Orientação a Objetos em ABAP
Cópia de Marcos
DATA t_r_ordens TYPE TABLE OF REF TO lcl_ordem_de_venda.
DATA r_ordem TYPE REF TO lcl_ordem_de_venda.
CREATE OBJECT r_ordem.
APPEND r_ordem TO t_r_ordens.
Declaração e preenchimento de uma tabela interna de referências
36
Orientação a Objetos em ABAP
Cópia de Marcos
3.5 Atributos
37
Orientação a Objetos em ABAP
Cópia de Marcos
Tudo que você já sabe sobre o comando DATA pode ser aplicado neste
contexto. É possível usar tipos primitivos, do dicionário, cláusula LIKE,
definição de work areas e tabelas internas e assim por diante.
CLASS lcl_ordem_de_venda DEFINITION.
PUBLIC SECTION.
TYPES tt_items TYPE TABLE OF vbap.
CONSTANTS c_tipo TYPE vbak
auart VALUE
'OR'.
DATA
:
valor TYPE p LENGTH
10
DECIMALS
2,
id TYPE vbeln_va,
header TYPE vbak,
items TYPE tt_items.
ENDCLASS.
Atributos de uma classe
Uma vez que seja inserido pelo menos algum conteúdo entre o bloco
CLASS DEFINITION e ENDCLASS, é necessário definir uma sessão de
visibilidade. Discutiremos este assunto num capítulo futuro. Por hora,
sempre inclua a opção PUBLIC SECTION em suas classes para depois
entender o efeito desta.
38
Orientação a Objetos em ABAP
Cópia de Marcos
39
Orientação a Objetos em ABAP
Cópia de Marcos
Obviamente, todas as variáveis irão ser carregadas com seu valor inicial.
Logo o que temos acima é somente uma representação não os valores em
items
si. A tabela interna por exemplo seria carregada com zero linhas.
40
Orientação a Objetos em ABAP
Cópia de Marcos
Três objetos do mesmo tipo criados: cada objeto possui seus próprios
dados
41
Orientação a Objetos em ABAP
Cópia de Marcos
DATA r_ordem_a TYPE REF TO lcl_ordem_de_venda.
CREATE OBJECT r_ordem_a.
r_ordem_a
>
id
=
'1234'.
r_ordem_a
>
valor
=
1000.
r_ordem_a
>
valor
=
r_ordem_a
>
valor
100.
r_ordem_a
>
header
vbeln
=
r_ordem_a
>
id.
APPEND INITIAL LINE TO r_ordem_a
>
items.
READ TABLE r_ordem_a
>
items INDEX
1
INTO DATA
(
wa_item
).
LOOP AT r_ordem_a
>
items ASSIGNING FIELD
SYMBOL
(<
item
>).
WRITE
/
<item>
vbeln.
ENDLOOP.
Manipulacão de atributos de um objeto
42
Orientação a Objetos em ABAP
Cópia de Marcos
Nota: Usar ‐>* para uma variável que se refere a uma classe não retorna
dados algum.
3.6 Métodos
Objetos não simplesmente podem carregar dados em forma de atributos
mas também são capazes de processar tais dados. Em outras palavras um
objeto tem a capacidade de possuir código ABAP como seleções no banco
de dados, leitura de arquivos, chamadas a funções, exibições de telas,
etc.
métodos
Tais instruções são encapsuladas em , que podem ser comparados
a módulos de função no sentido de possuírem parâmetros de entrada e
saída, tratamento de erros, além do código em si.
Por infelicidade do destino, quando a SAP definiu qual seria a sintaxe dos
comandos de orientação a objetos, os comandos relacionados a métodos
talvez não tiveram uma atenção tão especial. O resultado disso é que
uma vez que sua classe tenha métodos (o que tipicamente vai ocorrer)
sua classe irá crescer em número de linhas de código.
43
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda DEFINITION.
PUBLIC SECTION.
" Declaração de atributos (...)
ENDCLASS.
CLASS lcl_ordem_de_venda IMPLEMENTATION.
ENDCLASS.
Blocos DEFINITION e IMPLEMENTATION
Agora que temos os dois possíveis blocos de uma classe, vamos criar um
método o mais simples possível, que por hora não fará rigorosamente
nada (mas que pelo menos existirá).
CLASS lcl_ordem_de_venda DEFINITION.
PUBLIC SECTION.
TYPES tt_items TYPE TABLE OF vbap.
CONSTANTS c_tipo TYPE vbak
auart VALUE
'OR'.
DATA
:
valor TYPE p LENGTH
10
DECIMALS
2,
id TYPE vbeln_va,
header TYPE vbak,
items TYPE tt_items.
METHODS fazer_absolutamente_nada.
ENDCLASS.
Declaração de método
44
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda IMPLEMENTATION.
METHOD fazer_absolutamente_nada.
BREAK
POINT.
ENDMETHOD.
ENDCLASS.
Implementação de método
DATA r_ordem_a TYPE REF TO lcl_ordem_de_venda.
" Opção 1) Semelhante a chamada de módulos de função
CALL METHOD r_ordem_a
>
fazer_absolutamente_nada.
" Opção 2) Semelhante a outras linguagens orientada a objetos
r_ordem_a
>
fazer_absolutamente_nada
(
).
Chamadas de métodos
45
Orientação a Objetos em ABAP
Cópia de Marcos
4 Conceitos intermediários
Estamos cada parágrafo mais longe no mar da orientação a objetos. É
hora de estudar conceitos que dificilmente podem ser associados com o
mundo procedural. Esteja aberto a novas formas de escrever código a
partir de agora.
4.1 Construtores
Diferente de outras linguagens orientadas a objetos, o ABAP não permite
que haja mais de um método na mesma classe com o mesmo nome.
CUIDADO! No ABAP não é possível dar outro nome ao construtor que não
seja
constructor. É comum esquecermos o segundo “c” do método ‐ o
46
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda DEFINITION.
PUBLIC SECTION.
METHODS constructor.
ENDCLASS.
CLASS lcl_ordem_de_venda IMPLEMENTATION.
METHOD constructor.
ENDMETHOD.
ENDCLASS.
Constructor de instância
47
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_ordem_de_venda DEFINITION
.
PUBLIC SECTION
.
CLASS
METHODS class_constructor
.
ENDCLASS
.
CLASS lcl_ordem_de_venda IMPLEMENTATION
.
METHOD class_constructor
.
ENDMETHOD
.
ENDCLASS.
Construtor de classe
REPORT zoo_construtores.
CLASS lcl_ordem_de_venda DEFINITION.
PUBLIC SECTION.
METHODS constructor.
CLASS
METHODS class_constructor.
ENDCLASS.
CLASS lcl_ordem_de_venda IMPLEMENTATION.
METHOD constructor.
BREAK
POINT.
ENDMETHOD.
METHOD class_constructor.
BREAK
POINT.
ENDMETHOD.
ENDCLASS.
DATA r_ordem TYPE REF TO lcl_ordem_de_venda.
START
OF
SELECTION.
48
Orientação a Objetos em ABAP
Cópia de Marcos
CREATE OBJECT r_ordem.
CREATE OBJECT r_ordem.
CREATE OBJECT r_ordem.
CLASS lcl_employee DEFINITION.
PUBLIC SECTION.
TYPES ty_pernr TYPE pa0002
pernr.
DATA pernr TYPE ty_pernr.
METHODS constructor
IMPORTING
i_personal_number TYPE ty_pernr.
ENDCLASS.
49
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_employee IMPLEMENTATION.
METHOD constructor.
me
>
pernr
=
i_personal_number
.
"
auto
refer
ê
ncia
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1 TYPE REF TO lcl_employee,
r_employee_2 TYPE REF TO lcl_employee,
r_employee_3 TYPE REF TO lcl_employee.
START
OF
SELECTION.
CREATE OBJECT r_employee_1
EXPORTING
i_personal_number
=
'50000000'.
r_employee_2
=
NEW lcl_employee
(
i_personal_number
=
'50000001'
).
" Ha somente um parametro de entrada
r_employee_3
=
NEW lcl_employee
(
'50000002'
).
WRITE:
|
1
{
r_employee_1
>
pernr
}|,
/,
|
2
{
r_employee_2
>
pernr
}|,
/,
|
3
{
r_employee_3
>
pernr
}|.
Auto‐referência sendo usada no construtor
50
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_employee DEFINITION.
PUBLIC SECTION.
TYPES ty_pernr TYPE pa0002
pernr.
DATA
:
pernr TYPE ty_pernr,
wa_pa0002 TYPE pa0002.
METHODS constructor
IMPORTING
i_personal_number TYPE ty_pernr.
METHODS load_personal_data.
METHODS write_personal_data.
ENDCLASS.
CLASS lcl_employee IMPLEMENTATION.
METHOD constructor.
me
>
pernr
=
i_personal_number.
me
>
load_personal_data
(
).
"
chamada usando
auto
refer
ê
ncia
ENDMETHOD.
METHOD load_personal_data.
SELECT
*
UP TO
1
ROWS
51
Orientação a Objetos em ABAP
Cópia de Marcos
FROM pa0002
INTO me
>
wa_pa0002
"
escrevendo na
auto
refer
ê
ncia
WHERE
pernr
=
me
>
pernr
"
lendo a
auto
refer
ê
ncia
ORDER BY endda DESCENDING.
ENDSELECT.
ENDMETHOD.
METHOD write_personal_data.
"
Leitura
dos atributos para impressao usando
auto
refer
ê
ncia
WRITE
:
/
|
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1 TYPE REF TO lcl_employee,
r_employee_2 TYPE REF TO lcl_employee,
r_employee_3 TYPE REF TO lcl_employee.
START
OF
SELECTION.
CREATE OBJECT r_employee_1
EXPORTING
i_personal_number
=
'50000000'.
r_employee_2
=
NEW lcl_employee
(
i_personal_number
=
'50000002'
).
r_employee_3
=
NEW lcl_employee
(
'50000003'
).
" Impressao
r_employee_1
>
write_personal_data
(
).
CALL METHOD r_employee_2
>
write_personal_data.
r_employee_3
>
write_personal_data
(
).
Auto‐referência sendo usada para leitura e escrita de atributos, além de
ser usada para chamado de método da mesma classe.
Note acima quantas vezes usamos a auto‐referência. Isso faz com que
nossa classe seja totalmente independente das referências declaradas a
52
Orientação a Objetos em ABAP
Cópia de Marcos
Por hora, vamos entender as sessões PUBLIC e PRIVATE uma vez que a
PROTECTED só faz sentido nos casos que há aplicação de herança, tema
que ainda será abordado.
53
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_employee DEFINITION.
PUBLIC SECTION.
TYPES ty_pernr TYPE pa0002
pernr.
DATA
:
pernr TYPE ty_pernr,
wa_pa0002 TYPE pa0002.
METHODS load_personal_data.
METHODS write_personal_data.
ENDCLASS.
CLASS lcl_employee IMPLEMENTATION.
METHOD load_personal_data.
SELECT
*
UP TO
1
ROWS
FROM pa0002
INTO me
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDER BY endda DESCENDING.
ENDSELECT.
ENDMETHOD.
METHOD write_personal_data.
WRITE
:
/
|
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1 TYPE REF TO lcl_employee,
r_employee_2 TYPE REF TO lcl_employee,
r_employee_3 TYPE REF TO lcl_employee.
54
Orientação a Objetos em ABAP
Cópia de Marcos
START
OF
SELECTION.
CREATE OBJECT r_employee_1.
r_employee_1
>
pernr
=
'50000000'.
r_employee_2
=
NEW lcl_employee
(
).
r_employee_2
>
pernr
=
'50000002'.
r_employee_3
=
NEW lcl_employee
(
).
r_employee_3
>
pernr
=
'50000003'.
*
Carrega
dados
do
empregado
r_employee_1
>
load_personal_data
(
).
r_employee_2
>
load_personal_data
(
).
r_employee_3
>
load_personal_data
(
).
*
Impressao
r_employee_1
>
write_personal_data
(
).
CALL METHOD r_employee_2
>
write_personal_data.
WRITE
:
/
|
{
r_employee_3
>
wa_pa0002
pernr
}
{
r_employee_3
>
wa_pa0002
cname
}
|
.
55
Orientação a Objetos em ABAP
Cópia de Marcos
constructor
Nota: O método construtor de instância ( )
deve sempre ser
público caso usado.
56
Orientação a Objetos em ABAP
Cópia de Marcos
Elas não podem ser usadas em outros pontos de código que não sejam os
módulos de função do mesmo grupo.
Para impedir que algum atributo seja acessado ou algum método seja
chamado em qualquer ponto da aplicação, é preciso defini‐lo como
não‐público (PROTECTED ou PRIVATE). No momento, focaremos na
sessão
private
(PRIVATE SECTION).
CLASS lcl_employee DEFINITION.
PUBLIC SECTION.
TYPES ty_pernr TYPE pa0002
pernr.
METHODS constructor
IMPORTING
i_personal_number TYPE ty_pernr.
METHODS write_personal_data.
PRIVATE SECTION.
DATA
:
pernr TYPE ty_pernr,
wa_pa0002 TYPE pa0002.
METHODS load_personal_data.
ENDCLASS.
CLASS lcl_employee IMPLEMENTATION.
METHOD constructor.
me
>
pernr
=
i_personal_number.
*
Chamada
de m
é
todo privado.
*
Como
estamos dentro
do
bloco de implementa
ção
*
isso
é
permitido
me
>
load_personal_data
(
).
57
Orientação a Objetos em ABAP
Cópia de Marcos
ENDMETHOD.
METHOD load_personal_data.
SELECT
*
UP TO
1
ROWS
FROM pa0002
INTO me
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDER BY endda DESCENDING.
ENDSELECT.
ENDMETHOD.
METHOD write_personal_data.
WRITE
:
/
|
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1 TYPE REF TO lcl_employee,
r_employee_2 TYPE REF TO lcl_employee,
r_employee_3 TYPE REF TO lcl_employee.
START
OF
SELECTION.
CREATE OBJECT r_employee_1
EXPORTING
i_personal_number
=
'50000000'.
*
Erro
de sintaxe
atributo privado
*
r_employee_1
>
permr
=
'50000000'.
r_employee_2
=
NEW lcl_employee
(
i_personal_number
=
'50000002'
).
r_employee_3
=
NEW lcl_employee
(
'50000003'
).
*
Erro
de sintaxe
metodo privado
*
r_employee_1
>
load_personal_data
(
).
" Impressao
r_employee_1
>
write_personal_data
(
).
CALL METHOD r_employee_2
>
write_personal_data.
58
Orientação a Objetos em ABAP
Cópia de Marcos
r_employee_3
>
write_personal_data
(
).
Dar menos liberdade a quem usa a classe tende a ser uma boa prática:
com menos opções de uso as chances de usar uma classe de maneira
errada diminuem.
59
Orientação a Objetos em ABAP
Cópia de Marcos
constructor
Já vimos que existem construtores: o de instância ( ) e o de
class_constructor
classe ( ).
60
Orientação a Objetos em ABAP
Cópia de Marcos
Veja o código abaixo. Criamos uma nova classe responsável por selecionar
textos (descrições) de materiais. Cada objeto representa um material
distinto, o que é razoável supondo que tal apliacação não faz seleção em
massa de materiais.
CLASS lcl_material_texts DEFINITION.
PUBLIC SECTION.
CLASS
DATA
:
language TYPE makt
spras.
CLASS
METHODS class_constructor.
ENDCLASS.
61
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_material_texts IMPLEMENTATION.
METHOD class_constructor.
lcl_material_texts
=>
language
=
'P'.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
WRITE
:
lcl_material_texts
=>
language.
lcl_material_texts
=>
language
=
'E'.
WRITE
:
lcl_material_texts
=>
language.
Atributo estático em uso
Você terá razão em achar que o termo estático é então confuso, mas isso
não anula o fato de ser importante entendê‐lo.
O construtor de classe foi criado para atribuir um valor inicial para nosso
atributo estático. Contúdo, podemos alterar tal valor posteriormente.
Dentro do construtor estático a auto‐referência me não existe pois não
temos um objeto sendo criado.
62
Orientação a Objetos em ABAP
Cópia de Marcos
Note que para acessar atributos estáticos usamos uma “seta” ( => ) um
pouco diferente da que estávamos acostumados. Ainda, o termo a
esquerda da seta não é uma referência mas sim o próprio nome da classe.
Assim, além de não precisarmos criar um objeto, não precisamos também
declarar uma referência para fazer uso de atributos estáticos.
CLASS lcl_material_texts DEFINITION.
PUBLIC SECTION.
TYPES
:
ty_material_id TYPE makt
matnr,
ty_material_text TYPE makt
maktx,
ty_language TYPE makt
spras.
CLASS
DATA
:
language TYPE ty_language.
CLASS
METHODS class_constructor.
METHODS constructor
IMPORTING
i_matnr TYPE lcl_material_texts
=>
ty_material_id.
METHODS select_text
RETURNING VALUE
(
re_material_text
)
TYPE lcl_material_texts
=>
ty_material_text.
PRIVATE SECTION.
DATA
:
matnr TYPE ty_material_id
,
"lcl_material_texts=> é opcional
material_text TYPE lcl_material_texts
=>
ty_material_text,
selected_language TYPE ty_language
.
ENDCLASS.
CLASS lcl_material_texts IMPLEMENTATION.
METHOD class_constructor.
lcl_material_texts
=>
language
=
'P'.
ENDMETHOD.
63
Orientação a Objetos em ABAP
Cópia de Marcos
METHOD constructor.
matnr
=
i_matnr
.
" me> é opcional
me
>
material_text
=
me
>
select_text
(
).
ENDMETHOD.
METHOD select_text.
IF me
>
material_text IS INITIAL OR
lcl_material_texts
=>
language
<>
me
>
selected_language.
SELECT SINGLE
maktx
FROM makt
INTO re_material_text
WHERE
matnr
=
matnr
" me> opcional
AND spras
=
lcl_material_texts
=>
language.
IF sy
subrc IS INITIAL.
me
>
selected_language
=
lcl_material_texts
=>
language.
me
>
material_text
=
re_material_text.
ENDIF.
ENDIF.
re_material_text
=
me
>
material_text.
ENDMETHOD.
ENDCLASS.
DATA
:
r_material_a TYPE REF TO lcl_material_texts,
r_material_b TYPE REF TO lcl_material_texts.
START
OF
SELECTION.
WRITE
:
|
Textos
em
{
lcl_material_texts
=>
language
}|.
r_material_a
=
NEW lcl_material_texts
(
'RF130'
).
r_material_b
=
NEW lcl_material_texts
(
'RT300'
).
64
Orientação a Objetos em ABAP
Cópia de Marcos
WRITE
:
/
r_material_a
>
select_text
(
),
/,
r_material_b
>
select_text
(
),
/,
NEW lcl_material_texts
(
'MMFUSIVEL30'
)>
select_text
(
).
lcl_material_texts
=>
language
=
'E'.
ULINE.
WRITE
:
/
r_material_a
>
select_text
(
),
/,
r_material_b
>
select_text
(
).
Exemplo com atributos de instância e estáticos
65
Orientação a Objetos em ABAP
Cópia de Marcos
lcl_material_texts
=>
language
=
'E'.
me
>
selected_language
=
lcl_material_texts
=>
language.
66
Orientação a Objetos em ABAP
Cópia de Marcos
67
Orientação a Objetos em ABAP
Cópia de Marcos
4.5 Herança
68
Orientação a Objetos em ABAP
Cópia de Marcos
REPORT zoo_heranca.
CLASS lcl_documento_de_venda DEFINITION.
PUBLIC SECTION.
TYPES:
ty_id TYPE vbak
vbeln,
ty_header TYPE vbak.
METHODS constructor
IMPORTING
i_id TYPE ty_id.
METHODS abrir .
DATA header TYPE ty_header.
PRIVATE SECTION.
METHODS select_header
RETURNING VALUE
(
re_header
)
TYPE ty_header.
ENDCLASS.
CLASS lcl_documento_de_venda IMPLEMENTATION.
METHOD constructor.
me
>
header
vbeln
=
i_id.
me
>
header
=
me
>
select_header
(
).
ENDMETHOD.
METHOD select_header.
69
Orientação a Objetos em ABAP
Cópia de Marcos
SELECT SINGLE *
FROM vbak
INTO re_header
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
METHOD abrir.
SET PARAMETER ID
'AUN'
FIELD header
vbeln.
ENDMETHOD.
ENDCLASS.
CLASS lcl_cotacao DEFINITION
INHERITING FROM lcl_documento_de_venda.
PUBLIC SECTION.
METHODS abrir REDEFINITION.
ENDCLASS.
CLASS lcl_cotacao IMPLEMENTATION.
METHOD abrir.
super
>
abrir
(
).
call TRANSACTION
'VA23'
AND SKIP FIRST SCREEN.
ENDMETHOD.
ENDCLASS.
CLASS lcl_ordem_de_venda DEFINITION
INHERITING FROM lcl_documento_de_venda.
PUBLIC SECTION.
METHODS abrir REDEFINITION.
ENDCLASS.
CLASS lcl_ordem_de_venda IMPLEMENTATION.
70
Orientação a Objetos em ABAP
Cópia de Marcos
METHOD abrir.
super
>
abrir
(
).
call TRANSACTION
'VA03'
AND SKIP FIRST SCREEN.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
DATA
:
r_cotacao TYPE REF TO lcl_cotacao.
create OBJECT r_cotacao
EXPORTING
i_id
=
'0020000162'.
r_cotacao
>
abrir
(
).
new
lcl_ordem_de_venda
(
i_id
=
'0000016197'
)>
abrir
(
).
Aplicação de herança
herdados
Todos os atributos e métodos públicos são para as classes filhas.
Isso significa que o método
select_header pode apenas ser chamado na
nossa classe mãe.
71
Orientação a Objetos em ABAP
Cópia de Marcos
número de classes filhas que uma classe pode ter. Ainda, uma classe pode
apenas ter uma e somente mãe.
CLASS lcl_documento_de_venda DEFINITION.
PUBLIC SECTION.
TYPES:
ty_id TYPE vbak
vbeln,
72
Orientação a Objetos em ABAP
Cópia de Marcos
ty_header TYPE vbak.
METHODS constructor
IMPORTING
i_id TYPE ty_id.
METHODS abrir .
DATA header TYPE ty_header.
PROTECTED SECTION
.
" Protegida!
METHODS select_header
" método será herdado
RETURNING VALUE
(
re_header
)
TYPE ty_header.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_documento_de_venda IMPLEMENTATION.
METHOD constructor.
me
>
header
vbeln
=
i_id.
ENDMETHOD.
METHOD select_header.
SELECT SINGLE *
FROM vbak
INTO re_header
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
METHOD abrir.
SET PARAMETER ID
'AUN'
FIELD header
vbeln.
ENDMETHOD.
ENDCLASS.
CLASS lcl_cotacao DEFINITION
INHERITING FROM lcl_documento_de_venda.
73
Orientação a Objetos em ABAP
Cópia de Marcos
PUBLIC SECTION.
METHODS abrir REDEFINITION.
ENDCLASS.
CLASS lcl_cotacao IMPLEMENTATION.
METHOD abrir.
me
>
header
=
me
>
select_header
(
).
MESSAGE
|
Cota
çã
o
do
tipo
{
me
>
header
auart
}
|
TYPE
'I'.
super
>
abrir
(
).
CALL TRANSACTION
'VA23'
AND SKIP FIRST SCREEN.
ENDMETHOD.
ENDCLASS.
CLASS lcl_ordem_de_venda DEFINITION
INHERITING FROM lcl_documento_de_venda.
PUBLIC SECTION.
TYPES
:
ty_items TYPE TABLE OF vbap.
DATA t_items TYPE ty_items READ
ONLY.
METHODS constructor
IMPORTING
i_id_venda TYPE lcl_documento_de_venda
=>
ty_id.
METHODS abrir REDEFINITION.
PRIVATE SECTION.
METHODS select_items.
ENDCLASS.
CLASS lcl_ordem_de_venda IMPLEMENTATION.
METHOD constructor.
super
>
constructor
(
i_id
=
i_id_venda
).
me
>
select_items
(
).
ENDMETHOD.
74
Orientação a Objetos em ABAP
Cópia de Marcos
METHOD abrir.
DATA no_linhas TYPE i.
super
>
abrir
(
).
DESCRIBE TABLE me
>
t_items LINES no_linhas.
MESSAGE
|
Ordem
possui
{
no_linhas
}
itens
|
TYPE
'I'.
CALL TRANSACTION
'VA03'
AND SKIP FIRST SCREEN.
ENDMETHOD.
METHOD select_items.
SELECT *
FROM vbap
INTO TABLE me
>
t_items
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
DATA
:
r_cotacao TYPE REF TO lcl_cotacao.
CREATE OBJECT r_cotacao
EXPORTING
i_id
=
'0020000162'.
r_cotacao
>
abrir
(
).
NEW lcl_ordem_de_venda
(
i_id_venda
=
'0000016197'
)>
abrir
(
).
75
Orientação a Objetos em ABAP
Cópia de Marcos
Nem todos os métodos precisam ser redefinidos. Os métodos que não são
redefinidos existem na classe filha (desde que públicos ou protegidos)
com a mesma implementação.
4.6 Eventos
Com evento, é possível realizar a comunicação entre dois objetos de uma
maneira mais sofisticada que simplemente chamar um método de um
objeto dentro de outro objeto. Isso pois é possível que um objeto
“dispare” um evento e automaticamente vários outros objetos reajam a
este.
76
Orientação a Objetos em ABAP
Cópia de Marcos
➔ 1 ‐ Criação do evento
CLASS lcl_documentos_fi DEFINITION.
PUBLIC SECTION.
EVENTS
:
documentos_selecionados.
(...)
➔ 2 ‐ Disparo do evento
O disparo do evento deve ser feito pelo mesmo objeto que possui o
evento. Isto é feito através do comando RAISE EVENT.
METHOD select_documents.
(...)
RAISE EVENT documentos_selecionados.
(...)
ENDMETHOD.
77
Orientação a Objetos em ABAP
Cópia de Marcos
METHODS captura_documentos
FOR EVENT documentos_selecionados OF lcl_documentos_fi
START
OF
SELECTION.
DATA
(
r_relatorio
)
=
NEW lcl_relatorio
(
).
SET HANDLER r_relatorio
>
captura_documentos FOR ALL INSTANCES.
Para exemplificar o uso de eventos, vamos criar uma aplicação com mais
de um requisito funcional.
78
Orientação a Objetos em ABAP
Cópia de Marcos
Para resolver tal demanda neste caso, vamos criar 2 classes: Uma
lcl_documentos_fi)
responsável pela seleção dos dados (chamada aqui de
e outra responsável pelo cálculo dos três itens desejados (classe
lcl_contador_relatorio
).
Primeiro, a classe
lcl_documentos_fi.
CLASS lcl_documentos_fi DEFINITION.
PUBLIC SECTION.
EVENTS
:
documentos_selecionados.
TYPES:
ty_empresa TYPE bkpf
bukrs,
ty_data_lancamento TYPE RANGE OF bkpf
budat,
BEGIN
OF ty_key,
bukrs TYPE bkpf
bukrs,
belnr TYPE bkpf
belnr,
gjahr TYPE bkpf
gjahr,
END
OF ty_key,
BEGIN
OF ty_header.
INCLUDE TYPE ty_key.
TYPES
:
budat TYPE bkpf
budat,
END
OF ty_header,
BEGIN
OF ty_item.
INCLUDE TYPE ty_key.
TYPES
:
buzei TYPE bseg
buzei,
shkzg TYPE bseg
shkzg
,
" Debito/Credito
79
Orientação a Objetos em ABAP
Cópia de Marcos
dmbtr TYPE bseg
dmbtr
,
" Valor
END
OF ty_item,
tt_headers TYPE HASHED TABLE OF ty_header
WITH UNIQUE KEY bukrs belnr gjahr,
tt_items TYPE SORTED TABLE OF ty_item
WITH UNIQUE KEY bukrs belnr gjahr buzei.
DATA:
v_empresa TYPE ty_empresa READ
ONLY,
t_ra_data_lancamento TYPE ty_data_lancamento READ
ONLY,
t_headers TYPE tt_headers READ
ONLY,
t_items TYPE tt_items READ
ONLY.
METHODS constructor
IMPORTING
iv_bukrs TYPE ty_empresa
it_ra_budat TYPE ty_data_lancamento.
PRIVATE SECTION.
METHODS select_documents.
METHODS select_headers
RETURNING VALUE
(
re_headers
)
TYPE tt_headers.
METHODS select_items
IMPORTING
it_headers TYPE tt_headers
RETURNING VALUE
(
re_documentos
)
TYPE tt_items.
ENDCLASS.
CLASS lcl_documentos_fi IMPLEMENTATION.
METHOD constructor.
me
>
v_empresa
=
iv_bukrs.
me
>
t_ra_data_lancamento
=
it_ra_budat.
me
>
select_documents
(
).
ENDMETHOD.
METHOD select_documents.
80
Orientação a Objetos em ABAP
Cópia de Marcos
me
>
t_items =
me
>
select_items(
it_headers
=
me
>
select_headers
(
)
).
RAISE EVENT documentos_selecionados.
ENDMETHOD.
METHOD select_headers.
SELECT
bukrs
belnr
gjahr
budat
FROM bkpf
INTO TABLE re_headers
WHERE
bukrs
=
me
>
v_empresa
AND budat IN me
>
t_ra_data_lancamento.
IF sy
subrc IS INITIAL.
me
>
t_headers
=
re_headers.
ENDIF.
ENDMETHOD.
METHOD select_items.
SELECT
bukrs
belnr
gjahr
buzei
shkzg
dmbtr
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE re_documentos
FOR ALL ENTRIES IN it_headers
WHERE
bukrs
=
it_headers
bukrs
AND belnr
=
it_headers
belnr
AND gjahr
=
it_headers
gjahr.
81
Orientação a Objetos em ABAP
Cópia de Marcos
ENDMETHOD.
ENDCLASS.
Classe lcl_documentos_fi ‐ detentora do evento
CLASS lcl_contador_relatorio DEFINITION.
PUBLIC SECTION.
METHODS captura_documentos
FOR EVENT documentos_selecionados OF
lcl_documentos_fi
IMPORTING sender.
METHODS percorre_itens.
DATA v_total TYPE lcl_documentos_fi
=>
ty_item
dmbtr READ
ONLY.
DATA
:
BEGIN
OF wa_total_periodo READ
ONLY,
primeiro TYPE lcl_documentos_fi
=>
ty_item
dmbtr,
segundo TYPE lcl_documentos_fi
=>
ty_item
dmbtr,
END
OF wa_total_periodo.
DATA v_quantidade_itens TYPE i READ
ONLY.
PRIVATE SECTION.
DATA r_documentos TYPE REF TO lcl_documentos_fi.
DATA v_metade_periodo TYPE d.
82
Orientação a Objetos em ABAP
Cópia de Marcos
EVENTS novo_item
EXPORTING
VALUE
(
wa_item
)
TYPE lcl_documentos_fi
=>
ty_item.
METHODS calcula_total
FOR EVENT novo_item OF lcl_contador_relatorio
IMPORTING wa_item.
METHODS soma_periodo
FOR EVENT novo_item OF lcl_contador_relatorio
IMPORTING wa_item.
METHODS conta_item
FOR EVENT novo_item OF lcl_contador_relatorio.
ENDCLASS.
CLASS lcl_contador_relatorio IMPLEMENTATION.
METHOD captura_documentos.
me
>
r_documentos
=
sender.
DATA
(
lv_delta_days
)
=
(
me
>
r_documentos
>
t_ra_data_lancamento
[
1
]
high
me
>
r_documentos
>
t_ra_data_lancamento
[
1
]
low
).
v_metade_periodo =
me
>
r_documentos
>
t_ra_data_lancamento
[
1
]
low +
(
lv_delta_days
/
2
).
SET HANDLER:
me
>
calcula_total FOR me,
me
>
soma_periodo FOR me,
me
>
conta_item FOR me.
ENDMETHOD.
METHOD percorre_itens.
LOOP AT me
>
r_documentos
>
t_items INTO DATA
(
lwa_item
).
RAISE EVENT novo_item
EXPORTING
wa_item
=
lwa_item.
ENDLOOP.
83
Orientação a Objetos em ABAP
Cópia de Marcos
ENDMETHOD.
METHOD calcula_total.
IF wa_item
shkzg
=
'H'
.
" Credito
me
>
v_total
=
me
>
v_total
+
wa_item
dmbtr.
ENDIF.
ENDMETHOD.
METHOD soma_periodo.
IF wa_item
shkzg
=
'H'
.
" Credito
READ TABLE me
>
r_documentos
>
t_headers
WITH TABLE KEY
bukrs
=
wa_item
bukrs
belnr
=
wa_item
belnr
gjahr
=
wa_item
gjahr
ASSIGNING FIELD
SYMBOL
(<
wa_header
>).
IF
<wa_header>
budat
<
me
>
v_metade_periodo.
me
>
wa_total_periodo
primeiro =
me
>
wa_total_periodo
primeiro
+
wa_item
dmbtr.
ELSE.
me
>
wa_total_periodo
segundo =
me
>
wa_total_periodo
segundo
+
wa_item
dmbtr.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD conta_item.
ADD
1
TO me
>
v_quantidade_itens.
ENDMETHOD.
ENDCLASS.
documentos_selecionados
Do ponto de vista do evento , o passo três foi
feito acima: foi definido que na ocorrência de tal evento o método
84
Orientação a Objetos em ABAP
Cópia de Marcos
Falta ainda realizar o último passo que especifica quais objetos do tipo
lcl_documentos_fi serão “ouvidos” pelas instâncias de
lcl_contador_relatorio. Como o método captura_documentos é público
podemos realiar tal procedimento fora do escopo da classe. Veja abaixo a
tela de seleção de aplicação e a instanciação dos objetos necessários.
PARAMETER:
p_bukrs TYPE bkpf‐bukrs OBLIGATORY.
START‐OF‐SELECTION.
r_relatorio‐>percorre_itens( ).
WRITE:
|Total de crédito: { r_relatorio‐>v_total }|, /,
|Período 1: { r_relatorio‐>wa_total_periodo‐primeiro }|, /
|Período 2: { r_relatorio‐>wa_total_periodo‐segundo } |,/,
|Quantidade Itens: { r_relatorio‐>v_quantidade_itens }|.
85
Orientação a Objetos em ABAP
Cópia de Marcos
86
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcx_usuario_inexistente DEFINITION
INHERITING FROM cx_static_check.
ENDCLASS.
CLASS lcx_usuario_bloqueado DEFINITION
INHERITING FROM cx_static_check.
PUBLIC SECTION.
CONSTANTS:
c_mensagem TYPE string VALUE 'Usuário bloqueado'.
ENDCLASS.
Classes de exceção
87
Orientação a Objetos em ABAP
Cópia de Marcos
CLASS lcl_seletor_usuario DEFINITION.
PUBLIC SECTION.
TYPES:
ty_user_name TYPE usr02
bname,
ty_user TYPE usr02.
CLASS
METHODS seleciona_usuario
IMPORTING
iv_user TYPE ty_user_name
RETURNING
VALUE
(
re_user
)
TYPE ty_user
RAISING
lcx_usuario_inexistente
lcx_usuario_bloqueado.
ENDCLASS.
CLASS lcl_seletor_usuario IMPLEMENTATION.
METHOD seleciona_usuario.
SELECT SINGLE *
FROM usr02
INTO re_user
WHERE
bname = iv_user.
IF sysubrc IS NOT INITIAL.
RAISE EXCEPTION TYPE lcx_usuario_inexistente.
ENDIF.
IF re_useruflag IS NOT INITIAL.
RAISE EXCEPTION TYPE lcx_usuario_bloqueado.
ENDIF.
ENDMETHOD.
ENDCLASS.
Método que pode disparar exceção
88
Orientação a Objetos em ABAP
Cópia de Marcos
PARAMETER p_user TYPE lcl_seletor_usuario
=>
ty_user_name OBLIGATORY.
START
OF
SELECTION.
TRY .
DATA
(
v_criador
)
=
lcl_seletor_usuario
=>
seleciona_usuario
(
p_user
)
aname.
CATCH lcx_usuario_inexistente.
MESSAGE
'Usuário inexistente'
TYPE
'S'
DISPLAY LIKE
'E'.
STOP.
CATCH lcx_usuario_bloqueado
INTO DATA
(
r_erro_user_bloqueado
).
MESSAGE r_erro_user_bloqueado
>
c_mensagem
TYPE
'S'
DISPLAY LIKE
'E'.
STOP.
ENDTRY.
WRITE:
|
Criador
do
usu
á
rio
{
p_user
}
:
{
v_criador
}
|.
Tratamento de exceção usando TRY… CATCH.
89
Orientação a Objetos em ABAP
Cópia de Marcos
4.8 Interfaces
O termo interface em orientação a objeto em nada tem a ver com
integração entre sistemas como muitos se confundem.
Pensemos num caso que sua aplicação precisa criar 3 objetos de negócio
diferentes: um material, uma ordem de venda e um lançamento em
finanças.
Estes três cadastros são totalmente diferentes entre si, mas há algo que
queremos fazer com todos estes: o cadastramento de fato.
Para tornar nosso código mais legível, vamos ocultar chamadas de BAPIs e
módulos de função que realizam o cadastro efetivamente. Comecemos
pelas nossas 3 classes.
CLASS lcl_material DEFINITION.
90
Orientação a Objetos em ABAP
Cópia de Marcos
ENDCLASS.
CLASS lcl_ordem DEFINITION.
ENDCLASS.
CLASS lcl_lancamento DEFINITION.
ENDCLASS.
START
OF
SELECTION.
DATA
(
r_material
)
=
NEW lcl_material
(
).
DATA
(
r_ordem
)
=
NEW lcl_ordem
(
).
DATA
(
r_lancamento
)
=
NEW lcl_lancamento
(
).
INTERFACE lif_objeto_negocio.
METHODS criar.
ENDINTERFACE.
CLASS lcl_material DEFINITION.
PUBLIC SECTION.
INTERFACES lif_objeto_negocio.
ENDCLASS.
CLASS lcl_material IMPLEMENTATION.
91
Orientação a Objetos em ABAP
Cópia de Marcos
METHOD lif_objeto_negocio~criar.
* CALL FUNCTION 'Z_CRIA_MATERIAL'...
ENDMETHOD.
ENDCLASS.
CLASS lcl_ordem DEFINITION.
PUBLIC SECTION.
INTERFACES lif_objeto_negocio.
ENDCLASS.
CLASS lcl_ordem IMPLEMENTATION.
METHOD lif_objeto_negocio~criar.
* CALL FUNCTION 'Z_CRIA_ORDEM'...
ENDMETHOD.
ENDCLASS.
CLASS lcl_lancamento DEFINITION.
PUBLIC SECTION.
INTERFACES lif_objeto_negocio.
ENDCLASS.
CLASS lcl_lancamento IMPLEMENTATION.
METHOD lif_objeto_negocio~criar.
* CALL FUNCTION 'Z_CRIA_LANCAMENTO'...
ENDMETHOD.
ENDCLASS.
Implementação de interface
START
OF
SELECTION.
DATA
(
r_material
)
=
NEW lcl_material
(
).
DATA
(
r_ordem
)
=
NEW lcl_ordem
(
).
DATA
(
r_lancamento
)
=
NEW lcl_lancamento
(
).
DATA
:
t_obj_negocio
TYPE TABLE OF REF TO lif_objeto_negocio,
r_obj_negocio TYPE REF TO lif_objeto_negocio.
92
Orientação a Objetos em ABAP
Cópia de Marcos
APPEND r_material TO t_obj_negocio.
APPEND r_ordem TO t_obj_negocio.
APPEND r_lancamento TO t_obj_negocio.
LOOP AT t_obj_negocio INTO r_obj_negocio.
r_obj_negocio
>
criar
(
).
ENDLOOP.
Polimorfismo
Já uma referência a
interface a permite apontar
para qualquer objeto de
qualquer classe que implementa tal interface
.
A frase acima é fica clara caso você tenha entendido bem conceitos de
orientação a objetos.
93
Orientação a Objetos em ABAP
Cópia de Marcos
5 Conceitos Avançados
Conceitos considerados “avançados” na orientação a objetos não são
difíceis de serem entendidos. O principal desafio é saber aplicá‐los ou
entendê‐los em aplicações para que haja benefício no desenvolvimento.
5.1 Abstração
O conceito de abstração só será relevante caso sua aplicação trabalhe
com herança. Tanto uma classe como um método podem ser considerados
abstratos.
CLASS lcl_documento DEFINITION ABSTRACT.
ENDCLASS.
CLASS lcl_ordem_de_venda DEFINITION
INHERITING FROM lcl_documento.
ENDCLASS.
CLASS lcl_requisicao_de_compra DEFINITION
INHERITING FROM lcl_documento.
ENDCLASS.
DATA
:
r_documento TYPE REF TO lcl_documento
,
" ABSTRATO
r_ordem_de_venda TYPE REF TO lcl_ordem_de_venda,
r_requisicao_de_compra TYPE REF TO lcl_requisicao_de_compra.
94
Orientação a Objetos em ABAP
Cópia de Marcos
START
OF
SELECTION.
r_ordem_de_venda
=
NEW lcl_ordem_de_venda
(
).
r_requisicao_de_compra
=
NEW lcl_requisicao_de_compra
(
).
*
r_documento
=
new
lcl_documento
(
).
" ERRO DE SINTAXE
r_documento
=
NEW lcl_ordem_de_venda
(
).
Exemplo de classe abstrata
Note que ainda é possível usar uma referência a uma classe abstrata.
Todavia tal referência ao ser preenchida deve apontar para algum objeto
de classe herdeira e da classe abstrata.
CLASS lcl_saida_template DEFINITION ABSTRACT.
PROTECTED SECTION.
METHODS imprimir ABSTRACT.
ENDCLASS.
Método abstrato
CLASS lcl_saida_template DEFINITION ABSTRACT.
PROTECTED SECTION.
METHODS imprimir ABSTRACT.
95
Orientação a Objetos em ABAP
Cópia de Marcos
ENDCLASS.
CLASS lcl_saida_alv DEFINITION
INHERITING FROM lcl_saida_template.
PROTECTED SECTION.
METHODS imprimir REDEFINITION
.
" Obrigatorio
ENDCLASS.
CLASS lcl_saida_alv IMPLEMENTATION.
METHOD imprimir.
" exibe ALV
ENDMETHOD.
ENDCLASS.
Redefinição de método abstrato
5.2 Final
finalização
O conceito de (ou simplesmente o comando FINAL) é usado
quando quer‐se
evitaro uso de herança.
CLASS lcl_saida_alv DEFINITION FINAL.
ENDCLASS.
Classe final
96
Orientação a Objetos em ABAP
Cópia de Marcos
De forma semelhante, métodos FINAL são aqueles que não podem ser
redefinidos.
CLASS lcl_saida_alv DEFINITION.
PUBLIC SECTION.
METHODS format_columns FINAL.
ENDCLASS.
CLASS lcl_saida_alv IMPLEMENTATION.
METHOD format_columns.
" Unica implementacao possivel
" nao é possível redefinir
" este método
ENDMETHOD.
ENDCLASS.
Método Final
97
Orientação a Objetos em ABAP
Cópia de Marcos
Exemplo:
CLASS lcl_impressora DEFINITION CREATE PRIVATE.
PUBLIC SECTION.
CLASS
METHODS cria_impressora
RETURNING VALUE
(
re_nova_impressora)
TYPE REF TO lcl_impressora.
ENDCLASS.
CLASS lcl_impressora IMPLEMENTATION.
METHOD cria_impressora.
" criacao de objetos só pode acontecer
" dentro da própria classe
re_nova_impressora
=
NEW lcl_impressora
(
).
ENDMETHOD.
ENDCLASS.
Geração de Instância Privada ‐ somente a classe pode criar seus próprios
objetos
98
Orientação a Objetos em ABAP
Cópia de Marcos
99
Orientação a Objetos em ABAP
Cópia de Marcos
6 Conclusão
Com os conceitos apresentados no livro, você deve estar apto a se
aventurar nos diversos frameworks ABAP como Web Dynpro, Gateway e
BOPF.
Bons estudos!
100