You are on page 1of 145

ABAP 101

Sua porta de entrada para o mundo ABAP.


Pular para o contedo

INCIO

SOBRE O ABAP 101

SOBRE O AUTOR

Criando o Programa ABAP Hello World


Criando um Programa Calculadora Verso Report

Criando Uma Transao de Report


Publicado em setembro 7, 2007 | 1 comentrio

PROBLEMA
Criar uma transao e associar o programa ZHELLO.

SOLUO
V at o Object Navigator (SE80). Na rea de navegao, escolha o tipo de
objeto Program. Digite o nome do programa ZHELLO e tecle enter. O programa
ZHELLO aparacer logo abaixo da rea de navegao.
Clique com o boto direito e acesse Create -> Transaction:

Escolha um nome para a transao: ZTHELLO e escolha o tipo de


transaoProgram and Selection Screen (Report Transaction):

Entre com o nome do programa, marcar todas as opes de GUI Support e


salve:

Nota: Para finalizar a gravao, necessrio associar um pacote (***1) e


uma change request. (***2)

EXECUO E TESTE
Para testar, abra uma nova sesso (Menu: System -> Create Session) e na rea
de comando, entre com o nome da nova transao e tecle Enter:

DISCUSSO
Existem diversos tipos de programas em ABAP, o programa que criamos um
relatrio. Devemos escolher o tipo correcto de programa, caso contrrio a
transao no funcionar.
O nmero da screen do relatrio 1000, valor padro para programas do tipo
report.
possvel associar uma variante padro, ou seja, quando a transao foi
chamada, o programa ser executado usando a variante especificada.
As opes de GUI Support, ativa o suporte da transao aos 3 tipos de SAP GUI,
para HTML, Java e Windows.

Criando o Programa ABAP Hello World


Publicado em agosto 30, 2007 | 5 Comentrios

PROBLEMA
Criar um programa ABAP e imprimir na tela Hello World!.

SOLUO
V at o Object Navigator (SE80). Na rea de navegao, escolha o tipo de
objeto Program. Digite o nome do programa ZHELLO e tecle enter.

Se no existir nenhum programa com o nome escolhido, ser aberto uma nova
janela perguntando se deseja criar.

Se voc escolher a opo Yes, para criar um novo programa, outra janela
aberta. Tire o flag Whit TOP-Include e confirme. Ser aberto mais outr janela
para escolher os atributos do novo programa.

Entre com uma descrio e escolha o tipo de programa executvel. Salve o


programa em uma request e inclua o o seguinte cdigo no programa:
Write'HelloWorld!'.

Salve (Ctrl-S), ative (Shift-F8), e se no houver nenhum erro, execute o


programa (F8).

DISCUSSO
Esse o programa mais simples em ABAP. Todos os objetos criados pelo usurio
comeam com Z ou Y (comumente usado para programas de sistema).
O comando write, responsvel por imprimir na sada do programa. Para ver
maiores detalhes do comando, posicione o cursor sobre o comando e pressione
F1.
Voc tambm pode usar a transao SE38 para criar e modificar seus
programas.

***1

Criando Packages
Publicado em agosto 29, 2007 | 1 comentrio

PROBLEMA
Criar um package (pacote) ZP_ABAP101 para organizar os programas
desenvolvidos do ABAP 101.

SOLUO
V at o Object Navigator (SE80). Na rea de navegao, escolha o tipo de
objeto Package. Digite o nome do package ZP_ABAP101 e tecle enter.

Se no existir nenhum pacote com o nome escolhido, ser aberto uma nova
janela perguntando se deseja criar.

Se voc escolher a opo de criar um novo pacote, outra janela aberta para
escolher os atributos do novo pacote.
Escolha os atributos e salve o pacote em uma request.

DISCUSSO
Os objetos SAP so organizados em packages ou pacotes. Geralmente, os
projetos possuem um pacote por mdulo (FI, MM, SD etc.). Tambm podemos
ter vrios pacotes para o mesmo mdulo ou qualquer outro critrio decidido
pelo gerente ou lider do projeto.
Por exemplo, na criao de um novo ambiente, pode-se escolher quais pacotes
faro parte do novo ambiente.
Ou seja, os packages so uma subdiviso lgica dos objetos dentro do
repositrio de objetos no sistema. O package o qual um objeto pertence, no
tem a menor influncia em seu funcionamento, sendo assim, um programa do
mdulo de FI, pode ser gravado em um pacote do mdulo de MM por engano,
sem que isso afete o funcionamento do programa.

Os atributos de um package podem ser:


Application Component Determina qual application component dentro da
hierarquia de componentes do repositri, o pacote far parte.
Software Component Para desenvolvimentos customizados (que comecem
com a letra Z), deve ser sempre HOME.
Transport Layer Determina se o package pode ser transportado para outro
ambiente e define qual esse ambiente.
Package Type Voc pode escolher entre:

Standard Package: pode conter objetos do repositrio e outros packages;

Main Package: contm apenas outros packages;

Structure Package: contm apenas outros packages to tipo Main


Package.

VEJA TAMBM

Criando Change Requests de Workbench

***2 Criando Change Requests de Workbench


Publicado em agosto 28, 2007 | 3 Comentrios

PROBLEMA
Criar uma change request para ser usada por novos programas.

SOLUO
Acessar o Transport Organizer (SE09 ou SE10):

Clicar no boto Create ou F6, e escolher Workbench request:

Atributos da change request:

Change request criada:

DISCUSSO
Os sistemas SAP so geralmente separados em um ambiente de
desenvolvimento, outro de Qualidade e outro de Produo. Esses ambientes so
totalmente independentes, na maior parte dos casos instalados em mquinas
diferentes.
Para se transportar um objeto do repositrio de um ambiente para o outro, usase as chamadas change requests. No dia-a-dia do desenvolvedor ABAP, as
change requests mais usadas podem ser do tipo Customazing ou
Workbench.
As change requests do tipo Customazing so reservadas para transportar
contedo de tabelas do tipo customazing. Essas tabelas contm informaes de
configurao dos mdulos funcionais (FI, MM, SD etc.) ou configuraes do
sistema.
J as chage requests do tipo Workbench so para os outros tipos de objetos do
repositrio, como packages, tabelas transparentes e, no nosso problema,
programas.
Os objetos so criados ou modificados no ambiente de desenvolvimento. Aps
os devidos testes, a request deve ser liberada (released) e o time que cuida da
infraestrutura do sistema SAP, tambm conhecido como Basis, responsvel
por efetuar o transporte para o sistema subsequente.

VEJA TAMBM

Criando Change Request na Criao de um Objeto

Criando um Programa Calculadora Verso Report


Publicado em setembro 8, 2007 | 2 Comentrios

PROBLEMA
Criar um programa ABAP que receba dois valores digitados pelo usurio e
execute as quatro operaes (adio, subtrao, diviso e multiplicao) entre
os dois valores.

SOLUO
Passo 1: Criar um programa executvel chamado ZRCALC.
Passo 2: Definir os dois parmetros nos quais o usurio ir utilizar para digitar
os valores para o clculo e tambm outro para indicar a operao desejada.

Passo 3: Definir uma varivel local do tipo package, com duas casas decimais,
para atribuir o valor calculado.

Passo 4: Definir uma estrutura CASE para escolher a operao escolhida pelo
usurio.

Passo 5: Imprima o valor na sada do relatrio.

Passo 6 (opcional): Inclua uma verificao se a operao escolhida vlida e


se escolhido a diviso, verificar se o valor 2 diferente de zero.

A listagem completa do programa, voc encontra na seo Anexos.

EXECUO E TESTE
Execute o programa (F8) e entre os seguintes na tela de seleo:

Execute o reltorio (F8) e voc dever obter uma sada parecida com a descrita
abaixo:

No esquea de testar tambm o caso de uma operao invlida e um caso de


diviso por zero.

DISCUSSO
Nesse simples programa j vemos uma sria de elementos comuns em
programa ABAP.
A primeira tela do programa chamada de Tela de Seleo (Selection Screen),
onde o usurio entra com os parmetros que sero utilizados no relatrio.
Um dos comandos usados para desenhar a tela de seleo a instruo
PARAMETERS. Usamos a forma mais simples, ainda h muitas outras
possibilidades, que discutiremos mais a frente.
Declaramos variveis com o comando DATA, indicando o nome da varivel e o
tipo. No nosso programa, usamos somente tipos primitivos, mas as
possibilidades so ilimitadas, j que o ABAP Objects fortemente tipado.
Os tipos padro usados no ABAP Object so:
Tipos completos, sem necessidade de complemento:

D Data, no formato AAAAMMDD, com tamanho fixo de 8;

T Tempo, no formato HHMMSS, com tamanho fixo de 8;

I Inteiro, tamanho fixo de 4;

F Nmero de ponto flutuante, tamanho fixo de 8;

STRING Cadeia de caracteres, sem tamanho fixo;

XSTRING Cadeia de caracteres (Hexadecimal), sem tamanho fixo;

Tipos incompletos:

C Caracter string, podendo ter um complemento, por exemplo a


intruo DATA vl_var(4) TYPE C.;

N Caracter numrico, com caractersticas de caracter e nmero;

X Seqncia de bytes (Hexadecimal);

P Package.

Para imprimir o valor na tela, usamos a instruo WRITE.

Usamos duas estruturas de deciso, a IF/ELSEIF/ELSE/ENDIF para verificar a


operao escolhia e se h diviso por zero e CASE para escolher a operao.
Essa verificao de diviso por zero necessria para evitar um possvel erro
em tempo de execuo no caso de uma diviso por zero. Poderamos tambm
usar Exceptions, mas discutiremos no futuro.
No caso de uma operao invlida, tambm poderamos usar a seguinte
construo no lugar o IF:
CASE p_op.

WHEN OTHERS.
WRITE: No valid operation'(iop).
ENDCASE.
A opo OTHERS significa que se nenhuma das alternativas do WHEN foi
satisfeita, o opo OTHERS executada. Ento, se a operao escolhida no foi
vlida, o WHEN OTHERS executado e a mensagem de erro impressa na
sada do programa.
A segunda tela, onde apresentado a sada do programa, comandos WRITE.

Modelo de Dados do SAP Flight Model


Publicado em setembro 21, 2007 | Comentrios desativadosem Modelo de Dados do SAP
Flight Model

O SAP Flight Model o modelo de dados usado em um sistema muito


simplificado de controle de reservas de vos.
Esse modelo utilizado em quase todos os exerccios e demonstraes do
treinamento ABAP Workbench. Ele est disponvel em todas as implementaes
e por isso tambm usado em todos os exemplos do ABAP 101, salvo algum
caso especfico onde ser necessrio o uso de outras tabelas que no as do SAP
Flight Model (SFM).

O SFM composto por 4 tabelas transparentes, SCARR, SPFLI, SFLIGHT e


SBOOK, com o seguinte relacionamento:

SCARR Contm as informaes das companhias areas, como cdigo, nome


etc.
SPFLI Contm as rotas ou coneces oferecidas pelas companhias areas da
tabela SCARR.
SFLIGHT Contm os vos que servem as rotas ou coneces da tabela SPFLI.
SBOOK Contm as reservas para os vos disponveis na tabela SFLIGHT.
Nas vrias verses de Application Server (WAS), incluindo minisap e Linux
testdriver, essas tabelas j vem preenchidas com alguns dados, facilitando os
exerccios.

Quando Usar Type, Like e Begin Of?


Publicado em setembro 25, 2007 | 1 comentrio

A principal tarefa de qualquer programa, independente da linguagem,


trabalhar com dados. Cada linguagem possui as suas formas de criar e
manipul-los. ABAP utiliza tipos como base para criao dos dados que o
programa manipular.

Para criar algum objeto de dado no ABAP, voc utiliza o comando DATA:
DATA v_texto(20) TYPE c VALUE Objeto de Dados.
Nessa declarao, criado um objeto de dado (uma varivel) v_texto, de
comprimento 20 caracteres, com valor inicial Objeto de Dados.
Da mesma maneira para criar variveis para operaes matemticas. Nesse
caso, criamos variveis do tipo numricas, como no exemplo da listagem 1. A
sada desse programa ser:

Alm dos tipos fundamentais da linguagem ABAP (veja mais na discusso


dessepost), podemos criar qualquer tipo de estrutura de dados, como por
exemplo, workareas (rea de trabalho) e internal tables (tabelas internas).
Veja a listagem 2. Esse programa ir calcular a diferena entre os campos
SFLIGHT-SEATSMAX e SFLIGHT-SEATSOCC, de todo as linhas da tabela SFLIGHT.
Como soluo, criamos uma tabela interna que contenha as chaves da tabela

SFLIGHT e tambm um o campo DIFF, quem contm a diferna. Depois de


todas as difernas calculadas, imprimimos o resultado na sada do programa:

Na listagem 2, temos o uso da intruo TYPES, que usada para criar tipos
locais. Esses tipos somente podem ser utilizados no program no qual ele foi
declarado, nesse caso ZTYPE1.
Como tipos locais, temos ty_s_sflight_dif, descreve uma estrutura de dados
ety_t_sflight_dif uma tabela interna com a estrutura de ty_s_sflight_dif. Para
declararmos um tipo estruturado local, usando BEGIN OF / END OF.
J os tipos globais podem ser provenientes do dicionrio de dados do SAP. No
programa ZTYPE1, usamos alguns tipos globais, como a tabela SFLIGH e alguns
de seus campos, como sflight-carrid, sflight-connid etc. Os tipos globais podem
ser usados (DATA TYPE.) em qualquer programa o sistema, no h
necessidade de nenhuma declarao no programa.

Quando usamos o TYPE com uma tabela transparente (tabela de banco de


dados), o objeto de dado declarado ser uma workarea, com a estrutura da
tabela transparente. Por outro lado, quando usamos TYPE TABLE OF, estamos
declarando uma tabela interna, com estrutura da tabela transparente.
Veja essa parte do programa ZTYPE1.

DATA: w_sflight TYPE sflight,mas


t_sflight TYPE TABLE OF sflight,

Temos uma workarea w_sflight e uma internal table t_sflight, com estrutura da
tabela transparente SFLIGHT.
Por ltimo, temos a seguinte declarao de varivel:
DATA: v_diff LIKE w_sflight_dif-diff.
O LIKE indica que o objeto de dado declarado possui o mesmo tipo de outro
objeto de dado j declarado, podendo este ser local ou global.
No caso acima, a varivel v_dif, possui o mesmo tipo do campo da
workareaw_sflight_dif-dif, ou seja, sflight-seatsmax.
Agora j sabemos quando usar TYPE, LIKE e BEGIN OF.

Voc tem medo de ensinar?


Publicado em janeiro 11, 2008 | 2 Comentrios

Trabalho com projetos SAP, especificamente ABAP, h cerca de 7 anos. Uma


prtica muito comum a figura do sombra. O sombra aquele consultor
jnior (geramente no seu primeiro projeto), que alocado a um projeto, sem
cobrar as suas horas do cliente.
Com isso, a sua consultoria consegue treinar um novo consultor em situaes
reais da rotina de um projeto.Isso pode ser timo para o sombra, pois esse
treinamento on-the-job uma maneira de dar a ele alguma experincia sem a
responsabilidade de um consultor cobrado do cliente.

No entanto, para o consultor experinte, isso representa um aumento de


