Professional Documents
Culture Documents
INCIO
SOBRE O AUTOR
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:
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.
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.
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.
VEJA TAMBM
PROBLEMA
Criar uma change request para ser usada por novos programas.
SOLUO
Acessar o Transport Organizer (SE09 ou SE10):
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
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.
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:
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:
Tipos incompletos:
P Package.
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.
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:
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.
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.
Compartilhe!
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.
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
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.
Compartilhe!
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
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.
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.
http://abap101.com/2015/02/26/porque-todo-abaper-deveria-comecaraprender-ui5-sapui5openui5-ja/
Claro,
voc
precisar
de
um
ambiente
de
desenvolvimento.
Compartilhe!
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
Compartilhe!
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+
Compartilhe!
MAKTX (descrio)
800
M-123
Arroz
800
M-124
Feijo
810
M-123
Arroz
810
M-124
Milho
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
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
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
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.
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?.
Compartilhe!
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?
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
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).
2
3
4
5
6 public section.
methods constructor.
7
8
9 protected section.
1
0 private section.
1
1
1
2
endclass.
endclass.
1
8
1 *&---------------------------------------------------------------------*
2 & Report ${zprogram}
3 *&
4 *&---------------------------------------------------------------------*
5 *& Autor:
6 *& Transao:
7 *& Mdulo:
8 *& Decrio:
9 *&---------------------------------------------------------------------*
FINAL
CREATE PUBLIC
DURATION SHORT
8 .
9
PUBLIC SECTION.
10
11
12
13
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
41
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 ************************************************
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
act
msg
).
11
0
ENDMETHOD.
11
1
METHOD then_2.
11
2
11
"then_1
cl_aunit_assert=>assert_bound(
3
11
4
EXPORTING
act
msg
11
5 *
level
11 * quit
6 * RECEIVING
11 *
7
11
8
= METHOD
assertion_failed =
).
ENDMETHOD.
11
9
12
0
"then_2
METHOD then_3.
cl_aunit_assert=>assert_not_bound(
12
1
12
2
= CRITICAL
EXPORTING
act
msg
12
3 *
level
12 * quit
4 * RECEIVING
12 *
5
12
6
12
7
13
0
13
1
13
2
13
= METHOD
assertion_failed =
).
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
Compartilhe!
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
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
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.
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
Compartilhe!
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?
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
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.
Compartilhe!
1
2
3
4
5
6
7
8
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
1 lwa_param-kind = cl_abap_objectdescr=>exporting.
1 REPORT z_create_dinnam.
2
3
TYPE-POOLS: abap.
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
DATA: lv_type
TYPE string,
DATA: r_except
r_grid
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.
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.
Recursividade em ABAP
BY FLVIO FURLAN JUNE 25, 2012
Compartilhe!
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.
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zabap101_recursion.
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_math DEFINITION.
PUBLIC SECTION.
METHODS execute_exponentiation
IMPORTING
base TYPE i
expoent TYPE i
RETURNING value(re_power) TYPE i.
PRIVATE SECTION.
ENDCLASS.
TYPE i VALUE 1.
"lcl_math DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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
INITIALIZATION.
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.
by GitHub
Compartilhe!
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?
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.
Compartilhe!
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:
*" EXPORTING
*"
*" EXCEPTIONS
*"
NO_DATA_FOUND
*"----------------------------------------------------------------------
IF sy-subrc NE 0.
RAISE no_data_found.
ENDIF.
ENDFUNCTION.
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.
importanto-exportanto-uma-tabela-interna-modulo-funcao
REPORT zabap101_report_connections.
START-OF-SELECTION.
= 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.
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
Tratamento de Exceo
Propagao e CLEANUP
BY FLVIO FURLAN MAY 2, 2012
Compartilhe!
ZABAP101_EXCEPTION_CLASSES
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
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.
"cleanup_dead
METHOD propagating.
result = 1 / 0.
ENDMETHOD.
ENDCLASS.
"propagating
"lcl_exception_demo IMPLEMENTATION
by GitHub
REPORT zabap101_exception_dump.
INCLUDE zabap101_exception_classes.
START-OF-SELECTION.
TRY .
r_demo->dump_factory( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.
by GitHub
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zabap101_exception_basic.
INCLUDE zabap101_exception_classes.
START-OF-SELECTION.
TRY .
r_demo->simple_catch( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.
by GitHub
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.
START-OF-SELECTION.
TRY .
r_demo->propagating( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.
by GitHub
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.
START-OF-SELECTION.
TRY .
r_demo->cleanup_live( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.
by GitHub
o mtodo.
Pela
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.
START-OF-SELECTION.
TRY .
r_demo->cleanup_dead( ).
CATCH cx_sy_zerodivide.
WRITE: / 'Executou o CATCH do programa principal.'.
ENDTRY.
by GitHub
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.
Compartilhe!
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.
*&---------------------------------------------------------------------*
*& Report ZFAKE_OO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
TYPE n LENGTH 3,
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
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
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.
wa_product-product_id = '984'.
wa_product-description = 'TV 40pol'.
wa_product-quantity = 6.
wa_product-unit_price = 3400.
wa_product-product_id = '758'.
wa_product-description = 'Audio System 439'.
wa_product-quantity = 2.
wa_product-unit_price = 7800.
wa_product = r_product->get( ).
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.
by GitHub
*&
*&---------------------------------------------------------------------*
TYPE n LENGTH 3,
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
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.
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.
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.
"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.
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.
AT LAST.
ULINE.
FORMAT COLOR 7.
WRITE: / 'Total of Purchase Order --> ', vg_total_p.
ENDAT.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
"display_report
"lcl_purchase_order IMPLEMENTATION
START-OF-SELECTION.
wa_product-product_id = '025'.
wa_product-description = 'Cellphone 3000'.
wa_product-quantity = 3.
wa_product-unit_price = 1400.
wa_product-product_id = '984'.
wa_product-description = 'TV 40pol'.
wa_product-quantity = 6.
wa_product-unit_price = 3400.
wa_product-product_id = '758'.
wa_product-description = 'Audio System 439'.
wa_product-quantity = 2.
wa_product-unit_price = 7800.
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!
Compartilhe!
Primeira Verso
Nessa verso temos uma classe chamada LCL_HELLO com
apenas um nico mtodo DISPLAY_MESSAGE( ).
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: display_message.
ENDCLASS.
"lcl_hello DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD display_message.
WRITE: / 'Hello World OO!'.
ENDMETHOD.
ENDCLASS.
"display_message
"lcl_hello IMPLEMENTATION
START-OF-SELECTION.
r_hello->display_message( ).
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.
*&---------------------------------------------------------------------*
*& Report ZP_HELLO_OO_2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: display_message
IMPORTING
i_name TYPE char30.
ENDCLASS.
"lcl_hello DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello IMPLEMENTATION.
METHOD display_message.
WRITE: / 'Hello: ', i_name.
ENDMETHOD.
ENDCLASS.
"display_message
"lcl_hello IMPLEMENTATION
START-OF-SELECTION.
r_hello->display_message( p_name ).
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.
*&
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
METHOD constructor.
me->name = i_name.
ENDMETHOD.
"constructor
METHOD display_message.
WRITE: / 'Hello: ', name.
ENDMETHOD.
ENDCLASS.
"display_message
"lcl_hello IMPLEMENTATION
START-OF-SELECTION.
r_hello->display_message( ).
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?
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
ic_name TYPE char30.
METHODS: set
IMPORTING
i_name TYPE char30,
get
METHODS: display_message.
PRIVATE SECTION.
DATA: name TYPE char30.
ENDCLASS.
"lcl_hello DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
"display_message
"lcl_hello IMPLEMENTATION
START-OF-SELECTION.
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( ).
ZP_HELLO_OO_4
by GitHub
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
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.
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
START-OF-SELECTION.
PERFORM love_procedural.
g_r_hello->display_message( ).
*&---------------------------------------------------------------------*
*&
Form LOVE_PROCEDURAL
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM love_procedural.
= 'PROCEDURAL!!'.
ENDFORM.
" LOVE_PROCEDURAL
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.
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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.
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
START-OF-SELECTION.
g_v_hello = g_r_hello->get_full_message( ).
WRITE: / g_v_hello.
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