trabalho, pois alm do trabalho normal como consultor, ele precisa explicar
tudo ao sombra.
Eu nunca tive um sombra para ajudar, mas j coordenei uma equipe de umas
10 pessoas totalmente inexperintes, onde tive de ensinar muitos macetes para
que as coisas andassem no prazo determinado.
Nessa semana, conversando com um consultor que trabalha comigo, ele
revelou-me que j criou a maior confuso em um projeto por negar-se a ensiar
um outro consultor menos experinte. De acordo com ele, no havia sido
contratado para ensinar. O seu outro argumento foi que ele no queria que o
mercado SAP crescesse muito e que ele tinha medo que o seu salrio
diminuisse devido ao aumento do nmero de consultores.
Vi comentrio semelhante a esse no dieblinkenlights.com. De acordo com o
autor, falando sobre a linguagem de programao Phyton, disse:
Eu a considero uma vantagem competitiva e se voc, meu leitor, no souber do
que se trata, melhor para mim.
Nesse projeto onde eu fui o coordenador, tive a satisfao de acompanhar o
desenvolvimento profissional de alguns deles. Hoje, ainda converso com eles
pelo MSN e fico orgulhoso quando leio fulano @ USA no nickname, indicando
que est em algum projeto internacional.
Por que esse medo de ensinar? Ento quer dizer que se eu ensinar outras
pessoas, corro risco de saturar o mercado de profissionais e diminuir a minha
empregabilidade?
Esse medo expressa uma mentalidade limitada. Aprendi que o meu sucesso no
depende de uma ferramenta, linguagem ou plataforma. Essas vo e vm a todo
momento. O que relamente conta qual o seu comportamento profissional,
ou seja, vontade de aprender coisas novas e procurar novos conhecimentos
para se manter sempre a frente.
Eu realmente adoro ensinar e sou totalmente seguro da minha
empregabilidade, pois ela no depende 100% da ferramenta ou linguagem de
programao que uso. Tanto que hoje, alm do meu trabalho como coordenador

de desenvolvimento, sou intrutor ABAP. A vontade de ensinar, abriu-me novas


portas alm da consultoria.
Cuidado se voc pensa como meu amigo, provavelmente logo ser
ultrapassado por esse consultor jnior que est do seu lado, afinal de contas,
para o meu amigo, a sua nica preocupao :
se meus concorrentes lerem e aprendam alguma coisa.
(Texto originalmente publicado no Papel no Vaso.)

Material Inicial Sobre Orientao a Objetos


Publicado em janeiro 25, 2008 | 4 Comentrios

Aprender Orientao a Objeto (OO) mudar a sua forma de resolver problemas.


OO no substitui a programao procedural, mas fornece um ferramental
poderoso para comunicar e solucionar problemas complexos.
No quero aqui explicar extensivamente OO, mas apresentar alguns materiais
que pesquisei na internet e que julgo ser apropriados como introduo ao
assunto.
Sugiro o captulo 1 do livro Think in Java ele d uma boa base sobre OO. Esse
livro um clssico no mundo Java, pricipalmente por ser distribuido
gratuitamente em PDF.
O Wikipedia tambm pode ser uma boa fonte.
Voc vai ver que tem vrias fontes na internet e muito livros sobre o assunto.
Para aprender OO eu li muito e principalmente treinei. A chave de OO usar,
usar e usar. No tem mgica.
Nesse estudo inicial, atente para os conceitos de classe, instncia, atributos,
mtodos e mensagens. Dependendo da sua experincia com programao,
herana pode ser aprendida sem muito esforo. J polimorfismo mais
complicado e demanda um pouco mais de esforo para entender.

No h uma explicao final para os conceitos de orientao a objeto. Voc ter


que estudar vrias fontes para chegar as duas prprias concluses.

Porque todo ABAP deveria estudar


Fiori (tambm)
BY FBIO PAGOTI OCTOBER 20, 2015

Compartilhe!

Alguns meses atrs publicamos aqui no ABAP101 alguns


artigos comentando a importncia de algumas tecnologias e
ferramentas na lista de skills que um (bom e atualizado)
desenvolvedor ABAP deveria ter. Para citar tais artigos, temos
o post Porque todo ABAPer deveria comear a aprender UI5
(SAPUI5/OpenUI5) j, escrito por mim mesmo (e plegiado por
um man, mas isso outra histria) e os artigos Porque todo
ABAP deveria estudar HANA e BRFplus: a ferramenta que

todo profissional SAP deve conhecer, escritos pelo meu


amigo Thiago Ourives que agora nos l diretamente do futuro.
No preciso muita viso para notar que tal lista de
exigncias s cresce. fato que algumas exigncias
estrapolam para coisas no-relacionadas a rea de atuao
normal de um ABAP, como j citado no polmico post
Verdade Seja Dita Oportunidades ABAP ALL. A ideia deste
post abordar a importncia do Fiori, que na minha humilde
opinio, se encaixaSIM na lista de skills que um ABAP deve
ter.

Mas o que o Fiori?


Google it. SCN it.

Justificativas
Agora que voc j sabe o que o Fiori, gostaria de dar
algumas justificativas para embasar a ideia de que isso
problema do ABAP.

No fundo, Front End


Fiori famoso pela sua simplicidade (para o usurio), na
experincia (de novo, para o usurio) e no foco do trabalho
(para quem? Para o usurio). Para que o dito cujo tenha isso
tudo, alguns tem que pagar algum preo. Para fazer uma
aplicao responsiva, de bom gosto, que aplique as melhores
prticas de acordo com o Fiori Design Guidelines preciso
algum conhecimento de desenvolvimento front end,
obviamente incluindo UI5.
E quem voc acha que est mais perto em conhecer
desenvolvimento na esfera SAP do que o desenvolvedor
ABAP? No vou entrar no mrito de pessoas novas, por
exemplo desenvolvedores front end de outras tecnologias,

entrarem no mundo SAP este tipo de discusso alm de no


ser o foco simplificar demais o assunto. Fiori no feito
apenas de um front end feito em UI5. Mas isso passa sim por
saber desenvolver aplicaes.
A diferena que as aplicaes agora tem um outro foco e
so construdas de outra maneira. Apesar de isso soar como
uma pssima notcia para quem nem WDA aprendeu direito,
existe um lado bom da moeda. Se voc j desenvolveu uma
aplicao com um parameter voc j tem experincia em
desenolvimento front end. Sim, uma experincia til ainda
porm tosca esteticamente e cada dia mais prxima de
virar obsoleta se considerar o rumo que as coisas caminham.

Gateway
O Fiori funciona com o Gateway por trs dos panos. E no s
nos aplicativos! Os prprios servios base para o Fiori
Launchpad que exportam por exemplo os catlogos do
usurio, foram criados no Gateway. Entendendo isso
possvel se virar muito bem na hora de fazer muito
troubleshooting.
Alm disso, a principal transao do Gateway comea com as
letras SE (SEGW). Se isso no soa como um argumento vlido
para justificar a relao com desenvolvedores ABAP, os
projetos criados nesta transao so feitos usando o
dicionrio, funes, BAPIs e cdigo totalmente customizado.
Se voc achava que poderia surgir um novo tipo de
profissional chamado de Fiori que era totalmente segregado
do mundo ABAP voc

Errou do fausto

Afinal.. se houvesse mesmo este perfil profissional novo entitulado


Fiori, ele deveria conhecer Gateway.. e conhecer Gateway passa por
conhecer ABAP (e REST, diga-se de passagem). Logo, mais fcil ser
um ABAP que vai l e aprende.

Mas quantos ABAPers sabem Gateway?

Quantos ABAPers hoje conhecem UI5?

Qual a proporo de ABAPers que sabem o que


REST/oData?

Quantos conhecem os 3 itens acima juntos?

(Ahh vamos ignorar o fato de mais da metade das aplicaes Fiori


requerem conhecimentos em HANA neste item)
Hoje, a minha sensao que a minoria dos profissionais tem tal
perfil. E no estou buscando culpados. Estou apenas dizendo o que
sinto lendo o que vejo e ouvindo o que escuto.
E qual a soluo?
Resumo tomando emprestada parte do comentrio fantstico do
Custdio escrito recentemente no ABAPZombie:
() Pra isso a solucao eh simples: aprende fidumegua! Ou
voce (empresa) contrata alguem que sabe, ou alguem que
queira aprender. E fim. (Custdio, em comentrio no
ABAPZombie)

Ritmo de crescimento de aplicativos


Uma maneira relativamente confivel de se verificar o nmero de
aplicaes standard do Fiori consultar o Fiori Apps Library e clicar
em All Apps. No momento que este post escrito, dia 20 de Outubro
de 2015, h 602 aplicaes nesta lista. verdade que h aplicaes

duplicadas para produtos diferentes mas no deixa de ser 602


aplicaes.
Pode no parecer muito talvez, mas considere que o Fiori tornou-se
gratuito em 3 de Junho de 2013 e que at o final daquele ano mal
havia documentao de qualidade e detalhada sobre Fiori. Se
considerar os dias teis que se passaram desde ento, sem incluir
feriado algum, a SAP entrega 0,97 apps por dia! uma aplicao
standard nova por dia!
Eu acho isso muito acho o ritmo que a SAP est empregando
absurdamente frentico.
Destas 602 aplicaes, considere o fato de haver quase 150 que
demandam o SAP Simple Finance.
Considere agora que o Simple Logistics est quase saindo!
Eu sou capaz de apostar que ainda terminaremos o ano de 2015 com
mais de 800 aplicaes. E fao uma projeo para que haja 1500 no
final de 2016 (o que seria dobrar o nmero em 1 ano).
Um dos principais motivos que me levam a crer nisso a adoo do
Fiori e dos novos recursos inseridos no UI5 1.30, como os controles
de Semantic Page. Algumas coisas que j li sobre o NW 7.5 me
levam a crer que a criao de servios no Gateway tambm tendem a
ser simplificadas mas estas mudanas so ainda nebulosas para
mim.
E pensar que tem consultoria buscando gente para implantar (e no
implementar) 3 ou 4 apps como parte de um projeto de meses!

Referncias bibliogrfica
Apesar de ainda no ter lido o livro do Maurcio ABAP: O guia de
sobrevivncia do profissional moderno, vale a pena mencionar o
que o livro aborda no captulo 8. No li (ainda) mas j recomendo!

Enhancements
J fez algum enhancement na vida? User exit.. manja?
Uma vez que o usurio use as aplicaes Fiori (como j esto usando)
voc pretende encontrar um PERFORM no meio de um cdigo
Javascript? I hope not.
E por qu? As aplicaes Fiori possuem pontos de enhancement
tambm. A forma de implementao muda exige conhecimentos
ferramentais como alguns recursos do HANA, slidos conhecimentos
em UI5 e Javascript e orientao a objetos por conta do Gateway para
citar o mnimo.

HANA e HCP
Veja o vdeo abaixo, reflita e compare o que mostrado com o tipo de
desenvolvimento ABAP que estamos acostumados, onde consultorias
vendem relatrios ALV como sendo o estado da arte.

http://abap101.com/2015/10/20/porque-todo-abap-deveria-estudar-fioritambem/

Em suma
Se voc quer fazer umas brincadeiras desta como visto acima, no
ignore Fiori. E no ignorar Fiori aprender muita coisa interessante de
antemo e ao mesmo tempo.

Porque todo ABAPer deveria


comear a aprender UI5
(SAPUI5/OpenUI5) j

BY FBIO PAGOTI FEBRUARY 26, 2015

Compartilhe!

Passou o carnaval! Feliz ano novo!


O ABAP101 um site que mesmo quando um pouco parado,
me surpreende. O site vai completar 8 anos em 2015. Isso
mesmo, 8 anos. Uma das coisas que mais me impressiona
como at os posts mais antigos do site escritos pelo Furlan
ainda tem uma quantidade imensa de acessos. Como os
ensinamentos de
como
procurar
e
implementar
BAdI eentendendo o For All Entries ainda so to atuais, no
mesmo? Sem falar no vdeo de instalao do Minisap que faz
com que praticamente a qualquer hora do dia algum esteja
vendo o ABAP101 mundo afora.
Hoje notei que uma das pginas que mais me deu trabalho e
satisfao
em
escrever
(a
famosa
MATRIZ
DE
CONHECIMENTO ABAP JNIOR, PLENO E SNIOR) igualou-se
em nmeros de acessos de uma das pginas mais simples
mas que o pessoal mais d bola (uma pesquisa salarial).
Quem sabe isso seja um indcio que algumas pessoas esto se
importando mais com o conhecimento do que o salrio. Ou
que pelo menos entendam que o salrio uma consequncia
do conhecimento.
Apesar de tantos posts serem teis at hoje, a cada dia que
passa os profissionais ABAP deveriam estar mais interessados
(ou pelo menos mais preocupados) em aprender algo
realmente novo e que cedo ou tarde pode vir a fazer parte do
seu dia a dia. O tpico contedo que o ABAP101 ainda no
explora e que o pouco disponvel est perdido em blogs na
SCN ou repositrios pequenos do GitHub. Por exemplo: UI5.
Atualmente na nossa matriz de conhecimento UI5 marcado
ainda como um conhecimento extra, que nem um snior
deveria obrigatoriamente ter. Ainda.

Matriz de Conhecimento 26/02/2015

UI5
Se
voc
atua
com
desenvolvimento
ABAP
hoje
voc certamente no precisa saber como criar aplicaes
em UI5. Todavia, certamente voc j deveria saber o que o
UI5 . Caso voc no saiba ainda o que UI5 (um nome mais
genrico para SAPUI5 ou OpenUI5) sinal que voc no abre
a home page da SCN h mais de 1 ano.
UI5 uma biblioteca javascript para criao de aplicaes
usando MVC criada pela SAP. Quando falamos em UI5 estamos
falando de desenvolvimento front end. Grosseiramente
falando, UI5 um concorrente do Backbone.js, AngularJS,
EmberJS, Dojo ou qualquer outra biblioteca elencada
na Wikipedia ou no TodoMVC.com. Grande parte dos novos
produtos da SAP no so mais feitos em reports, module
pools, BSPs ou Web Dynpros (apesar do ltimo ainda ser
usado pela SAP em novos desenvolvimentos). Boa parte do
que a SAP desenvolve hoje em dia feito em UI5 na parte do

front end. Se voc j ouviu falar em alguns nomes como


Gateway, SUP, Hana, Fiori ou HCP saiba que o UI5 est
totalmente inserido nestes contextos.
Voc est avistando, ainda mesmo que de longe, uma
oportunidade para ser desenvolvedor Hana? Ento aprenda
UI5 pois faz parte do que voc vai precisar na sua caixa de
ferramentas.

SAPUI5 vs OpenUI5
Como dito anteriormente, UI5 um termo genrico que quer
dizer ou SAPUI5 ou OpenUI5. Quando a SAP introduziu a
biblioteca ela no tinha o cdigo aberto e uma licena de uso
mais restritiva (SAPUI5). Depois de muita presso e discusso
da comunidade de desenvolvedores, a SAP resolveu abrir o
fonte da biblioteca e mudar a licena. Foi necessrio ento
criar um outro nome (OpenUI5). O SAPUI5 ainda existe e
tecnicamente diferente do OpenUI5. A principal diferena
tcnica entre ambos hoje o fato do SAPUI5 incluir uma
biblioteca grfica enquanto o OpenUI5 no. Veja exemplos de
construo de grficos no SAPUI5 no Hana Brasil. Felizmente
para quem conhece Javascript fica fcil aprender a usar
bibliotecas grficas externas como D3 ou Raphael.

Web Dynpro vs UI5


Um argumento para no aprender UI5 o seguinte:
O Web Dynpro fez 10 anos recentemente, eu ainda no
aprendi, nunca usei nem precisei. Por que deveria aprender
outra maneira de criar aplicaes web?
Se voc se encaixa no perfil acima, boa pergunta. O Web
Dynpro no vingou como deveria. Outras tecnologias web da
SAP no vingaram como deveriam. Mas pela primeira vez na
histria a SAP est deixando claro como a neve o que ela quer

para usabilidade, experincia do usurio e ergonomia das


duas aplicaes. Tem at curso sobre o assunto na OpenSAP.
E hoje o foco claro: back end em Hana e front end em Fiori
(que HTML5, que por sua vez criado em UI5).
O argumento do Web Dynpro embasado, mas eu no
apostaria que o mesmo vai acontecer. Em outras palavras, o
UI5 vai vingar. Talvez nunca vire a melhor biblioteca de
Javascript para MVC, mas com certeza vai vingar muito mais
que o Web Dynpro pois para desenvolver muitas aplicaes
em Hana, telas em ABAP ou Web Dynpro no sero
alternativas possveis. Tirando o fato de HTML5 estar se
tornando cada dia mais um padro de facto.

O ABAP da prxima gerao


O desenvolvedor ABAP da prxima gerao, que comeou
com o advento do Hana, deve ter conhecimentos em
desenvolvimento Web. Saber programar em Web Dynpro no
requer profundos conhecimentos Web. Por exemplo: padres,
protocolos, arquiteturas ou detalhes de navegadores. No caso
do UI5, diferente. preciso entender HTML, CSS,
Javascript e ser familiar ao jQuery para ento comear a
engatinhar no UI5. E para este caminho que o ABAPer da
prxima gerao deve seguir.
No livro Next generation ABAP development / Rich Heilman,
Thomas Jung. 2nd ed., que foi escrito em 2011 (antes do
UI5), dos 20 captulos do livro 8 so de alguma forma
relacionados a desenvolvimento Web (MVC, web services,
Web Dynpro, BSP). Desde 2013 a SAP Press est pensando na
terceira edio do livro, que sinceramente no sei o
andamento atual. Porm, aposto que ter algo de UI5 alm de
falar da integrao ABAP/Hana. Pelo menos o livro ABAP to
the Future / Paul Hardy j aborda UI5. E se ainda no est
convencido, j h um livro oficial da SAP Press exclusivo
de UI5.

Ento agora que o ABAP vai


morrer?
Esta pergunta surge de tempos em tempos mas a resposta
continua sendo no. Por isso se voc est comeando com
ABAP fique tranquilo no que tange a estar aprendendo uma
linguagem nova. O ABAP ainda e ser usado. A tendncia
apenas que no se use ABAP tanto como hoje para criao da
interface com usurio pois o mundo moderno roda no
navegador num padro aberto. Mas que fique claro que a
cada dia o ABAP que se aprende hoje se torna mais
insuficiente para as futuras demandas.

E se eu no aprender UI5?
Quais minhas chances no
mercado?
Sou da opinio de que os ABAPers que ignorarem o UI5 e que
iro tentar permanecer atualizados de alguma forma devero
se aprofundar na parte do back end. O que vai envolver
bastante estudo tambm. Trocando em midos, voc dever
aprender Hana, oData, Gateway, Core Data Services,
integrao ABAP/Hana e ainda sim web services e
javascript. No d para ficar 100% em um dos lados.
O desenvolvedor ABAP tpico talvez nem conhea os termos
back end e front end apesar de ter estes dois papis no seu
dia a dia. O ABAPer um desenvolvedor full stack com bons
conhecimentos de bancos de dados por natureza. Quem vai
contratar desenvolvedores ABAP do futuro no ir esperar
menos que isso.
Talvez haja a distino desenvolvedor front end, back end nas
contrataes daqui um certo tempo mas no ignore o fato
da maior parte ofertas de trabalho serem de consultorias.

Consultorias precisam de pessoas que alm de outras coisas,


entendam da arquitetura dos sistemas que atuam e
construam solues tcnicas em cima das mesmas. Ignorar
UI5 significar no ser um consultor-desenvolvedor SAP
completo. Assim como ignorar o Hana ter a mesma
consequncia.

Por onde comeo a aprender


UI5?
Alm da SCN, livros na SAP Press ditos anteriormente e o site
oficial doOpenUI5.org, eu recomendo assistir apresentao
que fiz no SAP Inside Track So Paulo, no final de 2014. Ela
ensina como voc hospedar sua aplicao UI5 no GitHub e
torn-la pblica.

http://abap101.com/2015/02/26/porque-todo-abaper-deveria-comecaraprender-ui5-sapui5openui5-ja/

Claro,

voc

precisar

de

um

ambiente

de

desenvolvimento.

Felizmente para montar ele no mundo de desenvolvimento Web


necessrio ter uma IDE qualquer (recomendo o Sublime Text ou
Eclipse) e um servidor Web (Tomcat, MAMP, Node/Grunt, etc). Ou
apenas voc pode usar sites como oJSBin ou JSFiddle para comear
a brincar com UI5.
Bons estudos! No deixe de comentar!

Porque todo ABAP deveria estudar


HANA
BY FBIO PAGOTI MAY 21, 2015

Compartilhe!

No ltimo final de semana conclu um curso de ABAP on


HANA. Atualmente trabalho com HANA (e UI5) no meu dia a
dia mas no de maneira integrada com o NetWeaver. Em
outras palavras, trabalho com desenvolvimento nativo em
HANA e no como ABAP numa empresa que tem o HANA.
O curso foi timo e quero em breve criar alguns posts aqui no
ABAP101 compartilhando esta experincia. Mas por hora nada
melhor de convidar o meu instrutor do curso, Thiago Ourives,
que alm de ter se provado um profissional fora da caixa
escreveu em poucos pargrafos porque todo ABAP deveria
estudar HANA.
Leia na integra!

(Por Thiago Ourives)


Fazem alguns anos que a SAP tem uma meta de crescimento
mnimo de 10% trimestral, o double digit quarter, o que
atrai muitos acionistas no mundo todo, no apenas pelo
crescimento da empresa e consequente valorizao do papel,
mas tambm pela clara e constante margem de lucro que a
empresa respeita.
Mas, como bons analticos que so nossos colegas alemes, a
SAP logo notou que em poucos anos no haveria mais espao
para essa meta de crescimento apenas no mercado
tradicional de ERP era necessrio expandir para novos
mercados, e as escolhas foram duas: Banco de Dados e
Nuvem, e com o objetivo traado, a SAP deu incio ao
desenvolvimento de seu banco de dados, poca chamado
de NewDB, e saiu as compras para os demais itens
necessrios.

A sequncia de aquisies da SAP fantstica, e com certeza


pode ser assunto de outro post, mas nesse momento, falemos
do desenvolvimento de seu banco de dados (que no
apenas um banco de dados!): o SAP HANA.

O que o SAP HANA?


Uma das perguntas que mais ouo, em relao ao HANA, se
ele um Banco de Dados.
A resposta afirmativa. mas ao mesmo tempo, usar essa
definio para o HANA, em alguns crculos, pode ser uma
ofensa grave!
como dizer a um Arquiteto JAVA que ele trabalha com
aquela linguagem de fazer sites ou a um consultor PI que
ele s o trabalho dele s arrastar quadradinhos.
JAVA mais que internet, PI mais que os quadradinhos e
HANA muito mais que um Banco de Dados.
O HANA um conjunto de ferramentas da SAP, que envolve
desde a seleo dos fabricantes dos chips, a parceira com a
tambm alem SUSE, o seu HANA Studio e suas ferramentas
de de modelarem e extrao de dados (SAP BO, SLT, DxC,
etc.), o suporte a suas novas opes de programao, como
UI5 e o HANA XS e, por ltimo e no menos importante, a
construo de de seus novos Data Center e a nova parceria
com a IBM, que possibilitam a venda do HANA como um
servio de Plataforma (PaaS).

SAP x HANA
A SAP est apostando alto no HANA. Muito Alto.
To alto que no est satisfeita apenas em ter sua plataforma
servindo de base para seu principal produto, o ECC.
Ela est apostando o prprio ECC e sua slida liderana no
mercado de ERP ao escolher re-escrever sua soluo

utilizando o HANA como alicerce e visando o mercado de


nuvem.
O futuro da SAP o HANA e depende do sucesso dessa
ferramenta.
Por consequncia, o futuro de todo o ecossistema SAP e de
seus profissionais depende de sua agilidade na adaptao a
essa nova tecnologia.

Como consultor ABAP, por que


devo me preocupar?
Porque o SAP no vai mudar, ele j mudou.
E o ABAP, assim como seu papel de atuao, tambm.
A linguagem do ABAP est em constante evoluo, e tem
caminhado para se tornar um meio-campo ideal entre o HANA
(como backend) e o UI5(como frontend), seja servindo como
camada protetora ou como meio de seleo e organizao do
repositrio HANA.
O ABAP de nova gerao no apenas sabe UI5, ele precisa ter
conceitos de modelagem em HANA, programao orientada a
conjuntos e Push-Down de cdigo. Assim como conhecer as
ferramentas de segurana e gerao de servios do Stack
ABAP.
Claro que o Stack ABAP segue existindo e durante muito
tempo ainda teremos nossa base instalada que ainda usa o
4.6C, mas se formos pensar no mdio prazo, a hora de se
preparar agora!

Como se preparar e aonde


esto os recursos?
Bom, esse um assunto para outra postagem.
Por hora quero agradecer a pacincia de todos na leitura e
dizer que estou a disposio para conversar e aprender sobre
SAP e HANA com todos vocs.
Grande Abrao!
Thiago Ourives.

BRFplus: a ferramenta que todo


profissional SAP deve conhecer
BY FBIO PAGOTI JUNE 3, 2015

Compartilhe!

Dias atrs publicamos o artigo Porque todo ABAP deveria


estudar HANA, por Thiago Ourives, que despertou a
curiosidade de muitos, principalmente no Facebook e
LinkedIn. Para quem no leu o ltimo texto o Thiago trabalha
com ABAP h um tempo e um dos pioneiros a trabalhar
com ABAP e HANA no Brasil.
Ele escreveu mais um post, agora relacionado a BRF+ (aka
BRF Plus), tpico indito aqui no blog. Se voc nunca ouviu
falar no BRF+ e acha que user exit algo mega atual, reveja
seus conceitos lendo este post.
(Por Thiago Ourives)

Antes de explicar o que o BRFplus, quero falar sobre


possveis solues para um cenrio bem conhecido no mundo
SAP: Determinao de IVA.
Existem, dentro do SAP, diversas formas de implementar a
determinao do cdigo de imposto e que iro permitir ao
cliente chegar ao resultado desejado, eis algumas formas e
suas vantagens e desvantagens:

Customizing
possvel criar uma condio do tipo NAVS, relacionando uma
srie de parmetros que costumam atender a maioria dos
requisitos. de fcil implementao, mas nem sempre fica
transparente ao usurio como funcionam as regras e as telas
de manuteno da NAVS no so muito amigveis.

Exits em ABAP
Em ABAP, possvel escrever o conjunto de regras que for
preciso! Contudo, a manuteno envolve sempre a presena
de um programador e, dependendo da documentao que
foi realizada, exige um certo tempo para que o programador
entenda o que o cdigo atual est fazendo antes de comear
a alterao, fazendo com que uma simples regra nova demore
muito a ser implementada.

Tabelas Z
A vantagem de ter tabelas Z ter algo desenhado de forma
especfica para o cliente, de simples manuteno e que pode
atender as excees necessrias. A desvantagem, entretanto,
fica por conta do processo de mudana nas regras, que
envolve transporte por request em todos os ambientes (DEV,
QAS, PRD) bem como sua validao.

BRF+

O BRFplus, que hoje faz parte da licena NetWeaver,


consegue juntar o a praticidade de uma condition NAVS, a
nvel de ateno de um cdigo ABAP e a flexibilidade de uma
tabela Z, somando a isso uma interface amigvel e sem a
necessidade de validao e transporte associado a requests.
Como ele faz isso? simples! O BRFplus o motor de
regras do SAP NetWeaver. Tem como funo servir de
repositrio, de ferramenta de construo e de motor de
execuo de todas as regras standard da SAP, e, desde 2010,
a SAP tem trabalhado para tornar ele tambm a ferramenta
preferencial para manuteno de regras do cliente.
Nessa ferramenta podemos criar aplicaes especficas que
fazem uso deDecision Tables, funes com programao
visual lgica e amigvel, possibilidade de validao e teste na
prpria ferramenta e facilidade de transporte das regras. Tudo
isso sem a necessidade de ABAP, o BRFplus gera todo cdigo
ABAP que for necessrio.
Alm disso, um dos objetivos do BRFplus que o cliente possa
assumir a manuteno das regras, atravs de uma interface
em WebDynpro customizvel e de fcil utilizao.
Grande abrao a todos!

MANDT Campo mandante no


SAP Entendendo de uma vez por
todas
BY FBIO PAGOTI JANUARY 13, 2014

Compartilhe!

Ainda me surpreendendo com a confuso que o campo


mandante (MANDT ou client) gera em grande parte de
pessoas que trabalham com SAP. O conceito simples mas
pelo fato de poder ser aplicado em diferentes circunstncias,
creio que muita gente no esteja 100% segura do que deveria
saber sobre ele. Se quiser entender tudo sobre o MANDT
continue lendo este post. Se voc no faz ideia o que este
campo tambm leia pois ele est presente na grande maioria
das tabelas do SAP.

Onde est o MANDT no SAP?


MANDT na tela de login
O primeiro contato que temos com o campo MANDT (ou
client) logo na tela de login do sistema. Como ele vem
preenchido para ns, pouco nos preocupamos com ele.

Em cada um dos ambientes (DEV, QAS, PROD, etc) podemos


ter 1 ou maismandantes. Cada um dos mandantes possui um
nmero nico que pode ser usado ao fazer login no ambiente
em questo.

MANDT em tabelas do SAP


Caso voc abra praticamente qualquer tabela de dados
mestre ou transacional pela SE11 no SAP notar a presena
do campo MANDT como parte da chave da tabela. Ainda, esta

coluna ser a primeira coluna da tabela, antes mesmo do id


da tabela em si. Isso vale para as tabelas MARA, MARC, BKPF,
BSEG, VBAK, VBAP, EKKO, EKPO e tantas outras no sistema.

Ainda, caso voc tente visualizar os dados desta tabela pela


transao Se11, Se16 ou SE16 notar que no ter como
definir um filtro pela coluna MANDT. Logo, tiramos nossa
primeira concluso sobre clients: eles so independentes
entre si.

Como o MANDT faz parte da chave, podemos ter mais de um


material com o mesmo nmero no MATNR. Obviamente para

isso o mesmo nmero do MANDT (outra parte da chave)


deveria ser diferente.
MANDT (mandante)

MATNR (id do material)

MAKTX (descrio)

800

M-123

Arroz

800

M-124

Feijo

810

M-123

Arroz

810

M-124

Milho

Para qu serve o MANDT?


Ok sabemos que o campo MANDT est em muitas tabelas
(mas no todas). Sabemos que quando ele aparece faz parte
da chave. Sabemos que ele est na tela de login por isso tem
a ver com a sesso na qual o usurio usa. Mas para que serve
o tal do MANDT?
O MANDT serve para separar dados dentro de um mesmo
ambiente sem que haja a necessidade de duplicar tabelas. E
porque preciso separar dados num mesmo ambiente?
Vou dar trs exemplos de aplicao de mais de um mandante
no mesmo ambiente. Isso no significa que todas as empresas
usem todos os exemplos abaixo. Sua aplicao vai variar
dependendo do tamanho da implantao da empresa em si e
como funciona a manuteno e suporte do sistema.

MANDT em desenvolvimento
Um ambiente de desenvolvimento pode ter 2 ou mais
mandantes para separar os dados usados por
desenvolvedores ABAP dos dados usados por funcionais SAP.
No ambiente de desenvolvimento os ABAPers codificam
enquanto funcionais configuram o sistema. A configurao

feita por funcionais nada mais envolve que a insero,


alterao e excluso de registros em uma poro de tabelas
que no so de dados mestre. Estas modificaes em dados
em tabelas de configurao so capazes de alterar o
comportamento do sistema.
Caso voc (ABAP) esteja testando um enhancement (por
exemplo uma user exit em SD) voc pode ser impactado por
uma configurao sendo feita ao mesmo tempo por um
funcional. Por exemplo, a tabela TVAK usada pelos
funcionais em SD para definir documentos de vendas. Se voc
depender de algum documento que esteja sendo alterado por
um funcional, talvez no consiga testar o que precisa. Isso SE
voc e o funcional estiverem compartilhando o mesmo
mandante. Caso no estejam, os dados sero completamente
independentes um do outro e ambos podem fazer seus testes
com tranquilidade na mente. Note que a tabela TVAK possui o
campo MANDT.
Por isso, pode-se ter 2 mandantes em DEV: 1 para
desenvolvimentos em ABAP e o outro para configurao (este
ltimo conhecido como ambiente gold em alguns lugares).
Como o contedo de tabelas de customizao alteram o
comportamento do sistema o ideal que sempre depois que
um funcional fizer um teste bem sucedido em sua
configurao rode a transao SCC1 para equiparar a
configurao entre diferentes mandantes em
desenvolvimento.

MANDT em qualidade
Testes so feitos no ambiente de qualidade. Testes podem ser
manuais e automticos. Testes manuais so geralmente feitos
por funcionais usando dados de teste bem conhecidos por
eles (por exemplo, usando a principal filial da empresa, o
material mais vendido/conhecido, o centro ou depsito com
mais estoque etc). Testes automatizados requerem que um

conjunto de dados de teste estejam j prontos para que o


teste possa ser executado. Caso haja apenas um mandante
no ambiente de qualidade em que h testes manuais e
automticos, um funcional pode deletar ou alterar um
material que usado por uma srie de testes automticos:
que consequentemente iro falhar no por fracasso do teste
em si, mas por conta de dados de teste errados.

MANDT em produo
Como mandantes determinam dados totalmente
independente uns dos outros pode haver um mandante
segregado para cada filial de uma empresa. Note que h
empresas com diversas filiais que usam o mesmo mandante.
Isso porque o conceito de filiais existe no SAP e a privacidade
dos dados entre filiais pode ser realizado de outras formas.

Client-Independent vs ClientDependent
Talvez voc tenha ouvido os temos client-independent (ou
independente de client /mandante) e client-dependent (ou
dependente de client /mandante). Caso no tenha ouvido
saiba que no help do ABAP estas definies so muito usadas.
Elas so usadas para descrever tabelas do sistema de acordo
com a existncia ou no do campo MANDT em suas
estruturas.
Em outras palavras, uma tabela (standard ou Z, no importa)
que possua o campo MANDT ser client-dependent. Isso
porque os dados que voc tem acesso nesta tabela depende
do client usado para fazer logon. Da mesma forma, tabelas
que no possuem o campo MANDT so client-independent.
Estas tabelas so as mais perigosas pois qualquer alterao
nas mesmas impactaro todos os usurios do sistema,
independente em que mandante estejam. Felizmente h

maioria das tabelas no sistema possuem o campo MANDT e


tabelas independentes de client geralmente so de
customizao.

MANDT no SELECT
Como o mandante est atrelado a sesso do usurio, no h
necessidade de especificar esta parte da chave quando se faz
um SELECT (conceito conhecido como Client Handling).
Porm, caso voc deve selecionar dados de todos os
mandantes do sistema, dever usar a adio CLIENT
SPECIFIED do comando SELECT FROM o que
particularmente nunca vi algum usar em cdigo Z.

Quantos mandantes existem


no meu ambiente?
A tabela T000 guarda os mandantes do sistema. Se voc
notar, todas as tabelas que possuem a coluna MANDT tem
uma chave estrangeira para esta tabela. Ou pelo menos
deveriam ter.

Client 000
O mandante 000 reservado pela SAP. A empresa no pode
usar o client 000 pelo simples fato de ele ser intocado. Ou
seja, ele tem a configurao 100% standard existente logo
aps a instalao do SAP. Empresas que tem o costume de
alterar a configurao standard ao invs de criar uma cpia
da mesma podem ter que recorrer a este mandante quando
se perguntam O que eu fiz/O que mudei mesmo?.

Restou dvidas? Comente!


Falei tudo que sei sobre o campo MANDT. Se voc ainda tem
alguma dvida quanto ao assunto, comente a baixo. Este post
deveria encerrar possveis dvidas sobre o conceito.
O mandante um conceito que deve ser entendido se voc
estiver procurando vagas de ABAP. Aproveitando, voc j se
cadastrou no ABAP101?

Criando templates de cdigo no


SAP Logon e no Eclipse
BY FBIO PAGOTI JANUARY 7, 2014

Compartilhe!

H sempre aquele padro de cdigo que vivemos escrevendo


mas ele no exatamente reutilizvel. Um LOOP com alguns
IFs internos de controle um FORM com com alguns
parmetros, alguma mensagem de erro famosa ou aquela
classe bsica com um construtor. Por pura preguia de digitar
tudo novamente (que j est implicitamente decorado)
samos a procura de um programa que j possui um cdigo
que podemos usar como modelo. Ah.. o CTRL+C, CTRL+V
to prazeroso no verdade? No, no . Aqui vai uma
excelente dica que lhe ajudar a ganhar tempo enquanto
desenvolve, seja na SE80 usando o SAP Logon ou o ABAP no
Eclipse. Quer saber? Leia o resto deste post.

Templates de cdigo
Alguns comandos em ABAP, at em verses um pouco mais
antigas do SAP Logon, exibem um tooltip com o sinal de logo
aps o comando. Provavelmente voc j sabe que caso voc
for rpido o suficiente e apertar TAB, um template prdefinido de cdigo ser inserido automaticamente para voc.
Mas voc sabe como criar novos?

Caso voc use o SAP Logon (consequentemente o tcode SE80,


a segunda melhor IDE das linguagens que comeam com A
e terminam com BAP) basta seguir o passo-a-passo abaixo.

Criando templates de cdigo


no SAP Logon
No canto inferior direito do editor ABAP, h um pequeno cone
amarelo com uma pasta e folha desenhada. Este boto abre a
configurao do editor ABAP.

Para evitar que voc sempre tenha uma reao sobrenatural


para apertar TAB, aconselho ir na item Code Completion no
menu a esquerda e alterar consideravalmente o valor da
opo Automatically Hide Code Hints After. Assim voc ter
mais tempo para pensar no que est fazendo e poder apertar

TAB com um certo atraso para completar o cdigo com um


template.

Em sequncia, v na opo Code Templates. aqui que se


define os templates de cdigo. D uma olhada nos existentes.
Como exemplo, voc pode criar um template para quando
voc j sabe que precisar fazer um SELECT e jogar o
resultado em uma tabela interna que ainda no foi criada.
Momentaneamente feche o popup e escreva o template que
voc deseja em um editor aberto qualquer, como o abaixo.
Note que o cdigo no precisa ser compilvel. Basta que ele
facilite sua vida na hora de us-lo.

Uma vez que o seu template seja escrito, copie-o no clipboard


e volte na tela de configuraes do editor, opo Code
Templates.
Clique em adicionar e d um nome (que voc deve lembrar
facilmente) e uma descrio o mais detalhada possvel.

Salve e pronto! Voc tem um template de cdigo!


Para us-lo, basta digitar o nome do template no editor (no
caso, _select_into_table). Uma vez que o nome completo do
template seja digitado, a descrio definida ser exibida em
forma de tooltip. Novamente, basta apertar TAB para que o
cdigo seja inserido de acordo com o template.

Tags
possvel tambm usar tags no seu template. Isso til
quando seu template necessita de informaes dinmicas,
como o dia atual ou o cdigo do chamado que voc esteja
atendendo.
Para ilustrar este cenrio, vamos supor que na sua empresa
ningum saiba como usar o versionador de cdigo ABAP e por
isso seja necessrio incluir comentrios de cdigo como o
abaixo englobando o trecho de cdigo que precisa ser
alterado.
BEGIN OF TICKET-12345 Date: dd/mm/aaaa

changed source code


END OF TICKET-12345 Date: dd/mm/aaaa.

Como o nmero do chamado e a data atual so dinmicas,


basta incluir tags no seu template. No dropdown exibido no
boto Insert Tag h algumas tags pr-definidas, como
%DateTime%. Pelo fato de DateTime estar entre %s, o editor
ir interpretar a informao como uma varivel. Conforme
abaixo.

Quando voc define uma varivel que o editor no capaz de


interpretar, como %Ticket ID%, um input box exibido toda
vez que o template for chamado.

* No h uma varivel pr-definida para somente a data, mas


fica mais fcil remover s o horrio ou deixar no fonte
mesmo. Na minha opinio melhor no usar estes
comentrios que poluem o cdigo e usar o versionador
quando preciso mas, tais comentrios so normas em
muitas empresas.

Mas claro que o ABAP101 no vai dar uma dica como


esta sem nada mais a acrescentar no mesmo? Vamos ver
como o mesmo conceito se aplica no ABAP no Eclipse para
quem j est usando.

Criando templates de cdigo


no ABAP no Eclipse
O Eclipse mais inteligente que a SE80 por isso a qualquer
momento voc pode apertar CRTL+SPACE para acionar a
funo de autocompletar. Para criar templates, v no menu
Window >> Preferences. No menu a esquerda v em
ABAP Development >> Source Code Editor >>
Templates.

Tags
Tags (variveis) no template de cdigo do Eclipse so
denotadas com ${varivel}. Existem mais possibilidades de
variveis para quem usa o Eclipse (data, hora, ano, usurio,
etc). Ao usar um template com uma varivel desconhecida
voc preencher seu contedo aps o template ser inserido,
sem a presena de popups portanto.

Exemplos de Templates
Aqui vo alguns exemplos de templates para voc adicionar
no seu editor predileto (adequados ao eclipse).

1 class ${class_name} definition.

2
3
4
5
6 public section.
methods constructor.

7
8

9 protected section.
1
0 private section.
1
1
1
2

endclass.

1 class ${class_name} implementation.


3
1
method constructor.
4
1
5 endmethod.
1
6
1
7

endclass.

1
8

1 *&---------------------------------------------------------------------*
2 & Report ${zprogram}
3 *&
4 *&---------------------------------------------------------------------*

5 *& Autor:
6 *& Transao:
7 *& Mdulo:
8 *& Decrio:
9 *&---------------------------------------------------------------------*

1 class ${zcl_class_name_test} definition deferred.


2 class zcl_tested_global_class definition local friends ${zcl_class_name_test}.
3 CLASS ${zcl_class_name_test} DEFINITION FOR TESTING
4

FINAL

CREATE PUBLIC

DURATION SHORT

RISK LEVEL HARMLESS

8 .
9

PUBLIC SECTION.

10
11

METHODS mut1 FOR TESTING .

12

METHODS mut2 FOR TESTING .

13

METHODS mut3 FOR TESTING .

14
15

PROTECTED SECTION.

16
17 * GIVEN
18
19
20

METHODS given_reusable
IMPORTING
!im_ TYPE .

21

METHODS given_1.

22

METHODS given_2.

23

METHODS given_3.

24
25 * WHEN
26

METHODS when_mut1.

27
28 * THEN
29

METHODS then_reusable

30

IMPORTING

31

!im_ TYPE .

32

METHODS then_1.

33

METHODS then_2.

34

METHODS then_3.

35
36

PRIVATE SECTION.

37

METHODS setup.

38

METHODS teardown.

39
40

DATA o_ref_to_tested_class TYPE REF TO zcl_.

41

DATA o_exception TYPE REF TO zcx_ .

42 ENDCLASS.
43
44 CLASS ${zcl_class_name_test} IMPLEMENTATION.
45
46

METHOD setup.

47

CLEAR me->o_ref_to_tested_class.

48

CLEAR me->o_exception.

49

ENDMETHOD.

"setup

50
51

METHOD teardown.

52
53

ENDMETHOD.

"teardown

54
55 ************************************************

56 * Methods Under Test


57 ************************************************
58

METHOD mut1.

59
60

ENDMETHOD.

"mut1

61
62

METHOD mut2.

63
64

ENDMETHOD.

"mut2

65
66

METHOD mut3.

67
68

ENDMETHOD.

"mut3

69
70 ************************************************
71 * GIVEN
72 ************************************************
73
74

METHOD given_1.

75
76

ENDMETHOD.

"given_1

77
78

METHOD given_2.

79
80

ENDMETHOD.

"given_2

81
82

METHOD given_3.

83
84

ENDMETHOD.

"given_3

85
86 ************************************************
87 * WHEN
88 ************************************************

89
90

METHOD when_mut1.

91
92

ENDMETHOD.

"when_mut1

93
94 ************************************************
95 * THEN
96 ************************************************
97

METHOD then_reusable.

98
99
10
0

ENDMETHOD.

"then_reusable

METHOD then_1.

10
1
10
2

cl_aunit_assert=>assert_equals(
EXPORTING

10
3
10
4 *

exp

" Data Object with Expected Type

act

" Data Object with Current Value

msg

" Message in Case of Error

= CRITICAL " Error Severity


10 * level
5
* tol
=
" Tolerance Range for Floating Point Numbers
10
* quit
= METHOD " Flow Control in Case of Error
6
* ignore_hash_sequence = ABAP_FALSE " Ignore change sequence in
10
hash tables
7
* RECEIVING
10
8 * assertion_failed
=
" Condition not met
10
9

).

11
0

ENDMETHOD.

11
1

METHOD then_2.

11
2
11

"then_1

cl_aunit_assert=>assert_bound(

3
11
4

EXPORTING
act

" Reference Variable to Be Checked

msg

" Error Message

11
5 *

level

11 * quit
6 * RECEIVING
11 *
7
11
8

" Error Severity

= METHOD

" Flow Control in Case of Error

assertion_failed =

" Condition not met

).

ENDMETHOD.

11
9
12
0

"then_2

METHOD then_3.
cl_aunit_assert=>assert_not_bound(

12
1
12
2

= CRITICAL

EXPORTING
act

" Reference Variable to Be Checked

msg

" Error Message

12
3 *

level

12 * quit
4 * RECEIVING
12 *
5
12
6
12
7

13
0
13
1
13
2
13

" Error Severity

= METHOD

" Flow Control in Case of Error

assertion_failed =

" Condition not met

).

ENDMETHOD.

12
ENDCLASS.
8
12
9

= CRITICAL

"then_3

3
13
4
13
5
13
6
13
7
13
8
13
9
14
0
14
1
14
2
14
3
14
4
14
5

Envie seus templates!


Caso voc use templates de cdigo, cole seus preferidos no
campo de comentrio. Assim, todos podem economizar tempo
tambm!
http://abap101.com/2014/01/07/criando-templates-de-codigo-no-sap-logone-no-eclipse/

No tenho demanda em ABAP O


que fazer?
BY FBIO PAGOTI DECEMBER 6, 2013

Compartilhe!

Por estes dias ns do ABAP101 recebemos um email muito


semelhante a Quase uma crise existencial de um leitor que
deu seu primeiro passo em sua carreira ABAP mas anda com
alguns problemas, entre eles, a falta de demanda. Apesar de
haver muitos do que as consultorias entitulam como Jniors
nas empresas muitas das demandas acabam simplesmente
no caindo nas mos deles. Engana-se os Jniors que isso
acontece somente pela falta de experincia e habilidade no
SAP. Se voc est na mesma situao (ou quer aproveitar as
dicas dadas ao nosso leitor em forma de post) no deixe de
ler este post e comear a ter demandas mais desafiadoras.
Antes de responder ao nosso leitor, deixo o email dele na
ntegra:
Bom dia!
Bom, meu nome XXXXX, me formei em Sistemas de
Informao no fim de 2012.
H uns trs anos fiz um workshop de 40 de ABAP, e foi ai que
conheci um pouco desse mundo.
Depois do curso comecei a trabalhar com PHP e depois fiz um
estgio onde trabalhei com C# e acabei deixando o ABAP um
pouco de lado.. Em Julho com o fim do estgio recebi uma
proposta na empresa que trabalhava com C#, para trabalhar
como ABAP JR, e claro que aceitei! rsrs
Porm nesses 5 meses tenho tido dificuldades nos meus

estudos Acho que mais um problema na minha cabea


Como estou trabalhando as vezes fico incomodado de no
receber demandas fico inventando exerccios e isso me
incomoda muito, parece que estou atoa!
Acho que por sempre conseguir fazer e ter bons resultados
nas outras linguagens, quando o key-user te pede algo que
acha quase impossvel e acaba conseguindo fazer e ele gosta
do que fez e tal, falta esse incentivo entende?
Fao uma srie de exerccios do prprio ABAP101, do SAP
Technical,ABAP Zombie mas quando chega uma
especificao funcional, fico meio perdido
Me desculpe o desabafo! Mas fala a rs me de um rumo! Pode
brigar tambm que as vezes acho que por cabea dura estou
perdendo a oportunidade de estudar e receber por isso rsrs
Tipo o que fazer, pra complicar um pouco os exerccios
Ahh vou fazer a academia estou me programando
financeiramente pra isso.. mas pretendo fazer quando estiver
mais entendida pra nao perder muito ou boiar nas aulas..
Desde j agradeo! E o site timo!

Caro leitor, para responder estas dvidas vou dividir o post


por partes. Vamos l!

Formao e experincia
Voc apesar de recm-formada j tem um bom background
(eu tambm sou pois me formei em Sistemas de Informao
tambm em 2010), e no caiu em ABAP por sorte voc
com certeza no possui problemas com lgica de
programao, estruturas de dados, desenvolvimento de
software etc. Ainda mais, ABAP no sua primeira linguagem
e isso te ajuda a ver que Existe vida fora do mundo ABAP, o
que timo. No ache que voc no tenha demanda por

ainda no estar preparada para comear de vez e no


parar mais.

Qual sua funo?

Caso seu chefe no tenha nascido em 1920 ele sabe que voc
naturalmente no vai dar o retorno para ele nas demandas
como um companheiro de trabalho seu que contratado
como Snior. Como imagino que ele uma pessoa sensata,
ele espera que voc se aprimore para dar um retorno para a
rea em que trabalha mais rpido possvel. Se voc aprender
mais criando especificaes fictcias na maior parte do tempo,
tudo bem. O que ele exigir de voc estar preparada
quando ele precisar, como por exemplo, quando um pleno
sair da empresa ou quando comear um projeto no qual
demanda muita ateno e esforo. Portanto, garanta que voc
est sendo paga, para alm de outras coisas, aprender. Se
voc no tem tempo para aprender voc no est exercendo
sua funo em plenitude e consequentemente no est

exercendo seu trabalho. Como diria Maggie (personagem de


The Walking Dead): We all got jobs to do.

A distribuio de trabalho no
SAP diferente
Muitas vezes em outras linguagens o programador tem
contato direto com o usurio. No SAP, nem sempre assim.
Voc dificilmente vai ver um usurio pulando de alegria ou te
xingando de raiva por alguma demanda que voc tenha
atendito. A nossa relao maior com algum funcional que
conhece o que o sistema faz, no faz, no pode fazer e tem
que fazer. Porm o funcional pode no estar de baixo do
mesmo guarda-chuva que voc dependendo do porte da
equipe SAP da empresa em que trabalha. Em outras palavras,
o funcional no tem o mesmo chefe que voc e ele pode
simplesmente passar as demandas que ele tem para outra
pessoa da sua rea, no qual ele tem mais afinidade.
Departamentos prestam servios uns para outros no final das
contas. Ainda, o ABAP tem muitas diferenas entre outras
tecnologias e vai demorar um tempo at que voc deixe o
funcional, no o usurio primeiramente, feliz. Por isso, no
busque no funcional motivao ou incentivo. Foque no
seu trabalho. We all got jobs to do.

Treino treino, Jogo jogo

Exerccios so timos, mas eles tem um elemento crucial


muitas vezes no encontrados em especificaes funcionais
em SAP: clareza. Um exerccio deve ser claro para entender
onde pretende-se chegar. A soluo do exerccio deve ser
detalhada e clara para entender-se como o objetivo foi
alcanado. A metodologia de desenvolvimento de quem
trabalha com SAP via de regra Waterfall, infelizmente (ainda
em pleno sculo 21). Quando uma especificao funcional
chega nas mos de um ABAP nestas condies ela somente
a ponta do iceberg. No ache que pelo fato de voc ter
recebido um email com um documento .docx em anexo
significa que voc no pode conversar com o funcional que
escreveu aquilo sobre a demanda. Antes de falar com ele,
faa um scamming na espec. Via de regra, voc no vai
entender muito mas o suficiente para perguntas coisas do
tipo: Como feito hoje? Por que tem que ser assim? Pode ser
de outro jeito? Voc j tentou? A clareza do requisito est
na demanda que o gerou e no na especificao
funcional que voc recebeu. Busque no funcional tambm
a clareza necessria para saber o que voc est fazendo e
porque est fazendo.

Solicite demanda
Ningum chegar na sua mesa perguntando se voc est
livre para alguma demanda enquanto voc no provar ao
menos uma vez do que capaz. Sente-se confortvel para
acompanhar a resoluo de um chamado juntamente com um
Pleno/Snior, oferea sua ajuda. Caso ele negue (o que
duvido), abra o programa que ele alterou, estude o que ele
fez entenda o que foi feito. Depois, converse com ele sobre o
que voc achou do trabalho dele e agradea pela
colaborao, afinal de qualquer jeito ele te ajudou. Sente-se
preparada para comear um desenvolvimento sozinho? Fale
com seu chefe para ele te lanar um desafio.

No pare na pista

Depois de um tempo, em que voc comear a achar que voc


nasceu para isso e agora s questo de tempo para virar
Snior, lembre-se de no parar na pista.

Participe de projetos Open


Source
Como voc acompanha o ABAP101, com certeza voc sabe
que a SAP publicou uma nova licena de desenvolvimento.
Isso significa que voc agora pode ter um cdigo ABAP
publicado no GitHub sem correr o risco de ser preso(a). Um
projeto seu ou feito juntamente com outras pessoas as quais
usam o tempo livre delas para criar algo til como
o WordPress por exemplo uma grande oportunidade de ter
exerccios mais bem elaborados, alm de ser um grande feito.

Quais suas dicas ao nosso


amigo leitor?
Caso voc tenha chegado at aqui, certamente porque est
ou j esteve nesta situao. Quais os conselhos que voc
daria ao nosso colega de profisso? No deixe de comentar a
em baixo! Tem algum problema relacionado? Comente
tambm!
Um grande abrao a todos e ao nosso leitor que aceitou a
ideia de ter seu pedido respondido em forma de post.

Dicas para quem no consegue


entrevistas no mundo SAP
BY FBIO PAGOTI SEPTEMBER 12, 2013

Compartilhe!

Outro dia destes recebi uma mensagem de uma pessoa


(talvez leitor do blog ou no) a respeito da dificuldade que
ele(a) tem em comear a atuar na rea de SAP, mais
especificamente com ABAP.
Como a pessoa se reservou o direito de enviar esta pergunta
via uma rede social, eu estou me reservando o direito de
publicar minha resposta tambm em rede j que sei que este
problema de muitos. Apenas editei e removi o que no cabe
neste post mas quanto ao assunto principal, que se colocar
no mercado SAP, o texto est na integra.

Pergunta
(todas edies marcadas)
Ol Fabio tudo bem?
Cara estou recorrendo a alguns colegas do [Alguma Rede
Social] uma dica de como atuar SAP, tenho notado que
existem muitas vagas, mas como entrar?

Fiz recentemente academia na [XXXXXXXXX] e desde ento


no estou conseguindo nem sequer entrevista, seria meu
curriculo mal elaborado?
Por favor me ajuda.
Abrao.

Resposta
(todas edies marcadas)
Ol XXXX. Vamos l.
No entendi bem se voc quis dizer isso mas primeiramente,
um erro voc afirmar que voc no consegue sequer
entrevistas por ter feito curso na XXXXXXXXX. Tenha certeza
que caso voc no tivesse feito a chance de voc conseguir
entrevistas para atuar na rea seria ainda menor. ()
Eu no sei em que voc atua mas se vale a dica, procure
pensar em conhecimentos extra-SAP e experincias que voc
pode no ter no grau desejado para as vagas que vem se
candidatando. Ser que o seu nvel de ingls, formao
acadmica, experincia e amostra de outros trabalhos
realizados faz voc se destacar em meio das inmeras
pessoas que se formam em academias ABAP em SP todos os
meses?
Se voc no consegue uma entrevista, eu s vejo 3
possibilidades:
1) Voc j tem o que precisa para atuar na rea mas no
demonstra isso no seu CV
2) Voc ainda no tem o que precisa para atuar na rea e
demonstra isso no seu CV

3) Voc ainda no tem o que precisa para atuar na rea e


para agravar a situao, ainda demonstra isso mal no seu CV
Tenha certeza que na ocorrncia da quarta possibilidade, que
seria ter o que precisa para atuar na rea e demonstrar isso
no CV, voc j estaria no mnimo conseguindo entrevistas e
muito provavelmente empregado na rea e
consequentemente no me enviando uma mensagem.
Quanto ao seu CV, eu no posso analisar porqu () voc no
me disponibilizou.
No sei se este o seu caso, mas mudar de rea requer um
mnimo de planejamento. H muitos e muitos anos, uma
academia SAP, seja oficial ou no, est bem longe de ser uma
garantia de emprego na rea. Ainda, h muitos e muitos anos,
um emprego inicial em SAP est bem longe de remunerar o
que as pessoas que fazem academia acham que se paga.
Para finalizar, se voc puder me falar qual o seu usurio na
SDN, quando foi a ltima vez que apareceu por l e quanto
tempo voc se dedica em se aprimorar em ABAP frente ao
tempo que voc manda currculos, talvez isso me ajude a
entender porqu voc no consegue entrevistas.
Boa sorte,

Postcast sobre RH
Particularmente eu abomino muitas prticas atuais de
recursos humanos. Contudo, elas fazem parte do jogo.
Felizmente h um excelente podcast do Max Gehringer na
CBN sobre empregabilidade. Vale muito a pena conferir
independente se voc trabalha com SAP ou no.

15 indcios musicais que o seu


programa ABAP pode melhorar
http://abap101.com/2013/07/17/indicios-musicais-seu-programa-abap-podemelhorar/
http://abap101.com/2012/10/28/evolucao-do-editor-abap/

Criando Objetos / Chamando


Mtodos Dinamicamente
BY CLAUDIA ANDRESSA JULY 20, 2012

Compartilhe!

Na busca pela soluo de um problema, debugando,


debugando e debugando novamente, me deparei com a
criao dinmica de objetos.
Estudando mais a fundo, eis que surge assunto para mais um
post! Afinal, quanto mais dinmicos forem os programas e API
s, melhor ser sua performance e re-usabilidade.
O que faz com que consigamos criar o objeto / chamar o
mtodo dinamicamente, a utilizao de uma tabela, na qual
informamos todos os parmetros necessrios (seja
de importing, exporting, changing, etc), ou seja, podemos
popular esta tabela de acordo com nossa necessidade em
determinado ponto do programa.
Utilizei como exemplo, a criao de um objeto com referncia
classe CL_GUI_ALV_GRID, o qual chamei de r_grid.

Para facilitar o entendimento, segue abaixo o Pattern


(modelo) da criao esttica deste objeto:

1
2
3
4
5
6
7
8

CREATE OBJECT r_grid


EXPORTING
*

i_shellstyle

=0

i_lifetime

i_parent

i_appl_events

= space

*
1
0 *

i_parentdbg

1 *
1
*
1
*
2
*
1
3 *

i_graphicsparent =

= r_container

i_applogparent

i_name

i_fcat_complete = space
EXCEPTIONS
error_cntl_create = 1

1 *
4
*
1
5 *

error_cntl_init = 2

1 *
6

others

error_cntl_link = 3
error_dp_create = 4
= 5.

1
7

OBS: o objeto r_container do


ripo CL_GUI_CUSTOM_CONTAINER , criado estaticamente
no cdigo abaixo.

Vamos criar o objeto apenas informando o parmetro


obrigatrio I_PARENT, e para isso, utilizaremos
uma workarea do tipo abap_parmbind, e uma tabela
tipo abap_parmbind_tab,
denominadas lwa_param e lt_paramrespectivamente.
Na propriedade Name sempre informaremos o parmetro,
neste caso I_PARENT.
Na propriedade Kind, o tipo (Exporting, conforme modelo
esttico).
Para informar o tipo, precisamos utilizar os atributos da classe
CL_ABAP_OBJECTDESCR, com isso, teremos:

1 lwa_param-kind = cl_abap_objectdescr=>exporting.

Por fim, necessitamos informar o valor atribudo a este


parmetro, e conforme podemos verificar no cdigo abaixo, o
valor o objeto r_container (objeto de referncia a classe
CL_GUI_CUSTOM_CONTAINER).
Desta forma, necessitamos incluir a referncia do objeto na
tabela:

1 GET REFERENCE OF r_container INTO lwa_param-value.

Agora s inserirmos nossa workarea na tabela e criarmos o


objeto / chamarmos o mtodo (no se esquea de utilizar o
try-catch, de forma a tratar possveis excees).

Obs: Verifique a sintax de chamada do mtodo / criao do


objeto. Observe que cria-se o objeto do tipo de uma classe
(informada na varivel lv_type) com os parmetros inseridos
na tabela.

1 REPORT z_create_dinnam.
2
3

TYPE-POOLS: abap.

4
5
6

DATA: lt_param TYPE abap_parmbind_tab,


lwa_param TYPE abap_parmbind.

7
8
9
1
0
1
1
1
2
1
3
1
4

DATA: lv_type

TYPE string,

lv_exc_txt TYPE string.

DATA: r_except
r_grid

TYPE REF TO cx_root,

TYPE REF TO cl_gui_alv_grid,

r_container TYPE REF TO cl_gui_custom_container.

CLEAR: lt_param, lwa_param, lv_type, lv_exc_txt.


REFRESH: lt_param.

1 *--------------------------------------------------------------------*
5
START-OF-SELECTION.
1
6
CREATE OBJECT r_container
1
7
EXPORTING
1
8
1

container_name

= 'CONTAINER_1'

EXCEPTIONS
cntl_error

=1

cntl_system_error

2
0

create_error

=3

lifetime_error

=4

2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3

=2

lifetime_dynpro_dynpro_link = 5
OTHERS

= 6.

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

*--------------------------------------------------------------------*
CLASS cl_abap_objectdescr DEFINITION LOAD.

lv_type = 'CL_GUI_ALV_GRID'.

lwa_param-name = 'I_PARENT'.
lwa_param-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF r_container INTO lwa_param-value.
INSERT lwa_param INTO TABLE lt_param.

*--------------------------------------------------------------------*

TRY .
CREATE OBJECT r_grid
TYPE
(lv_type)
PARAMETER-TABLE
lt_param.

CATCH cx_sy_create_object_error INTO r_except.


lv_exc_txt = r_except->get_text( ).
MESSAGE lv_exc_txt TYPE 'I'.

9
4
0
4
1
4
2
4
3
4
4
4
5
4
6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
5
8
5

ENDTRY.

Fica o desafio: que tal chamar um mtodo dinamicamente e


utilizar uma tabela de excesso? Ela funciona da mesma
maneira para recuperar as excees lanadas pelos mtodos.
Pesquise, tente fazer e em caso de dvidas, entre em contato!

Recursividade em ABAP
BY FLVIO FURLAN JUNE 25, 2012

Compartilhe!

Uma das tcnicas de programao mais incompreendida e


evitada, tambm umas das mais poderosas, a
Recursividade. Eu precisei usar a recursividade apenas uma
nica vez na vida com ABAPer e o resultado foi muito
interessante.
Nesse texto eu vou resolver um problema muito simples
usando recursividade, exponenciao.

Exponenciao
De acordo com a Wikipdia:
Exponenciao ou potenciao uma operao matemtica,
escrita como An, envolvendo dois nmeros: a base a e
o expoente n. Quando n um nmero natural maior do que
1, a potncia an indica a multiplicao da base a por ela
mesma tantas vezes quanto indicar o expoente n.

A frmula da exponenciao simples e por isso considero


um exemplo legal para mostrar a recursividade em prtica.

Exponenciao Usando Recursividade


No ABAP voc pode usar o operador ** para fazer a
exponenciao e resolver todo o problema em uma linha (veja
no programa abaixo), mas esse post no sobre
exponenciao, mas recursividade.
Novamente da Wikipdia:
A recurso o processo pelo qual passa um certo
procedimento quando um dos passos do procedimento em
questo envolve a repetio completa deste mesmo
procedimento. Um procedimento que se utiliza da recurso
dito recursivo. Tambm dito recursivo qualquer objeto que
seja resultado de um procedimento recursivo.
Em ABAP claro significa uma subrotina (form, mdulo de
funo ou mtodo) que efetua uma chamada dela mesmo.
Por exemplo, usando a recurso para resolver um problema
de potncia, farei com que o mtodo
EXECUTE_EXPONENTIATION( ) seja chamado inmeras vezes
por ele mesmo, de acordo com o expoente passado para ele
como parmetro.
Tambm poderamos usar a estrutura de loop DO n TIMES
ENDDO, mas a no seria recurso.
Veja o programa abaixo:
ZABAP101_RECURSION
*&---------------------------------------------------------------------*
*& Report ZABAP101_RECURSION
*&

*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zabap101_recursion.

*----------------------------------------------------------------------*
*

CLASS lcl_math DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_math DEFINITION.

PUBLIC SECTION.

METHODS execute_exponentiation
IMPORTING
base TYPE i
expoent TYPE i
RETURNING value(re_power) TYPE i.

PRIVATE SECTION.

DATA: interaction TYPE i,


power

ENDCLASS.

TYPE i VALUE 1.

"lcl_math DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_math IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_math IMPLEMENTATION.

METHOD execute_exponentiation.
ADD 1 TO interaction.
IF interaction <= expoent.
power = me->execute_exponentiation( base = base
expoent = expoent ).
MULTIPLY power BY base.
ENDIF.
re_power = power.
ENDMETHOD.

ENDCLASS.

"execute_exponentiation

"lcl_math IMPLEMENTATION

DATA: r_exp TYPE REF TO lcl_math,


v_power TYPE i.

PARAMETERS: p_base TYPE i DEFAULT 2,


p_exp TYPE i DEFAULT 3,
p_rec AS CHECKBOX.

INITIALIZATION.

CREATE OBJECT r_exp.

START-OF-SELECTION.

IF p_rec = 'X'.
v_power = r_exp->execute_exponentiation( base = p_base
expoent = p_exp ).
ELSE.
v_power = p_base ** p_exp.
ENDIF.

WRITE: / 'Power: ', v_power.

view rawgistfile1.txt hosted with

by GitHub

Execute esse programa no modo debug e veja a pilha de


chamada. Veja que o mtodo se repete vrias vezes indicando
que ele fora chamado de dentro dele mesmo, caracterizando
uma recursividade:

Pilha de chamadas do mtodo EXECUTE_EXPONENTIATION( ) Recursividade

A primeira linha do mtodo incrementa o atributo


INTERECTION, da o mtodo chama ele mesmo se a interao
for menor ou igual ao expoente. Com isso a pilha (stack) vai
sendo adicionada a cada nova chamada at que o nmero
mximo de iteraes (expoente) seja alcanado.
A pilha pra de ser incrementada e o restante do mtodo
comea a ser chamado, a partir do item da pilha mais novo
(LIFO, Last In First Out), onde finalmente a multiplicao
feita e sendo acumulada no atributo POWER.

Exploso de Lista Tcnica


Existem problemas em que a recursividade quase que
obrigatria, no caso da chamada exploso de lista tcnica.
Imagine que voc precise saber o custo de algum material
que composto por outros materiais, como por exemplo um
notebook.

Partes de notebook fonte imagem

Um notebook pode ser um materia formado por teclado,


display LCD, HD, placa-me, memrias, carcaa etc.

O teclado formado por uma base, uma tecla Q, outra W,


outra E, outra R, outra T etc.
Um HD formado por um conjundo de discos magnticos,
placa de controle e sistema de leitura,
Um sistema de leitura formado por um brao de leitura,
cabeote de leitura e placa de leitura.
E assim por diante.
Se eu tivesse uma rotina que dado um material ele me
retornasse uma lista de materais que formam esse material,
eu precisaria chamar essa rotina n vezes, conforme eu fosse
desmontando ou explodindo meu material.
Dessa maneira a haveria a recursividade como exemplificado
no exemplo do notebook, resolvendo o problema muito
rapidamente.
Claro que nem tudo so flores. Depurar um programa que usa
recursividade muito trabalhoso, bem como entender a
recursividade que outra pessoa desenvolveu. Isso faz com que
a recurso seja evitada, mas em alguns casos a melhor
forma de resolver um problema.

Aplicao do Design Pattern:


Factory
BY FLVIO FURLAN JUNE 6, 2012

Compartilhe!

Depois de falarmos do Singleton, est na hora de falarmos de


outro padro de projeto, o Factory. O Factory mais difcil de

entender do que o Singleton. Mais do que isso, mais difcil de


mostrar alguma aplicao prtica.
Nesse post eu mostrarei as duas coisas, explicar o
funcionamento do Factory, bem como sua aplicao.

Rpida Explicao
De uma maneira bem simples, o Factory um padro que
nada mais do que uma classe geradora de objetos, onde a
deciso de qual classe o objeto ser feita pela classe
geradora.
Onde eu apliquei o Factory em ABAP?

Projeto Code Coaching


Estamos trabalhando num projeto open source chamado Code
Coaching que est sendo desenvolvido sob a iniciativa do
ABAP101 Open Source.
O objetivo do projeto construir uma aplicao ABAP onde o
Programador e Coordenador possam se comunicar pelo
prprio programa ABAP.
Veja esse exemplo. Esse trecho de cdigo faz parte de outro
projeto em que estvamos envolvidos. Eu queria passar
instrues para a implementao de uma classe interface
especfica. Ento ao invs de passar instrues por e-mail, eu
resolvi colocar alguns comentrios dentro do prprio cdigo.
Da para evoluir para uma proto-markup-language foi um pulo
(lembre-se, meu sangue de programador, minha tendncia
resolver tudo com um programa de computador).
Fonte

Existem algumas linhas de comentrios que so iniciadas


por *@. Essas linhas contm uma espcie de cdigo que d
um significado especial s linhas comentadas logo na
sequncia. Continuando na linha do *@encontramos a
seguinte instruo: jack:task. Isso significa que os
comentrios logo abaixo dessa linha, trata-se de uma tarefa
designada para o programador chamado Jack.
Sendo assim, o programador pode facilmente fazer uma
busca no programa pelo seu nome e descobrir todos os
pontos que possuam algum comentrio para ele. Para facilitar
eu automatizei essa busca em um programa que l o
programa e extrai todos os pontos onde a linha comea
com *@ e gera um relatrio, como o mostrado abaixo.

Prottipo do relatrio para o Code Coaching

Esse programa apenas um prottipo e como tal serve


apenas para apresentar e testar a ideia central do projeto. O
projeto final contemplar muitas outras funcionalidades bem
como outros comandos, muito alm dotask. nesse ponto
que o factory ser usado.

O que o Factory Significa para o Code


Coaching?

No prottipo do programa Code Coaching, ele consegue


interpretar apenas o comando task, mas j no primeiro
release, estamos planejando expandir para pelo menos trs
outros comandos alm do task, question, answer ecomment.
Para fazer a interpretao desses comandos, o programa
relatrio contar com um diagrama de classes semelhante ao
apresentado abaixo:

Teste de Conceito do modelo do Code Coaching

Cada comando representado por uma classe. Abaixo voc


ver mais um programa de teste de conceito, este usando o
factory para interpretar um comando entrado pelo usurio.

Implementando o Factory em ABAP


Vamos para mais um programa que simula o interpretador
que usaremos no Code Coaching. Trata-se de um programa
bem simples, com um parmetro que o nome do comando.
Se o comando existe, ele mostra o texto que est na classe
correspondente ao comando, caso contrrio mostra uma
mensagem de erro.

Tela de seleo - Comando TASK

Explicao para o comando TASK - Classe LCL_TASK

Comando JUMP no existe

Resultado do comando JUMP

Programa ZABAP101_FACTORY_PATTERN completo.

A classe LCL_COMMAND responsvel por decidir de qual


classe o objeto deve ser criado. Se ocorrer um erro na criao,
ou seja, se a classe que estamos querendo criar o objeto no
exista, uma exceo lanada e tratada como um erro de
sintaxe.
Repare que eu monto o nome da classe de acordo com o
nome do comando entrado pelo usurio no parmetro do

programa. Ou seja, para esse caso, a classe do comando


precisa seguir a seguinte nomenclatura: LCL_<comando>,
caso contrrio haver um erro na criao do objeto daquela
classe, pois a classe no existir.
Os objetos dos comandos so criados no mtodo FACTORY( ),
com o seguinte comando:
CREATE OBJECT re_instance TYPE (lv_command).
O tipo do objeto definido em tempo de execuo, de acordo
com o valor da varivel lv_command. Colocando a varivel
entre parnteses, o interpretador ABAP entende que o tipo do
objeto a ser criado no lv_command, mas sim o que est no
contedo da varivel entre os parnteses.

Qual a Vantagem?
Por que criei uma classe para cada comando? Porque dessa
forma, pode-se adicionar um novo comando de maneira
MUITO fcil, apenas criando uma nova classe para o novo
comando e herdando da classe LCL_COMMAND.
Todo o resto no ser afetado.
(sim, isso cheira polimorfismo).
(sim, isso genial!!!)
O padro de projeto Factory pode ser implementado de vrias
maneiras, essa foi apenas uma delas. Acho sim interessante
estud-lo para ter mais essa ferramenta em sua workbench.

Importanto e Exportanto Uma


Tabela Interna Mdulo de Funo

BY FLVIO FURLAN MAY 31, 2012

Compartilhe!

Estava procurando algum assunto para escrever, e uma luz do


cu e-mail chegou com uma dvida e que em todas as turmas
da Academia ABAP tem, como importar ou exportar uma
tabela interna para um mdulo de funo ou mtodo.
A soluo pode ser respondida com uma simples frase: Use
um Table Type (Categoria de Tipos). S com isso j seria
suficiente para voc sair do outro lado, mas fazendo jus ao
101 do nome do site, vou explicar passo a passo como fazer
em um mdulo de funo. No prximo post, eu explicarei
como fazer em um mtodo.

Problema
Precisamos criar um mdulo de funo para retornar dados
dos vos (tabela SPFLI), dado uma empresa area.

Soluo
A primeira coisa a fazer criar um tipo tabela (table type) no
dicionrio, que define uma tabela interna do tipo standard. V
na transao SE11 e escolha Data Type:

Clique em Create e escolha Table Type:

Entre com uma breve descrio e o Line Type, que define a as


colunas na tabela interna. Nesse caso queremos todas as
colunas da tabela SPFLI.

Certifique-se o tipo de tabela seja Standard Table.

Com o tipo global criado e ativo, vamos a criao ao mdulo


de funo. Primeiro, necessrio criar uma Grupo de Funo
na transao SE80. Escolha Function Group e defina um
nome. Pressione ENTER e confirme a criao do novo objeto.

Depois de criar o grupo, crie o mdulo de funo. Pressione o


boto direito do mouse sobre o grupo de funo, escolha
Create -> Function Module.

Defina o nome a descrio para o mdulo de funo. O nome


precisa necessariamente Z_.

Agora vamos definir o parmetro de Import, IM_CARRID, com


o mesmo tipo do campos CARRID da tabela SPFLI.

Para o parmetro de EXPORT use o Table Type definido


anteriormente.

No vamos nos esquecer de definir as excees, no nosso


caso, defina apenas uma nica exceo.

E para finalizar, entre o cdigo abaixo:


Z_FM_GET_CONNECTIONS
FUNCTION z_fm_get_connections.
*"---------------------------------------------------------------------*"*"Local Interface:
*" IMPORTING
*"

REFERENCE(IM_CARRID) TYPE SPFLI-CARRID

*" EXPORTING
*"

REFERENCE(EX_SPFLI_T) TYPE ZTT_SPFLI

*" EXCEPTIONS
*"

NO_DATA_FOUND

*"----------------------------------------------------------------------

SELECT * FROM spfli


INTO TABLE ex_spfli_t
WHERE carrid = im_carrid.

IF sy-subrc NE 0.
RAISE no_data_found.
ENDIF.

ENDFUNCTION.

view rawgistfile1.txt hosted with

by GitHub

Execuo e Teste
Depois de ativar o mdulo de funo, voc pode executar um
teste unitrio pressionando o F8. Entre a empresa area AA.

Pressione F8 novamente para executar o mdulo de funo,


retornando duas entradas da tabela SPFLI.

Agora usando efetivamente o mdulo de funo, crie um


programa que chama a funo e imprima o resultado na
tela.ZABAP101_REPORT_CONNECTIONS
*&---------------------------------------------------------------------*
*& Report ZABAP101_REPORT_CONNECTIONS
*&
*&---------------------------------------------------------------------*
*& This code was published originally on ABAP101.com
*& http://abap101.com/2012/05/30/ >
*&

importanto-exportanto-uma-tabela-interna-modulo-funcao

*& Author: Flvio Furlan


*& E-mail: furlan@abap101.com
*&---------------------------------------------------------------------*

REPORT zabap101_report_connections.

DATA: it_spfli TYPE ztt_spfli.

FIELD-SYMBOLS: <fs_spfli> TYPE LINE OF ztt_spfli.

PARAMETERS: p_car TYPE spfli-carrid.

START-OF-SELECTION.

CALL FUNCTION 'Z_FM_GET_CONNECTIONS'


EXPORTING
im_carrid

= p_car

IMPORTING
ex_spfli_t

= it_spfli

EXCEPTIONS
no_data_found = 1
OTHERS

= 2.

IF sy-subrc <> 0.
MESSAGE 'No records found.' TYPE 'E'.
ENDIF.

LOOP AT it_spfli ASSIGNING <fs_spfli>.


WRITE: / <fs_spfli>-carrid,
<fs_spfli>-connid,
<fs_spfli>-countryfr,
<fs_spfli>-cityfrom,
<fs_spfli>-airpfrom,
<fs_spfli>-countryto,
<fs_spfli>-cityto,
<fs_spfli>-airpto.
ENDLOOP.

view rawgistfile1.txt hosted with

by GitHub

Discusso
O principal ponto a destacar aqui o tipo criado na SE11,
ZTT_SPFLI. Antigamente usava a pasta Tables do mdulo de
funo, onde era somente preciso especificar a estrutura que
o prprio sistema entendia que deveria ser criado uma tabela
interna em tempo de execuo. No usamos essa tcnica pois
j est obsoleto e por regra no devemos criar novos

programas com instrues ou tcnicas definidas pela SAP


como obsoletas.
interessante o uso do mdulo de funo para seleo de
dados, pois assim podemos reutilizar em outros programas.
Esse mdulo de funo serve como Model (do nosso
conhecido MVC). Podemos incluir ali outras regras de negcio
que podero ser facilmente reutilizadas em outros programas.
Alm disso, se essa regra mudar por qualquer motivo, no
necessrio alterar vrios programas, mas apenas dentro do
mdulo de funo.

Tratamento de Exceo
Propagao e CLEANUP
BY FLVIO FURLAN MAY 2, 2012

Compartilhe!

Quando eu explico tratamento de exceo na academia ABAP,


o pessoal no d muita bola, at porque os alunos ainda esto
tentando se recuperar das aulas de polimorfismo e interface,
mas entender o funcionamento dela vital para desenvolver
boas solues usando orientao a objetos (no somente para
aprender a escrever a palavra exceo).
Nesse post, vou explicar dois conceitos ligado ao tratamento
de excees baseado em classes, propagao e comando
CLEANUP.

Comeando Pelo Bsico


Vamos entender primeiro o funcionamento bsico do
tratamento de excees baseado em classes. Quando usamos

as classes de exceo, devemos usar a estrutura de


comandos TRY-CATCH-CLEANUP.
Usarei a classe LCL_EXCEPTION_DEMO que est no include
ZABAP101_EXCEPTION_CLASSES nos programas de exemplo.
*&---------------------------------------------------------------------*
*& Include

ZABAP101_EXCEPTION_CLASSES

*&---------------------------------------------------------------------*

*----------------------------------------------------------------------*
*

CLASS lcl_exception_demo DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_exception_demo DEFINITION.

PUBLIC SECTION.
METHODS: dump_factory,
simple_catch,
cleanup_live RAISING cx_sy_zerodivide,
cleanup_dead RAISING cx_sy_zerodivide,
propagating RAISING cx_sy_zerodivide.

PRIVATE SECTION.
DATA: result TYPE i.

ENDCLASS.

"lcl_exception_demo DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_exception_demo IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_exception_demo IMPLEMENTATION.

METHOD dump_factory.
result = 1 / 0.
ENDMETHOD.

"dump_factory

METHOD simple_catch.
TRY .
result = 1 / 0.
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do mtodo SIMPLE_CATCH.'.
ENDTRY.
ENDMETHOD.

"simple_catch

METHOD cleanup_live.
TRY .
result = 1 / 0.
CLEANUP.
WRITE: / 'Executou o Cleanup do mtodo CLEANUP_LIVE.'.
ENDTRY.
ENDMETHOD.

"cleanup_live

METHOD cleanup_dead.
TRY .
result = 1 / 0.
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do mtodo CLEANUP_DEAD'.
CLEANUP.
" o programa nunca executar o CLEANUP.

WRITE: / 'Executou o Cleanup do mtodo CLEANUP_DEAD.'.


ENDTRY.
ENDMETHOD.

"cleanup_dead

METHOD propagating.
result = 1 / 0.
ENDMETHOD.

ENDCLASS.

"propagating

"lcl_exception_demo IMPLEMENTATION

view rawZABAP101_EXCEPTION_CLASSES hosted with

by GitHub

O primeiro programa que mostrarei um programa cuja sada


um DUMP!? Sim, quando o sistema chega a alguma
situao onde ele no consegue seguir com o programa,
como por exemplo uma diviso por zero.
*&---------------------------------------------------------------------*
*& Report ZABAP101_EXCEPTION_DUMP
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zabap101_exception_dump.

INCLUDE zabap101_exception_classes.

DATA: r_demo TYPE REF TO lcl_exception_demo.

START-OF-SELECTION.

CREATE OBJECT r_demo.

TRY .
r_demo->dump_factory( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.

view rawZABAP101_EXCEPTION_DUMP hosted with

by GitHub

Quando o programa tenta fazer uma diviso por zero a


seguinte tela mostrada. Toda a pilha de execuo
eliminada e toda a memria usada pelo programa apagada.

Mas graas ao tratamento de exceo por classes, voc pode


dizer para o sistema tente executar essa operao, e se caso
acontea diviso por zero, execute isso.
Nesse primeiro programa onde o DUMP evitado, o mtodo
SIMPLE_CATCH( ) chamado. Na implementao do mtodo,
ele tenta (TRY) executar uma diviso por zero, que tratada
(CATCH) dentro do prprio mtodo.
*&---------------------------------------------------------------------*
*& Report ZABAP101_EXCEPTION_BASIC
*&

*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zabap101_exception_basic.

INCLUDE zabap101_exception_classes.

DATA: r_demo TYPE REF TO lcl_exception_demo.

START-OF-SELECTION.

CREATE OBJECT r_demo.

TRY .
r_demo->simple_catch( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.

view rawZABAP101_EXCEPTION_BASIC hosted with

by GitHub

Repare que a a exceo tratada dentro do prprio mtodo,


portanto a mensagem Executou o CATCH do mtodo
SIMPLE_CATCH. impressa no lugar do DUMP. A sada do

programa acima mostrada abaixo:

Propagao de Exceo
Conheo muitas equipes onde esse conceito muito bem
difundido, ou seja, uma pessoa decide no ser responsvel
pelo erro que cometeu e decide passar o erro para outra
pessoa corrigir. Pois , no ABAP temos algo parecido. Veja
esse programa:
*&---------------------------------------------------------------------*
*& Report ZABAP101_EXCEPTION_PROP
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZABAP101_EXCEPTION_PROP.

INCLUDE zabap101_exception_classes.

DATA: r_demo TYPE REF TO lcl_exception_demo.

START-OF-SELECTION.

CREATE OBJECT r_demo.

TRY .
r_demo->propagating( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.

view rawZABAP101_EXCEPTION_PROP hosted with

by GitHub

Quando o mtodo PROPAGATING( ) chamado, uma diviso


por zero executada. Observe que esta diviso no est
sendo tratada com o TRY-CATCH e veja a sada do programa:

O segredo est na declarao do mtodo: METHODS


propagating RAISING cx_sy_zerodivide. Existe uma instruo
RAISING que diz exatamente o que algumas pessoas que
conheo fazem, olha, pode ser que uma diviso por zero
acontea e se isso acontecer voc [quem est chamando o
mtodo] dever tratar essa exceo.
Sendo assim, a exceo precisou ser tratada na chamada do
mtodo e no mais dentro do mtodo.
Qual forma usar, a do primeiro programa ou essa? Depende.
Se voc quer passar a responsabilidade do tratamento para
quem chama o mtodo ento o segundo programa deve ser

usado. Mas se o erro algo interno do mtodo e precisa ser


tratado de maneira transparente do usurio, ento voc
dever tratar a exceo dentro do prprio mtodo, assim
como fora feito no primeiro programa.
O que acontece se no tratarmos a exceo na chamada do
mtodo? Experimente

CLEANUP no WHEN OTHERS do


Tratamento de Excees
Essa a primeira concluso que os meus alunos chegam
quando olham para definio do comando no Help do ABAP.

No, o CLEANUP no uma espcie de WHEN OTHERS do TRYCATCH. Para ilustrar o uso do CLEANUP, veja o programa
abaixo:
*&---------------------------------------------------------------------*
*& Report ZABAP101_EXCEPTION_CLEAN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZABAP101_EXCEPTION_CLEAN.

INCLUDE zabap101_exception_classes.

DATA: r_demo TYPE REF TO lcl_exception_demo.

START-OF-SELECTION.

CREATE OBJECT r_demo.

TRY .
r_demo->cleanup_live( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.

view rawZABAP101_EXCEPTION_CLEAN hosted with

by GitHub

O objetivo do CLEANUP para a limpeza de variveis


(memria) quando acontece uma exceo que ser
propagada. Seria o equivalente ao quero limpar a baguna
antes de passar a exceo para ser tratada por quem chamou

o mtodo.

Pela

sada do programa, voc consegue entender a sequncia de


execuo do programa. Ocorre a exceo, o CLEANUP
executado e ento o CATCH no programa principal.

CLEANUP Morto
O CLEANUP somente usado para limpar a baguna quando
a exceo est sendo propagada. No programa abaixo, o
CLEANUP nunca ser chamado.
*&---------------------------------------------------------------------*
*& Report ZABAP101_EXCEPTION_FAKE_CLEAN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZABAP101_EXCEPTION_FAKE_CLEAN.

INCLUDE zabap101_exception_classes.

DATA: r_demo TYPE REF TO lcl_exception_demo.

START-OF-SELECTION.

CREATE OBJECT r_demo.

TRY .

r_demo->cleanup_dead( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.

view rawZABAP101_EXCEPTION_FAKE_CLEAN hosted with

by GitHub

Na sada do programa vemos claramente que o sistema no


executou o CLEANUP, pois a diviso por zero tratada dentro
do prprio mtodo.

Concluso
Os conceitos de tratamento de exceo por classes no fica
somente nisso, mas nesse post quis apenas expor os
conceitos de propagao e CLEANUP. Para o uso correto de
classes de excees, necessrio entender encadeamento de
excees, hierarquia de excees e textos da exceo. Isso
ser explorado em futuros posts.
Aprenda a usar corretamente as classes de excees e voc
entregar programas muito elegantes e de fcil manuteno.

Falsa Programao Orientada a


Objetos
BY FLVIO FURLAN APRIL 1, 2012

Compartilhe!

O que um programa ABAP orientado a objetos? Se um


programa usa somente CALL METHOD e nenhum PERFORM,
ento trata-se de um programa orientado a objetos? Acredito
que no.
O uso de sintaxe de orientao a objetos no evidncia
suficiente de que o programa foi pensado na forma de objetos
trocando mensagens entre si.
Trago para vocs dois pogramas com sadas idnticas, mas
um usando uma orientao a objetos capenga e outro que
considero uma melhor forma de resolver o problema
pensando em objetos.

O Requisito
Relatrio de impresso de pedidos, com um total e a
porcentagem de cada item em relao ao total do pedido. Os
itens do pedido foram criados no prprio programa por uma
questo prtica e didtica. No mundo real esses dados
estariam armazenados numa tabela no banco de dados.

Orientao a Objetos para ingls


ver
A listagem abaixo a soluo usando orientao a objetos
incompleta, ou seja, o programa tem uma classe para os
objetos que representam itens do pedido. Cada objeto um
item do pedido, mas ainda tem alguns problemas.
ZFAKE_OO

*&---------------------------------------------------------------------*
*& Report ZFAKE_OO

*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zfake_oo LINE-SIZE 90.

TYPES: BEGIN OF lty_product,


product_id TYPE c LENGTH 5,
description TYPE c LENGTH 30,
quantity

TYPE n LENGTH 3,

unit_price TYPE p LENGTH 5 DECIMALS 2,


END OF lty_product.

*----------------------------------------------------------------------*
*

CLASS lcl_product DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_product DEFINITION.

PUBLIC SECTION.
METHODS: constructor
IMPORTING imc_product TYPE lty_product.

METHODS: set
IMPORTING im_product TYPE lty_product,

get
RETURNING value(re_product) TYPE lty_product.

PRIVATE SECTION.
DATA: product TYPE lty_product.

ENDCLASS.

"lcl_product DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_product IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_product IMPLEMENTATION.

METHOD constructor.
me->set( imc_product ).
ENDMETHOD.

"constructor

METHOD set.
me->product = im_product.
ENDMETHOD.

"set

METHOD get.
re_product = me->product.
ENDMETHOD.

ENDCLASS.

"get

"lcl_product IMPLEMENTATION

DATA: r_product TYPE REF TO lcl_product,


it_prods TYPE TABLE OF REF TO lcl_product,
wa_product TYPE lty_product,
vg_total TYPE lty_product-unit_price,
vg_total_p TYPE lty_product-unit_price,
vg_perc

TYPE lty_product-unit_price.

START-OF-SELECTION.

wa_product-product_id = '025'.
wa_product-description = 'Cellphone 3000'.
wa_product-quantity = 3.
wa_product-unit_price = 1400.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
APPEND r_product TO it_prods.

wa_product-product_id = '984'.
wa_product-description = 'TV 40pol'.
wa_product-quantity = 6.
wa_product-unit_price = 3400.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
APPEND r_product TO it_prods.

wa_product-product_id = '758'.
wa_product-description = 'Audio System 439'.
wa_product-quantity = 2.
wa_product-unit_price = 7800.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
APPEND r_product TO it_prods.

LOOP AT it_prods INTO r_product.


wa_product = r_product->get( ).
vg_total = wa_product-unit_price * wa_product-quantity.
ADD vg_total TO vg_total_p.
ENDLOOP.

LOOP AT it_prods INTO r_product.


AT FIRST.
FORMAT COLOR COL_HEADING.
WRITE: /1 'ID',
5 'Description',
30 'Quant.',
50 'Unit Price',
70 'Total',
83 'Perc.'.
FORMAT COLOR OFF.
ULINE.
ENDAT.

wa_product = r_product->get( ).

vg_total = wa_product-unit_price * wa_product-quantity.


vg_perc = vg_total / vg_total_p * 100.

WRITE: /1 wa_product-product_id,
5 wa_product-description,
30 wa_product-quantity,
50 wa_product-unit_price,
70 vg_total,
83 vg_perc.

AT LAST.
ULINE.
FORMAT COLOR 7.
WRITE: / 'Total of Purchase Order --> ', vg_total_p.
ENDAT.

ENDLOOP.

view rawgistfile1.txt hosted with

by GitHub

Qual o problema com esse programa? Minha crtica a esse


programa a presena de regras de negcio no programa
principal. no programa principal que o clculo do total do
pedido feito bem como o clculo do percentual de cada item
em relao ao pedido total. Se seguirmos o padro MVC,
esses clculos deveriam estar encapsulados em alguma
classe, fazendo o papel do Modelo. exatamente isso que o

prxima soluo leva em conta na hora de refatorar o cdigo.

Refatorando Para Melhorar o Cdigo


Refatorao um conceito no desenvolvimento de software
onde melhoramos o projeto de software sem alterar os
requistos do mesmo. Ou seja, vou alterar o programa para
que a soluo fique mais robusta, elegante, melhorando a
legibilidade e possibilitando o reuso. Nessa primeira rodada
de refatorao, eu procurei encapsular todos os clculos em
classes, para que possam ser reutilizadas em futuros
desenvolvimentos. Repare que eu criei uma nova classe onde
os clculos so executados e o prprio relatrio impresso.
ZBETTER_OO
*&---------------------------------------------------------------------*
*& Report ZBETTER_OO
*&
*&---------------------------------------------------------------------*
*&

*&
*&---------------------------------------------------------------------*

REPORT zbetter_oo LINE-SIZE 90.

TYPES: BEGIN OF lty_product,


product_id TYPE c LENGTH 5,
description TYPE c LENGTH 30,
quantity

TYPE n LENGTH 3,

unit_price TYPE p LENGTH 5 DECIMALS 2,


END OF lty_product.

*----------------------------------------------------------------------*
*

CLASS lcl_product DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_product DEFINITION.

PUBLIC SECTION.
METHODS: constructor
IMPORTING imc_product TYPE lty_product.

METHODS: set
IMPORTING im_product TYPE lty_product,

get
RETURNING value(re_product) TYPE lty_product.

PRIVATE SECTION.
DATA: product TYPE lty_product.

ENDCLASS.

"lcl_product DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_product IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_product IMPLEMENTATION.

METHOD constructor.
me->set( imc_product ).
ENDMETHOD.

"constructor

METHOD set.
me->product = im_product.
ENDMETHOD.

"set

METHOD get.
re_product = me->product.
ENDMETHOD.

ENDCLASS.

"get

"lcl_product IMPLEMENTATION

*----------------------------------------------------------------------*

CLASS lcl_purchase_order DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_purchase_order DEFINITION.

PUBLIC SECTION.
METHODS: add_item IMPORTING im_item TYPE REF TO lcl_product,

get_po_total RETURNING
value(re_total) TYPE lty_product-unit_price,

display_report.

PRIVATE SECTION.
DATA: items_list TYPE TABLE OF REF TO lcl_product.

ENDCLASS.

"lcl_purchase_order DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_purchase_order IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_purchase_order IMPLEMENTATION.

METHOD add_item.
APPEND im_item TO items_list.

ENDMETHOD.

"add_item

METHOD get_po_total.
DATA: r_product TYPE REF TO lcl_product,
wa_product TYPE lty_product,
vg_total TYPE lty_product-unit_price.

LOOP AT items_list INTO r_product.


wa_product = r_product->get( ).
vg_total = wa_product-unit_price * wa_product-quantity.
ADD vg_total TO re_total.
ENDLOOP.
ENDMETHOD.

"get_po_total

METHOD display_report.
DATA: r_product TYPE REF TO lcl_product,
wa_product TYPE lty_product,
vg_total TYPE lty_product-unit_price,
vg_total_p TYPE lty_product-unit_price.

LOOP AT items_list INTO r_product.


AT FIRST.
FORMAT COLOR COL_HEADING.
WRITE: /1 'ID',
5 'Description',
30 'Quant.',
60 'Unit Price',
80 'Total'.
FORMAT COLOR OFF.
ULINE.
ENDAT.

wa_product = r_product->get( ).
vg_total = wa_product-unit_price * wa_product-quantity.

WRITE: /1 wa_product-product_id,
5 wa_product-description,
30 wa_product-quantity,
60 wa_product-unit_price,
80 vg_total.

ADD vg_total TO vg_total_p.

AT LAST.
ULINE.
FORMAT COLOR 7.
WRITE: / 'Total of Purchase Order --> ', vg_total_p.
ENDAT.

ENDLOOP.
ENDMETHOD.

ENDCLASS.

"display_report

"lcl_purchase_order IMPLEMENTATION

DATA: r_product TYPE REF TO lcl_product,


r_pur_ord TYPE REF TO lcl_purchase_order,
wa_product TYPE lty_product.

START-OF-SELECTION.

CREATE OBJECT r_pur_ord.

wa_product-product_id = '025'.
wa_product-description = 'Cellphone 3000'.
wa_product-quantity = 3.
wa_product-unit_price = 1400.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
r_pur_ord->add_item( r_product ).

wa_product-product_id = '984'.
wa_product-description = 'TV 40pol'.
wa_product-quantity = 6.
wa_product-unit_price = 3400.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
r_pur_ord->add_item( r_product ).

wa_product-product_id = '758'.
wa_product-description = 'Audio System 439'.
wa_product-quantity = 2.
wa_product-unit_price = 7800.

CREATE OBJECT r_product


EXPORTING
imc_product = wa_product.
r_pur_ord->add_item( r_product ).

view rawgistfile1.txt hosted with

by GitHub

Prximos Passos
Esse a melhor implementao? Com certeza no. Escolhi
no aplicar o MVC de maneira forte para dar chances para
vocs pensarem em outras melhorias possveis nesse
programa.
O que vocs fariam? Deixem nos comentrios quais melhorias
vocs fariam nos dois programas.
Boa diverso!

Sadas dos Dois Programas Acima

Hello World Orientado a Objetos


BY FLVIO FURLAN FEBRUARY 7, 2012

Compartilhe!

Uma coisa que no mais iremos discutir aqui no ABAP101


usar ou no programao orientada a objetos, por isso
estamos abolindo procedural do ABAP101, caso voc veja
alguma coisa procedural aqui no site, por favor avise-me!
Programao procedural pode parecer mais fcil, mas
porque estamos mais acostumados com esse tipo de
programao do que orientada a objetos. Tome uma resoluo
em sua vida ABAPer, faa tudo em ABAP OO, mesmo um
simples relatrio. Comece com uma simples classe e da v
evoluindo, mas fuja da primeira dose do procedural.
Acredite a vida bem melhor sem procedural!
A orientao a objetos nos permite abstraes muito mais
elegantes do que a procedural sendo os programas orientados
a objetos muito mais fceis de fazer manuteno, permitindo
reuso real e muitas outras coisas que somente usando no diaa-dia podemos perceber.
Pensando nisso, criei esse post onde mostro uma srie de
verses do famoso programa Hello World orientados a

objetos. A primeira vez que o programa Hello World em ABAP


apareceu por aqui foi em 2007, nesse postaqui. A soluo vai
crescendo mostrando algumas formas de abstrao
resolvendo o mesmo problema de vrias maneiras possveis.

Primeira Verso
Nessa verso temos uma classe chamada LCL_HELLO com
apenas um nico mtodo DISPLAY_MESSAGE( ).
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: display_message.
ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*

*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD display_message.
WRITE: / 'Hello World OO!'.
ENDMETHOD.
ENDCLASS.

"display_message
"lcl_hello IMPLEMENTATION

DATA: r_hello TYPE REF TO lcl_hello.

START-OF-SELECTION.

CREATE OBJECT r_hello.

r_hello->display_message( ).

view rawZP_HELLO_OO hosted with

by GitHub

ZP_HELLO_OO
Nessa verso contm apenas uma nica classe com um nico
mtodo. No temos muito de programao orientada a
objetos aqui, mas j estamos deixando a sementinha do OO
entrar em nossos programas.

Procedural Orientado a Objetos


Vamos adicionar um parameter em nosso programa e
comear a discutir algumas opes de abstrao. A primeira
opo eu chamo de Procedural Orientado a Objetos. Aqui
no estamos pensando numa soluo orientada a objetos,
mas pensando em procedural.

*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo_2 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: display_message
IMPORTING
i_name TYPE char30.
ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD display_message.
WRITE: / 'Hello: ', i_name.
ENDMETHOD.
ENDCLASS.

"display_message
"lcl_hello IMPLEMENTATION

DATA: r_hello TYPE REF TO lcl_hello.

PARAMETERS: p_name TYPE char30 DEFAULT 'World OO!!'.

START-OF-SELECTION.

CREATE OBJECT r_hello.

r_hello->display_message( p_name ).

view rawZP_HELLO_OO_2 hosted with

by GitHub

ZP_HELLO_OO_2
Veja que poderamos substituir perfeitamente por um
FORM/PERFORM sem grandes mudanas na abstrao, mas
lembre-se que queremos evit-los de qualquer maneira,
mesmo assim essa verso muito melhor que qualquer outra
verso procedural.

Melhorando a Impresso da Mensagem


Uma vero mais interessante que eu proporia seria a
mostrada abaixo:
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_3
*&
*&---------------------------------------------------------------------*
*&

*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo_3 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
i_name TYPE char30.
METHODS: display_message.

PRIVATE SECTION.
DATA: name TYPE char30.

ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD constructor.
me->name = i_name.
ENDMETHOD.

"constructor

METHOD display_message.
WRITE: / 'Hello: ', name.
ENDMETHOD.
ENDCLASS.

"display_message
"lcl_hello IMPLEMENTATION

DATA: r_hello TYPE REF TO lcl_hello.

PARAMETERS: p_name TYPE char30 DEFAULT 'World OO!!'.

START-OF-SELECTION.

CREATE OBJECT r_hello


EXPORTING
i_name = p_name.

r_hello->display_message( ).

view rawZP_HELLO_OO_3 hosted with

by GitHub

ZP_HELLO_OO_3
O resultado o mesmo, mas agora temos um objeto
LCL_HELLO que recebe um nome para saudao na sua
construo e da mostra a mensagem pelo mtodo
DISPLAY_MESSAGE( ). J conseguiu imaginar um objeto que
tem a responsabilidade de mostrar uma mensagem na tela?

Permitindo Operaes No Objeto


LCL_HELLO
Ainda sim no estou contente com a soluo. E se quisermos
alterar o atributo NAME antes de mostrarmos a mensagem? E
se quisermos saber o atributo NAME antes de mostrar para o
usurio? Por isso aconselhvel criamos os mtodos de
acesso, os famosos SET e GET. Veja como ficaria nosso
programa:
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_4
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo_4 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
ic_name TYPE char30.
METHODS: set
IMPORTING
i_name TYPE char30,
get

RETURNING value(r_name) TYPE char30.

METHODS: display_message.

PRIVATE SECTION.
DATA: name TYPE char30.

ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD constructor.
me->set( ic_name ).
ENDMETHOD.

"constructor

METHOD set.
me->name = i_name.
ENDMETHOD.

"set

METHOD get.
r_name = me->name.
ENDMETHOD.

"get

METHOD display_message.

WRITE: / 'Hello: ', name.


ENDMETHOD.
ENDCLASS.

"display_message
"lcl_hello IMPLEMENTATION

DATA: g_r_hello TYPE REF TO lcl_hello,


g_v_hello TYPE char30.

PARAMETERS: p_name TYPE char30 DEFAULT 'World OO!!'.

START-OF-SELECTION.

CREATE OBJECT g_r_hello


EXPORTING
ic_name = p_name.

g_v_hello = g_r_hello->get( ).

IF g_v_hello = 'PROCEDURAL!!'.
WRITE: / 'Hey, avoid first drink!'.
g_r_hello->set( 'I would say... I love OO!' ).
ENDIF.

g_r_hello->display_message( ).

view rawZP_HELLO_OO_4 hosted with

ZP_HELLO_OO_4

by GitHub

Pense que agora temos um objeto HELLO no qual podemos


alterar seu estado (SET e GET) quantas vezes quisermos. A
abstrao est muito melhor agora, mas d para melhorar
ainda mais!

MVC no Hello World, Pode?


Que histria essa do programa principal verificar se a
mensagem correta ou no!? Esse programa deveria cuidar
apenas em receber a entrada do usurio e chamar o objeto
para mostrar a mensagem. No deveria ter nenhuma regra
(de negcio). Essa verificao deveria estar no modelo, ou
seja, classe LCL_HELLO. Ento, vamos melhorar ainda mais o
nossa classe:
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_5
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo_5 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING

ic_name TYPE char30.

METHODS: set
IMPORTING
i_name TYPE char30,

get
RETURNING value(r_name) TYPE char30.

METHODS: display_message.

PRIVATE SECTION.
DATA: name TYPE char30.

ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD constructor.
CALL METHOD me->set
EXPORTING
i_name = ic_name.
ENDMETHOD.

"constructor

METHOD set.
IF i_name = 'PROCEDURAL!!'.
me->name = 'I would say... I love OO!'.
ELSE.
me->name = i_name.
ENDIF.
ENDMETHOD.

"set

METHOD get.
r_name = me->name.
ENDMETHOD.

"get

METHOD display_message.
WRITE: / 'Hello: ', name.
ENDMETHOD.
ENDCLASS.

"display_message
"lcl_hello IMPLEMENTATION

DATA: g_r_hello TYPE REF TO lcl_hello,


g_v_hello TYPE char30.

PARAMETERS: p_name TYPE char30 DEFAULT 'World OO!!'.

START-OF-SELECTION.

CREATE OBJECT g_r_hello


EXPORTING
ic_name = p_name.

PERFORM love_procedural.

g_r_hello->display_message( ).
*&---------------------------------------------------------------------*
*&

Form LOVE_PROCEDURAL

*&---------------------------------------------------------------------*
*

text

*----------------------------------------------------------------------*
* --> p1

text

* <-- p2

text

*----------------------------------------------------------------------*
FORM love_procedural.

CALL METHOD g_r_hello->set


EXPORTING
i_name

= 'PROCEDURAL!!'.

ENDFORM.

" LOVE_PROCEDURAL

view rawZP_HELLO_OO_5 hosted with

by GitHub

ZP_HELLO_OO_5
Mesmo que algum Perform Fanboy invada seu programa na
calada da noite, voc j contar com uma certa proteo
dentro do seu programa contra maus programadores ter
protegido seu programa (j que ele no saberia alterar a
classe :-p ). Alm do mais, voc tambm ter o conceito
deencapsulamento aplicado aqui. Repare que a regra de
no permitir o parmetro NAME como procedural !! est
agora embutido no mtodo SET( ). Isso impede que o atributo
seja alterado indevidamente por qualquer outro programador
mal comportado que venha dar manuteno em seu cdigo.

Ou seja, podemos alterar quantas vezes quisermos o atributo


NAME, mas seguindo a regra definida no mtodo SET( ). Mas
ser que daria para melhorar ainda ainda mais? Resposta
sim!

Verso Final! (Ser?)


*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_5
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zp_hello_oo_5 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*

CLASS lcl_hello DEFINITION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
ic_name TYPE char30.

METHODS: set
IMPORTING
i_name TYPE char30,

get
RETURNING value(r_name) TYPE char30,

get_full_message
RETURNING value(r_message) TYPE string.

PRIVATE SECTION.
DATA: name TYPE char30.

ENDCLASS.

"lcl_hello DEFINITION

*----------------------------------------------------------------------*
*

CLASS lcl_hello IMPLEMENTATION

*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD constructor.
CALL METHOD me->set
EXPORTING
i_name = ic_name.
ENDMETHOD.

"constructor

METHOD set.
IF i_name = 'PROCEDURAL!!'.
me->name = 'I would say... I love OO!'.
ELSE.
me->name = i_name.
ENDIF.

ENDMETHOD.

"set

METHOD get.
r_name = me->name.
ENDMETHOD.

"get

METHOD get_full_message.
CONCATENATE 'Hello:' me->name INTO r_message SEPARATED BY space.
ENDMETHOD.
ENDCLASS.

"get_full_message
"lcl_hello IMPLEMENTATION

DATA: g_r_hello TYPE REF TO lcl_hello,


g_v_hello TYPE string.

PARAMETERS: p_name TYPE char30 DEFAULT 'World OO!!'.

START-OF-SELECTION.

CREATE OBJECT g_r_hello


EXPORTING
ic_name = p_name.

g_v_hello = g_r_hello->get_full_message( ).

WRITE: / g_v_hello.

view rawZP_HELLO_OO_6 hosted with

by GitHub

ZP_HELLO_OO_6
Agora sim, temos uma separao bem definida entre quem
responsvel por tratar com o usurio (programa principal,
com PARAMETERS e WRITE) e quem cuidar das regras do
texto (classe LCL_HELLO). Ainda sim, estaremos protegidos do
Performa Fanboy e deixamos nosso programa reutilizvel.
Quando voc comea a usar programao orientada a objetos
voc naturalmente comea a pensar nesses conceitos, como
robustes, facilidade de manuteno, encapsulamento
Como regra prtica, procure deixa comandos WRITEs fora das
classes de negcio (Model).

Concluso
Podemos ver que um simples problema de impresso do Hello
World!! pode ganhar diversas solues. Enquanto estou
escrevendo esse pargrafo, j pensei mais outras duas. Isso
prova que em programao orientada a objetos no existe
certo ou errado, existe sim um equilbrio, um balano de
quanto de reuso, abstrao ou encapsulamento voc quer
aplicar ao seu problema. Isso depender muito de caso para
caso. Mesmo assim no importa, continue programando
somente em OO, acredite, um dia voc ir me agradecer por
isso.
Ser que essa a verso final? Ser que voc ficou contente
com apenas 6 verses? E aquelas duas que eu pensei, como
seriam? Deixe sua verso do Hello World OO nos comentrios.
Estou muito curioso em saber como voc resolveria o Hello
World!! alm do

WRITE: Hello World!!.


Arquivo Nugget. (SAPLink)