Escolar Documentos
Profissional Documentos
Cultura Documentos
alegre mais difícil para ele aprender a voar enquanto permanece um ovo.
Somos como ovos no momento. E você não pode continuar indefinidamente
sendo apenas um ovo comum e decente. Devemos ser eclodidos ou ir mal.
— C. S. Lewis
Introdução
Ovos são, sem dúvida, lugares adoráveis para estar dentro, cheios de comida e quentes
da mamãe sentado em cima do ovo. No entanto, viver dentro de um ovo
provavelmente não lhe dá uma ideia muito boa das mudanças que ocorrem no mundo
exterior. No mundo da SAP, tal mudança pode ser horrivelmente assustadora: há um
exército de programadores na SAP constantemente desgoring um fluxo de novas
guloseimas. Desenvolvedores de todo o mundo provavelmente os amariam — mas
muitas vezes 99% desses programadores permanecem escondidos dentro de seus
ovos, alegremente ignorantes do novo baú de tesouros em seu porão do sistema SAP.
Para evitar essa situação muito comum, o objetivo deste livro é iluminar tais
melhorias. Como tal, é destinado a todo e qualquer desenvolvedor aquisitivo ABAP.
Embora eu cubra novas tecnologias, também acoro alguns tópicos que podem não ser
considerados "novos"; isso porque eu notei que muitas pessoas que desconhecem as
melhorias entregues pela SAP que saíram há seis meses não têm conhecimento das
melhorias que saíram há cinco anos. Vou dar um pouco de atenção a esses tópicos
porque é muito possível que você esteja descobrindo-os pela primeira vez.
A ideia deste livro vem de uma relutância observada em usar novas tecnologias e, ao
mesmo tempo, uma compulsão de usar novas tecnologias. Uma das melhores postagens
de blog de todos os tempos no site da SAP Community Network foi uma de Graham
Robin, filho chamado "A Call to Arms for ABAP Developers". Neste post, Robinson
fornece um exemplo (supostamente fictício) de um desenvolvedor da ABAP que se junta
a uma empresa de consultoria no início da onda SAP no final dos anos noventa. Ele
aprende tudo o que há para saber sobre o desenvolvimento da SAP como era naquele
momento — tudo às custas do cliente —
23
Introduction
e então, uma vez que o boom morre, consegue um emprego permanente em um dos
antigos clientes. Por um tempo, tudo está bem, mas depois de 10 anos, o
desenvolvedor percebe que não sabe nada sobre nenhuma das novas tecnologias
que a SAP saiu, pois sempre foi possível passar usando as mesmas técnicas que
funcionaram no ano 2000.
Claro, se eu tivesse um dólar para cada vez que eu lesse as palavras "mudança de jogo"
ou "ponto de inflexão " na imprensa de TI, então eu poderia usar essa pilha de dinheiro
para construir uma rampa para a lua. Mas o que não pode ser negado é que nos últimos
anos a SAP vem saindo com novas ideias radicais em um ritmo mais rápido e rápido.
Grande parte dessa nova tecnologia não usa a linguagem ABAP ou o ambiente de
desenvolvimento SE80, e o ritmo de mudança passou de se acostumar com uma nova
versão de algo a cada cinco anos para se acostumar com uma nova versão de algo a
cada 12 semanas. Qualquer uma dessas coisas isoladamente seria suficiente para
assustar as pessoas que não estão acostumadas a mudar, e a combinação os faz se
esconder debaixo do sofá e esperando que tudo isso vá embora. (Não vai.) Goste ou
não, provavelmente é uma boa ideia, no mínimo, ter uma ideia aproximada do que
todas essas coisas assustadoras — como o SAP HANA — são. A alternativa é cruzar
os dedos e esperar muito que eles não te afetem por mais 10 anos.
É claro que tentar acompanhar o fluxo ininterrupto de inovações que saem da SAP
hoje em dia é como beber da mangueira de incêndio proverbial: Desde que a SAP
adotou a metodologia ágil, o tempo entre os lançamentos de vários produtos diminuiu
visivelmente, e a SAP é uma organização tão grande que os novos fea-tures vêm de
todos os lados de uma vez.
Ainda assim, se você tentar empurrar a mais recente e maior invenção SAP para seus
colegas, você pode ouvir o seguinte: (a) você não deve usar isso apenas porque é novo; e
(b) porque é novo, é arriscado, e provavelmente não vai funcionar de qualquer
maneira. Como sempre, não há posição em preto e branco sobre isso. Muitos
desenvolvedores gostam de usar coisas novas porque são novas, independentemente
de ser apropriado. E algumas das coisas novas realmente são boas!
24
Introduction
A SAP introduziu o ABAP Objects, a versão OO do ABAP, na versão 4.6, que saiu
no ano 2000. Depois de 15 anos, você esperaria que a maioria, se não todos,
programadores ABAP usassem esse estilo de programação. Pelo que vejo, nada
poderia estar mais longe da verdade. Eu diria que mesmo agora a maioria dos novos
códigos em sites cus-tomer (e um pouco justo da própria SAP) é escrito de forma
processual. Alguns peo-ple ainda nem começaram a programação processual e
escrevem tudo em um bloco enorme sem subrotinas. Houve enormes debates sobre
a SAP Com-munity Network sobre se a programação de OO é melhor do que
processual. Eu realmente acredito que é, mas independentemente do que eu penso,
você vai descobrir que se você quiser tirar proveito de alguns dos últimos avanços da
SAP que eu descrevo mais tarde neste livro, então você realmente não tem escolha.
Se você é novo na OO, aqui vai uma dica: Os dois livros de destaque que li sobre a
programação de OO que realmente me ajudaram no meu trabalho diário são Código
Limpo e Head First Design Patterns (veja a caixa "Recom-mended Reading" no final
deste introdução). Leia!
O conceito de criar programas antifragile foi introduzido por Robert Martin (embora
não nessas palavras exatas), que observou como o software de computador tende a
apodrecer ao longo do tempo: As constantes mudanças que você tem que fazer
tendem a adicionar cada vez mais lógica condicional e afins, inchando subrotinas e
tornando o código cada vez mais complexo até que ninguém tenha ideia de como
mantê-lo sem quebrar algo (ou seja, fica mais frágil com o passar do tempo ). Robert
Martin quer que nós, pro-grammers, lutemos contra esse tipo de entropia aplicando
a regra do escoteiro , que é "Sempre deixe o acampamento mais limpo do que você
encontrou." A ideia é que, porque você tem que mudar o programa de qualquer
maneira, fazer pequenas mudanças cada vez para a área que você está mudando para
torná-lo mais claro (ou seja, renomear variáveis obscuras para você pode dizer o que
eles fazem, dividir uma subrotina enorme em dois para que seja mais fácil de entender,
e assim por diante). Com o tempo, sua base de código deve melhorar em vez de
lentamente girar de aço para vidro. O que isso tem a ver com a lista de novos bens que
vou discutir? Mais do que você pensa. A posição tradicional tem sido evitar novas
ferramentas como a peste, porque elas são "arriscadas", ou seja, novas. Neste livro,
em quase todos os capítulos você verá o argumento inverso aparecendo. Vou tentar
mostrar como essas novas ferramentas podem ser usadas para tornar seus programas
mais simples de ler ou mais robustos: em suma, mais resistentes à mudança. Por que
é importante tentar proteger seus programas das mudanças que você tem que fazer?
Talvez porque a taxa de mudança na TI já acelerou para uma velocidade de ruptura e
só está chegando mais rápido.
25
Introduction
Eu acho que é bastante seguro dizer que nenhuma empresa no mundo depende apenas do seu
sistema SAP para fazer negócios . Sempre haverá sistemas externos variados, alguns dos
quais são interfaceados com o SAP ERP, outros não. A SAP em si tem uma grande variedade
de produtos, desde a época logo após o ano 2000, quando apareceram os novos produtos de
dimensão (como SAP CRM, SAP SCM, e assim por diante).
Onde eu trabalho, temos alguns produtos ERP não SAP em uso: SAP BW, SAP Business-
Objects BI, SAP PI e Ariba, para citar apenas alguns. Eu poderia facilmente falar sobre avanços
nessas áreas também, mas eu vou me concentrar na parte no meio do diagrama de Venn: Este
livro se concentrará nos recursos mais recentes relacionados à programação abap que você pode
aproveitar se você tiver um sistema SAP ERP. Eu não vou falar sobre nada para o qual você
precisa de um sistema licenciado separadamente fora do SAP ERP.
Este livro está organizado em quatro partes. Primeiro, você vai olhar para as
ferramentas reais que você precisa ao escrever programas em primeiro lugar. Em
seguida, as três últimas seções mir-ror as camadas de um aplicativo: a camada lógica
de negócios, a camada de interface do usuário/apresentação e a camada de banco de
dados. Cada parte e seus capítulos são descritos em mais detalhes em seguida.
26
Structure of the Book
Isso se aplica a todos os outros tópicos deste livro: Tudo o que você cria precisa
ser testado. (Você vai descobrir que algumas tecnologias mencionadas no livro,
como BOPF e BRFplus, têm suas próprias ferramentas de teste anexadas
também, mas isso é apenas cereja no bolo de teste da unidade. O ABAP no Eclipse
também tem excelente suporte para a Unidade ABAP, tanto para ajudá-lo a criar
os testes e executá-los.)
27
Introduction
A primeira parte do refatoração pode ser uma verificação de código estático. A SAP
criou o Cockpit de Teste ABAP, que é, em alguns sentidos, uma extensão do
Extended Pro-gram Check e do Code Inspector, com bits extras no topo. Ele também
pode ajudá-lo a preparar seus programas para migração para um banco de dados SAP
HANA.
28
Structure of the Book
(BOPF), que fornece uma transação de modelagem na qual há lugares para todas as
tarefas comuns, como consultas, verificações de consistência e valores derivados.
Chapter 9: BRFplus
Devido ao fato de que o SAP ERP é um aplicativo focado em negócios, você
provavelmente está acostumado a ler constantemente valores das tabelas de configuração
e do IMG, juntamente com suas próprias tabelas Z. A BRFplus é um mecanismo de regras
de decisão, que em nível técnico amplia consideravelmente a capacidade da IMG de
armazenar as regras reais de negócios de forma facilmente visualizada. Em um nível
filosófico, devolve a responsabilidade por essas regras desde a TI até as pessoas que
realmente as criam.
29
Introduction
Dado que não posso dizer no que estou trabalhando e que não vou usar a boa e velha
prática SAP de usar o SFLIGHT , o exemplo deste livro é baseado em um projeto durante
30
The Example Application
Barão Frankenstein para criar um monstro melhor. Seus monstros anteriores não
funcionavam muito bem, então a SAP o convenceu a se inscrever para seu serviço de
implantação rápida para fazer monstros baseados em nuvem, móveis e na memória.
Um milhão de LEU (a moeda na Transilvânia) mais tarde, ele percebeu que a solução
fora da caixa não lhe deu tudo o que ele queria, então ele contratou você para escrever
um programa de fabricação de monstros no SAP ERP. Nesta aplicação, ele inser todas
as bundas que ele quer de um monstro, e seu programa usa algoritmos tão
complicados quanto o projeto do genoma humano para preparar a final dados, que
então é interfaceado com sua máquina de fazer monstros através de serviços web
durante uma tempestade.
Durante os capítulos seguintes, você verá (com exemplos de código) que, felizmente
para o barão, você pode aproveitar as variadas novas inovações recentemente
entregues da SAP para ajudar em sua busca de criação de monstros.
Recommended Reading
PART I
Programming Tools
É melhor não olhar para o sol durante um eclipse.
— Jeff Goldblum
1 ABAP in Eclipse
Se você está prestando atenção, você pode notar que os recursos mais recentes na bancada
de trabalho ABAP parecem suspeitamente com recursos que você encontra no Eclipse
(por exemplo, conclusão automática de código ou palavras-chave de colorir de forma
diferente das variáveis). Eventualmente, a SAP decidiu dar o salto; em julho de 2012, o
SAP NetWeaver Develop-ment Tools for ABAP (ADT) foi lançado. Todo mundo chama
de "ABAP no Eclipse", porque (a) é isso que é e (b) o nome oficial faz você soar como se
tivesse engolido um dicionário quando você diz isso. (Você pode estar familiarizado com
este phe-nomenon de outro produto SAP nomes.)
Embora o Eclipse seja um passo na direção certa, a mudança nem sempre é fácil, e a
SAP suspeitava com razão que os desenvolvedores tradicionais da ABAP ficariam
horrorizados com a própria ideia de não executar tarefas de desenvolvimento na
Transação SE80 ou suas transações de subconjunto, como SE24, SE37 ou SE38. Para
tentar amortecer o golpe, a SAP deu um aviso prévio de que estava prestes a lançar o
ABAP no Eclipse cerca de um ano antes do lançamento, e naturalmente o site da SAP
Community Network (SCN) explodiu com comentários "Prefiro morrer do que usar
isso" (um pequeno exagero, mas apenas leve). Esses comentários eram praticamente
sempre de pessoas que nunca tinham ouvido falar do Eclipse antes, muito menos o
usavam para desenvolver uma aplicação. Como resposta, tive que ir e colocar um
gato entre os pombos publicando um post muito curto no blog chamado "SE24 is
Garbage" em que exaltava as virtudes do Eclipse. (SE24) não é lixo; Eu estava
apenas agitando as pessoas.) Uma torrente de abusos desceu sobre minha cabeça —
mas agora é apenas dois anos depois, e a julgar pelos blogs na SCN, a maré começou
a mudar à medida que mais e mais pessoas tentam ABAP no Eclipse e descobrem
eles gostam (embora para ser justo, mesmo agora ainda há um monte de comentários
negativos).
Para instalar o Eclipse, seu sistema backend precisa ser pelo menos um sistema SAP NetWeaver 7.31
SP 4. Se você é um dos clientes SAP ainda no 7.02 ou abaixo, eclipse não é para você! Há uma razão
para este livro se chamar ABAP para o Futuro, afinal .
1.1 Installation
Existem três partes para configurar um ambiente de desenvolvimento eclipse para que
você possa usá-lo para criar e alterar programas ABAP:
A pegadinha é que esta página lhe dará a versão mais recente do Eclipse, e o SAP
normalmente roda cerca de três meses atrás; assim, pode ser que se você fizer
download da versão mais recente do Eclipse, ela será literalmente boa demais para
ser usada. Então, antes de se empolgar e apertar o excitante botão DOWNLOAD,
visite https://tools.hana.ondemand.com/#abap; lá você verá qual é a última versão
suportada do Eclipse e o link que você deve seguir para fazer o download (Figura
1.1).
Ao seguir o link—para Eclipse Kepler no exemplo mostrado na Figura 1.1—você
chegará a uma versão ligeiramente diferente da tela mencionada no início desta
seção, mas o importante é que ele ainda tem um grande botão de download para
você clicar. Abaixo do botão de download, você é apresentado a uma deslumbrante
variedade de opções. A Figura 1.2 mostra apenas os dois primeiros, mas você pode
continuar a paginar e as opções continuam aparecendo.
Qualquer uma das opções mostradas na Figura 1.2 está correta para usar o ABAP
no Eclipse, mas, na verdade, é melhor escolher a chamada IDE para JAVA EE
DEVELOPERS. No Capítulo 13, você precisará dos recursos extras que esta
Warning: Houston, We Have a Problem
opção oferece ao começar a trabalhar com SAPUI5.
Cada opção tem uma opção de 32 bits e uma de 64 bits. Certifique-se de escolher aquele que
seja compatível com a versão do Java que está sendo executada em sua máquina; ou seja, uma
versão de 32 bits do Java e uma versão de 64 bits do Eclipse não funcionam bem. juntas.
Baixar este programa para sua máquina local é tão simples que não há
necessidade de entrar em mais detalhes, então vamos direto ao que acontece
quando a instalação é concluída e você tem um lindo ícone em forma de planeta
em sua área de trabalho.
A Figura 1.3 mostra uma estrutura em árvore de todos os recursos possíveis que
você pode instalar relacionados ao desenvolvimento SAP. Você poderia baixar
tudo na árvore se quisesse (você certamente baixará as opções SAPUI5 mais tarde),
mas por enquanto baixe tudo na seção Ferramentas de DESENVOLVIMENTO
Agora, a página BEM-VINDO do Eclipse é aberta. Se você rolar para baixo, verá
muitas opções específicas do SAP. Primeiro, existem vários específicos do SAP
HANA (é claro), e depois disso há a seção DESENVOLVIMENTO ABAP (Figura
1.4).
Se você abrir uma dessas opções, por exemplo, QUICK LAUNCH, a ajuda on-
line será aberta e apresentará muitas informações. Uma parte considerável dos
capítulos no lado esquerdo da tela endereça ABAP ou SAP HANA.
1.1.3 Connecting Eclipse to a Backend SAP System
Como mencionado anteriormente, você precisa de um sistema de back-end que seja pelo
menos SAP NetWeaver 7.31 SP 4 para se conectar ao Eclipse. Para conectar esse backend ao
Eclipse, siga o caminho de menu do Eclipse FILE • NEW • OTHER • ABAP • ABAP
PROJECT. (Um “projeto” neste contexto é nada mais nada menos do que uma conexão com
um sistema ABAP back-end.)
Na Figura 1.5, você verá que o botão de opção SELECT CONNECTION from SAP LOGON
está selecionado. Isso significa que quando você clica em BROWSE, aparece uma lista de
sistemas SAP disponíveis em nosso painel de logon instalado localmente. Quando
selecionamos um sistema, a metade inferior da caixa pop-up é preenchida com os detalhes do
sistema.
1.2 Features
Ao conectar seu sistema backend pela primeira vez ao Eclipse, você verá uma
mensagem de boas-vindas no lado direito da tela (Figura 1.6).
Digamos que você queira alterar uma de suas classes Z e não consiga lembrar seu nome
exato. Normalmente, você iria para o SE24, digitaria “ZCL_BC*” (como exemplo) e
abriria o menu suspenso. (Se você for como eu, às vezes você não veria nenhum
resultado. Então, de repente, você perceberia que estava no SE37 por engano.) A ação
equivalente para procurar objetos personalizados no Eclipse é pressionar (CTRL) +
(SHIFT ) + (A). Uma caixa de pesquisa é exibida. Você digita no início do seu objeto
e, com cada letra que você adiciona, a lista de possíveis correspondências é reduzida
(Figura 1.8). A velocidade com que o Eclipse pesquisa no repositório ABAP é muito
mais rápida do que se poderia esperar, geralmente mais rápida do que a mesma pesquisa
no sistema SAP real, o que parece magia negra.
Selecione uma de suas classes Z, e a tela mostrada na Figura 1.9 aparecerá; espero que
não pareça tão diferente do SE80 que você morra de choque cultural na hora. Você
notará que existem várias janelas em uma visualização do Eclipse, e você pode fechá-
las ou redimensioná-las e até mesmo arrastá-las e soltá-las por toda a tela. O sistema
lembrará o layout da janela se você sair do Eclipse e voltar mais tarde.
Figure 1.8 Searching for an ABAP Repository Object
Essa última parte é importante, porque geralmente você faz logoff do SAP no
final do dia e, no dia seguinte, faz logon novamente e procura a linha do programa
de onde parou ontem. No Eclipse, você começa de onde parou.
FUNCTION
ZBC_GET_USERS_COUNTRY
EXPORTING
E_LAND LIKE TTZ5-LAND1.
Listing 1.1 Signature at Start of Function Module Code
Neste ponto do capítulo, você aprendeu o básico absoluto: o que é o Eclipse, como
instalá-lo e conectá-lo ao seu sistema de desenvolvimento ABAP e como chamar
e alterar objetos de repositório ABAP via Eclipse. É bem provável que neste
momento muitos desenvolvedores estejam pensando: “E daí? Isso se parece
muito com o SE80. É muito esforço extra para fazer exatamente as mesmas
mudanças que eu faria no SE80 nesta nova estrutura externa.”
Naturalmente, eu não teria trazido tudo isso à tona se o Eclipse não oferecesse
uma solução para esse problema - o que, é claro, oferece. Como você não está no
SAP GUI, você pode ter quantas janelas contendo objetos de programa quiser e
pode arrastar e soltar e redimensionar as janelas para ver quantas você quiser a
qualquer momento (Figura 1.10).
A tela da Figura 1.10 parece muito cheia, mas ao programar você não está tão
interessado em beleza, apenas em ver o máximo de informações que você precisa
em um determinado ponto. Naturalmente, se você tiver dois (ou mais) monitores,
também poderá enchê-los com caixas (como os programas policiais na TV em
que enchem a parede com pistas do crime).
Você pode notar que uma das caixas abertas na captura de tela da Figura 1.10 não
era um programa ABAP, mas um programa JavaScript de um aplicativo SAPUI5
que você desenvolverá posteriormente neste livro. O ponto a ser feito aqui é que,
à medida que o SAP evolui, você se verá desenvolvendo partes do aplicativo em
1.2.2 Bookmarking
A qualquer momento, você realmente nunca está trabalhando em apenas uma
coisa, mas em um número (espero) finito de construções ABAP (chamadas
“artefatos” no Eclipse): programas, classes e módulos de função e similares. No
entanto, o número pode ser bastante grande em um projeto de desenvolvimento
complexo, e nós humanos temos uma tendência horrível de esquecer o nome
exato de uma classe - mesmo que trabalhemos com ela vinte dias seguidos - e
precisar procurá-la em SE24.
No ABAP no Eclipse, você pode clicar com o botão direito do mouse no artefato
que deseja marcar e, quando fizer isso, verá um enorme menu de contexto, com
ADD BOOKMARK próximo à parte inferior (Figura 1.11).
Figure 1.11 Bookmarking an ABAP Artifact
Então, algumas horas ou dias depois, você pode clicar em uma pequena caixa à direita da tela
que diz BookmARks quando você passa o cursor sobre ela; a caixa mostrada na Figura 1.12
aparece.
Infelizmente, mesmo depois de todos esses anos, em seu ambiente SE80 há uma
coisa que você pode fazer com programação procedural que não pode fazer com
programação OO usando métodos locais: rotinas FORM. Por exemplo, considere
o código de procedimento de amostra na Listagem 1.2, que chama uma rotina
FORM.
Se não houvesse tal rotina FORM, então quando você clicar duas vezes em
CREATE_MONSTER o sistema perguntará se você deseja criar aquela rotina
FORM ausente. Em seguida, ele o criaria para você, junto com a assinatura
(embora você tivesse que codificar manualmente os TYPES dos parâmetros de
assinatura).
Agora, considere o código orientado a objetos chamando um método na Listagem
1.3.
Você pode esperar que, se não houvesse tal método, exatamente a mesma coisa
aconteceria, e uma implementação e definição de método esqueleto seriam
criadas para você quando você clicasse duas vezes no método
CREATE_MONSTER. Você estaria, infelizmente, errado.
SECTION.
METHODS: main.
METHOD main.
* Local Variables
DATA: ld_monster_number TYPE i,
ld_number_of_heads TYPEi.
ENDMETHOD.
As you can see, the create_monster method does not exist. In the past, you couldn’t
just double-click it; you had to create a definition, and then create an
implementation, and then find your way back to the place you first started, mak -
ing you think that maybe FORMroutines weren’t so bad after all.
In Figure 1.13, the definition of the IMPORTINGparameter came from the variable
definition you made in the code, which is one better than the FORM-based equiva-
lent in which you have to manually add the variable type.
Sadly, you may have to manually add the RETURNING parameter; in my version of
ABAP in Eclipse, the autocreation did not work if I entered ld_monster_number =
create_monster( ld_number_of_heads ). Nonetheless, that is probably just a bug which will
be fixed in time. In any event, the end result is as shown in Listing 1.5.
PUBLIC SECTION.
METHODS: main.
PRIVATE SECTION.
METHODS create_monster
IMPORTING
id_number_of_heads TYPEi
RETURNING
value(rd_monster_number) TYPE i.
ENDCLASS. "Laboratory Definition
METHOD main.
* Local Variables
DATA: ld_monster_number TYPE i,
ld_number_of_heads TYPEi.
ENDMETHOD.
METHODcreate_monster.
ENDMETHOD.
ENDCLASS. "Laboratory Implementation
Listing 1.5 Automatically Created Method Implementation
The Eclipse term for (CTRL) + (1) is Quick Assist. You can open an area of the screen (view),
leave it open in the bottom-left corner or wherever you want, and then you can see what
proposals the system has for you in regard to creating missing things automat- ically or
other types of refactoring (Figure 1.14).
You won’t need to have such a screen area open once you’re used to all the things ABAP
in Eclipse can do for you, but at the start this is very helpful to remind you that not
everything has to be done manually any longer.
Então vem a mudança: a lógica precisa ser ajustada. Agora você tem que fazer
essa mudança em 54 lugares diferentes, e é claro que você vai esquecer de fazer
a mudança em alguns deles. Isso pode levar a resultados imprevisíveis. O usuário
experimentará um comportamento diferente ao fazer a mesma coisa em diferentes
contextos; em outras palavras, a mudança quebrou o programa em dois, como um
galho de vidro sendo saltado para cima e para baixo por um elefante durante um
terremoto.
A solução óbvia é que quando você deseja copiar e colar um pedaço de código e
fazer algumas pequenas alterações, você deve extrair a maior parte do código em
seu próprio método, com parâmetros IMPORTING para as partes que variam.
Isso soa bem e elegante em princípio, mas é um pouco trabalhoso, e é muito mais
fácil destacar o código e fazer o truque (CTRL) + (C)/(CTRL) + (V), e as pessoas
estão em pressa, então é isso que eles fazem, sem perceber que acabaram de fazer
uma vara para suas próprias costas (e de seus colegas, presentes e futuras).
METHOD main.
* Local Variables
DATA: ld_monster_madness1 TYPE i,
ld_monster_madness2 TYPE i,
ld_monster_madness3 TYPE i,
ld_description1 TYPE string,
ld_description2 TYPE string,
ld_description3 TYPE string.
ld_monster_madness1 =25.
ld_monster_madness2 =50.
ld_monster_madness3 = 100.
ENDMETHOD.
ENDCLASS.
Listing 1.6 Sample Code with Changing Variables
Quantas vezes você já viu código assim – a mesma construção repetidas vezes,
apenas com as variáveis mudando? Isso é de fato um comportamento criminoso
- e a vítima é o programador que escreveu o código - quando há tantas maneiras
de facilitar sua vida (por exemplo, macros).
Em seguida, você verá uma caixa solicitando uma solicitação de transporte (se
este não for um objeto local) e se deseja ativar tudo após a conclusão da extração.
A parte final — e talvez a melhor — é que, antes de fazer a alteração, você vê
uma comparação entre antes e depois, mostrando como ficará seu código depois
que a alteração proposta for feita (Figura 1.16). Se você não gostar da aparência
do que o sistema está prestes a fazer, você pode cancelar.
Após a extração, três alterações foram feitas. Primeiro, foi criada uma definição
de um novo método privado (Listagem 1.7).
PRIVATE SECTION.
METHODSderive_monster_sanity
IMPORTING
id_monster_madness1 TYPE i.
Listing 1.7 Definition of New Private Method
Next, the block of code you highlighted has been replaced by a method call (List-
ing 1.8).
ld_monster_madness1 =25.
ld_monster_madness2 =50.
ld_monster_madness3 = 100.
derive_monster_sanity( ld_monster_madness1 ).
Listing 1.8 Method Call Replacement
Figure 1.16 Extracting a Method: Before and After Comparison
METHOD derive_monster_sanity.
DATA ld_description1 TYPE string.
* Derive Monster Sanity
IF id_monster_madness1 LT 30. ld_description1
= 'FAIRLYSANE'.
ELSEIF id_monster_madness1 GT 90.
ld_description1 = 'BONKERS'.
ELSE.
ld_description1 = 'AVERAGE SANITY'.
ENDIF.
ENDMETHOD.
Listing 1.9 New Method Implementation
Digamos que, como parte de seu projeto monstruoso, você seja chamado a
escrever um programa para realizar a operação matemática mais complicada do
mundo. Leva meses de suor e lágrimas, mas no final você tem um programa que
apresenta o resultado correto; parece com a Listagem 1.10.
METHOD main.
* Local Variables
DATA: ld_use_this TYPE i,
ld_also_this TYPEi, ld_result
TYPE i, ld_not_used TYPE i,
ld_not_used2 TYPE i,
ld_not_used3 TYPEi.
ld_use_this =1.
ld_also_this =1.
ld_result = ld_use_this + ld_also_this.
ENDMETHOD.
Listing 1.10 Most Complicated Mathematical Operation in the World
O resultado agora está correto, mas ao longo das milhares de versões deste programa
você criou algumas variáveis que não são usadas. Dentro do SAP, você normalmente
executa a verificação de sintaxe estendida, que fornece uma lista dessas variáveis não
utilizadas, e então você entra em cada uma, uma de cada vez, e as exclui.
No Eclipse, você escolhe a opção de menu SOURCE • DELETE UNUSED VARIables (All), e
em um milionésimo de segundo todos os seus amigos não utilizados desaparecem,
chorando por todo o caminho que seu propósito na vida desapareceu. Você também
tem a opção de excluir variáveis não utilizadas apenas na área que você destacou.
METHOD howl_at_moon.
DO md_howls TIMES.
MESSAGE 'Oooooooooooo' TYPE 'I'.
ENDDO.
ENDMETHOD. "howl_at_moon
Listing 1.11 Missing IMPORTING Parameters and Variables
Além disso, se você tiver declarado algumas variáveis na definição de classe antes
de fazer isso, um assistente aparecerá e perguntará quais dessas variáveis você
deseja ter como IMPORTINGparameters no constructor. Portanto, se você tivesse
variáveis de membro para uma classe de registro e o nome do inventor, por
exemplo, que desejasse passar toda vez que uma nova instância fosse criada, você
as escolheria na lista apresentada. O resultado gerado se pareceria com a Listagem
1.12.
CLASS zcl_monsterIMPLEMENTATION.
METHOD constructor.
Super->constructor( ). me-
>logger =i_logger.
me->inventor_name = i_inventor_name.
ENDMETHOD.
Listing 1.12 Automatically Generated Constructor
Criar automaticamente um método de fábrica que retorna uma instância da classe
também é um recurso muito útil. Todos os puristas dizem que você deve tentar
colocar suas instruções CREATE OBJECT dentro de classes de fábrica para que você
possa retornar uma subclasse sem perturbar o programa de chamada. Este é um dos
recursos que está disponível apenas em alguns níveis superiores do ABAP
Workbench padrão; você precisa de um sistema 7.4 (SP 5) até que esses recursos
sejam retroportados para 7.31 (que está em
7.31 SP 11). O ponto aqui é que os recursos estão disponíveis no Eclipse antes de
chegarem ao ABAP Workbench “real”, geralmente com bastante antecedência.
Convenientemente, este é um ponto que conduz muito bem à próxima seção.
Por exemplo, quando você chama o assistente para extrair um método, no canto
inferior esquerdo há um ponto de interrogação, que abre a ajuda online. Aqui, você
pode navegar por todas as coisas maravilhosas que pode fazer, com exemplos de
código, mas também verá uma matriz listando o nível mínimo que seu sistema ABAP
precisa estar para aproveitar cada recurso (Figura 1.18).
Isso pode ser bastante frustrante, porque significa que qualquer versão do ABAP no
Eclipse que você tenha tem a possibilidade de fazer muito mais do que seu sistema
ABAP backend permite, e novas versões do ABAP no Eclipse são lançadas com
bastante frequência.
*"* use this source file for your ABAP unit testclasses
CLASS ltcl_definition FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
first_test FOR TESTING RAISING cx_static_check.
ENDCLASS.
Criar um modelo de esqueleto para uma classe de teste não é o santo graal da criação
de testes de unidade, mas segue o desenvolvimento orientado a testes muito melhor
do que o processo padrão SE80. Naturalmente, você precisa alterar o código gerado
para preencher o nome de sua classe de teste e método de teste e adicionar métodos
de teste extras conforme necessário. O ponto é que você está criando os métodos de
teste primeiro e depois copiando a definição para a classe real.
Como você viu na Seção 1.2.3, uma vez que você tenha uma definição, você pode
gerar o esqueleto da implementação apenas pressionando (CTRL) + (1). O que a
geração automática deve fazer é adicionar uma definição, como DATA: mo_cut
TYPE REF TO ycl_ monster_unit_tests. (Isso realmente não funcionou para mim,
não importa o que eu tentei, então adicionei manualmente. A documentação indica
que isso deve ser feito automaticamente, então provavelmente será corrigido em uma
versão posterior.
Problem 2: You Cannot Tell How Much of the Program Is Being Tested
O objetivo do teste de unidade é ter a maior certeza humanamente possível de que,
quando você altera uma parte do seu programa — seja uma correção de bugs ou
adiciona funcionalidade extra — a mudança não quebra outras partes do programa.
Na vida real, as pessoas tendem a achar que uma mudança em uma área sempre
quebra algo em outra área, o que deve ser uma bandeira vermelha para indicar que
talvez haja algo de errado em criar programas tão frágeis.
Os testes unitários permitem que você realize testes automatizados de regressão para
que, quando você alterar até mesmo uma linha de código, você possa ter certeza de
que você não quebrou algo em outro lugar. Naturalmente, você só pode ser realmente
seguro se você sabe que cada linha de código sin-gle em cada rotina e método em sua
aplicação está sujeito a tal regressão teste. Criar tais testes em primeiro lugar não é
a coisa mais fácil do mundo, e é por isso que tão poucas pessoas fazem isso — isso
será discutido muito mais no Capítulo 3. No entanto, se você viu a luz e deseja criar
tais testes, a próxima tarefa é ver quanto do seu código está realmente sendo testado.
Se essa fig-ure for inferior a 100%, então veja o que pode ser feito sobre isso.
Na última seção, você criou um método de teste. Agora, você criará o método real,
que será testado, e então criará outro método real, que não terá um teste de unidade
correspondente — como se você estivesse sendo impertinente e tentando enganar a si
mesmo a pensar que criar métodos sem testes economizará tempo. (Eles! Vontade!
Não!)
Dizem que pequenas coisas agradam às pequenas mentes, mas tenho grande
prazer em poder escrever a definição do método para o método que não será
testado, press-ing (CTRL) + (1) e ter a implementação criada para mim, e ter o
cursor saltar para a implementação. Outro clichê diz que cada segundo conta, e
se essas ferramentas economizam alguns segundos aqui e ali durante todo o seu
dia de trabalho, então com o tempo tudo isso faz sentido.
CLASSycl_monster_unit_testsIMPLEMENTATION.
METHOD first_monster.
WRITE:/ 'I am the First Monster'.
ENDMETHOD.
METHOD second_monster.
WRITE:/ 'I am the Second Monster'.
ENDMETHOD.
Se você estivesse em SE80, agora você f ollow th e menu path PROGRAM • TEST •
UNIT TEST; o equivalente in ABAP in Eclipse é pressionar (CTRL) + (SHIFT) + (F10).
Tha t's wonderful; você vai ee any errors that may have cropped up as a result de
qualquer changes você might ter feito. No entanto, você quer levar thé para o
próximo nível, então em vez de pressionar (CTRL) + (SHIFT) + (F11). (Eleven é
obviously a better number than 10, in the same way that they s tarted c alling
hotéis hotéis seis estrelas sercause cinco stars foram n't god o suficiente anmais.)
Agora, você verá dois resultados (Figura 1,20). Primeiro, todo o código testado é
destacado; mais importante, você verá uma exibição resumida, que indica qual
porcentagem de cada método foi testada pelos testes automatizados da unidade.
Este é o tipo de informação que você quer enfiada em seu rosto como uma torta
de creme, primeiro porque você quer ter certeza de que todas as partes vitais do
seu programa estão cobertas por testes de regressão e segundo para se mover
para garantir que cada linha de código obtenha cobertura de teste.
1.3.2 Debugging
Uma das melhores características da Bancada abap é o depurador, e o Capítulo
5 dará uma rápida olhada nas últimas características que entraram no depurador
recentemente que você pode desconhecer. No momento, porém, o foco está no
ABAP no Eclipse, então você pode estar se perguntando que relevância a
depuração tem em um ambiente de desenvolvimento puro. Isso volta aos testes
da unidade novamente: se você tiver um erro, então você quer depurar o programa
para ver o que está acontecendo de errado.
CLASSlcl_how_many_monstersIMPLEMENTATION.
METHOD how_many_make_five.
DO 100 TIMES.
ADD 1 TOrd_how_many. IF
rd_how_many = 4.
RETURN.
ENDIF.
ENDDO.
ENDMETHOD.
ENDCLASS. "How Many Monsters implementation
START-OF-SELECTION.
CREATE OBJECT lo_counter.
ld_how_many=lo_counter->how_many_make_five( ). WRITE:/ ld_how_many.
Listing 1.15 Only Four Monsters
Isso faz com que o teste da unidade falhe, então você depura-o. Enquanto você
está no depurador, torna-se óbvio o que está errado: você precisa adicionar outra
linha de código. Neste ponto, normalmente você sairia do depurador, mudaria
seu programa e, em seguida, testaria ou depuraria novamente após a correção.
Assim como no editor abap normal, you pode control onde o programa vai mudar
para depurargger mode when the pr ogram é run. Você pode adicionar pontos
macios breakpoints se você assim desire, através do menu ou (CTRL) + (SHIFT) + (
); você também pode put em hard b reak-p oints, such como BREAK BLOGGSJ.
Quando você run o programa (opção de menu EXECUTAR • EXECUTAR COMO ABAP
APPLIcATION) ou executar the un tests, como assimon como a breakpoint é reached
a box will appera and a sk se você want para look no program no modo depuração.
Como stupid perguntas ir, thé leva o ca k e; obviously você faz, então você diz sim
e marcar a caixa que faz o sistema lembrar thé wond erful de cision you made.
A tela do depurador se abre; parece ligeiramente diferente do que você foi usado no
passado (Figura 1.21). É possivelmente um pouco mais fácil alterar os valores das
variáveis no tempo de execução (clique duas vezes na caixa em que o valor atual é
exibido para alterar um valor).
Se o sistema SAP backend não estiver em um nível alto o suficiente — ou seja, o kernel tem
que ser pelo menos 721 — você receberá uma mensagem de erro dizendo algo como "ABAP em
eclipse depuração não está disponível no sistema XYZ, por favor depurar dentro o SAP GUI."
Figure 1.21 Debugging in Eclipse
Você pode ver o erro; o código sai com um valor de 4, não 5. Mude o estado para
dizer SE RD_HOW_MANY = 5. Isso não tem efeito sobre a execução atual (que
seria magia negra), mas quando você terminar e executar o programa novamente,
tudo está ok; a correção fez efeito.
Isso não é o fim do mundo, mas leva algum tempo para se acostumar, e o equiv-alent
em ABAP no Eclipse é muito mais amigável aos olhos. Para demonstrar isso, a seguir
é um exemplo bobo no qual uma pequena fração do programa realiza cálculos
matemáticos maticos, e a maior parte do programa executa instruções SELECT
dentro de um loop. (Na verdade, o exemplo não é tão bobo como tudo isso, porque
você tende a encontrar essa situação muitas vezes na vida real programas.)
Diga que toda vez que um monstro aprende que existe uma coisa como linhas
aéreas americanas, o monstro instantaneamente quer ir em um voo com eles.
Assim, a Listagem 1.16 combina o exemplo popular do SFLIGHT com um
exemplo monstro.
DO 100 TIMES.
SELECT COUNT( * )
FROM sflight
WHERE carrid = 'AA'.
CHECK sy-subrc = 0.
ADD 1 TO gd_flying_monsters.
ENDDO.
Listing 1.16 SFLIGHT and Monster Mash-Up
Este example é apenas good para mostrar what not t o do; obviously, nós emly
need para ler the database emce. Para invoke the análise de tempo de execução,
select your ABAP pro-g am, avellow the menu pa th PrOFILE AS • Aplicativo ABAP ,
e depois type "trace" no canto superior direito-h umnd canto da tela, onde diz
QUIck AccEs.
Você verá o arquivo de rastreamento de acordo com usual. Quando você expande
e clica em it, inem vez de barras dizendo como much tempo foi spent no banco de
dados e em the server, você vai ver um gráfico de tortas mostrando o exact mesmo
finog. That probably does not impress you too much, mas como um próximo step
clique na CALL TIMELIne tab at the bottom. Then, você verá uma tela em que o
tempo será o eixo na parte superior da tela, e você verá uma representação gráfica
do que o programa está gastando seu tempo fazendo. Isto é, vamos concordar,
muito mais fácil para o cérebro de um humano seguir.
Altere o código de tal forma que você tenha apenas um acesso ao banco de dados
e, em seguida, repita o exercício. Desta vez, o gráfico de tortas mostra que você
está gastando a maior parte do seu tempo no ambiente ABAP, que é onde você
quer estar.
Uma grande parte do Eclipse é seu kit de desenvolvimento de software (SDK), que visa
permitir que as pessoas criem plug-ins que podem ser instalados no sistema base
eclipse para permitir funcionalidade extra. Todas as ferramentas de
desenvolvimento ABAP para eclipse são plug-ins que você instala manualmente.
É por isso que o Eclipse pode ser usado como uma plataforma de
desenvolvimento para tantas línguas.
O que torna os plug-ins definidos pelo usuário tão úteis é que o sistema SAP pode expor uma
ferramenta escrita em ABAP como uma URL. Frameworks como o Eclipse podem então enviar
uma solicitação para o sistema SAP por meio de uma URL, que é então processada por uma
classe de manuseio ABAP que você não tem nom-inate no SicF de Transação. (In Capítulo 13,
você verá que é precisamente assim que os aplicativos SAPUI5 funcionam.) Criar seu próprio
plug-in não é um exercício trivial, e está além do escopo deste livro entrar em detalhes, mas
você precisa estar ciente de que isso pode ser feito. (Se você está interessado em prosseguir
com isso, a SAP publicou um guia de como fazer para este fim; ver a caixa "Leitura
Recomendada" no final do capítulo.) O foco desta seção não é explicar como criar seus
próprios plug-ins, mas dar-lhe exemplos práticos do que pode ser alcançado com tais plug-ins
definidos pelo usuário.
A natureza dos itens extras do menu muda dependendo do que você está fazendo;
se você tiver um programa ou outro objeto aberto, então você terá a opção de
exportar o objeto para sua unidade local como um "nugget", por exemplo.
1.4.1 UMAP
UMAP is an open-source project created with the hope of getting other people
involved; it’s a prototype just starting out in life. UMAP uses some of the freely
available technology that the aforementioned Obeo provides, and the examples
in this section do the same. (Obeo is discussed in more detail in Section 1.4.2.)
Para ver o que a UMAP pode fazer, o primeiro passo é ir ao site www.uml2abap.org
e baixar o GERADOR DE Código UMAP, um nugget SAPlink que cria algumas
classes e um programa de upload em seu sistema ABAP. Neste caso, você tem que
baixar um arquivo do Eclipse e depois carregá-lo novamente no SAP. O arquivo de
download contém dois arquivos. O primeiro é um nugget SAPlink que você
transforma em classes e programas ABAP via relatório ZSAPLINK. O segundo é um
arquivo de texto, que você precisa transformar em uma transformação XML indo
para o Transaction XLST_TOOL, criando uma transformação chamada
ZUMAP_FILE_PARSER e, em seguida, colando no código do arquivo de texto.
O website talks sobre also downloading um plug-in Eclipse, mas that is a red her-
ri ng. Na verdade, você precisa abrir eclipse, escolha a OPÇÃO AJUDA • INSTALl l
NOVA SOFTWARE, and enter o URL http://uml2abap.org/ecli pse_plugin. The s creen
shpossuir em Figure 1.24 opens.
Selecione a caixa UMAP e then click NEXT para install the plug-in. O próximo passo
em the process é to criar your UML diagram. Como homenstioned earlier, você
precisa de algum tipo de modeling ferramenta instaled em seu ambiente Eclipse.
Eu escolhi para install o uml designer from Obeo (because it was free) by choosing
HElp • EclIPSE MAR-KET pL ACE e searching para o plug-i Obeo n. Depois que sua
modelagem para ol é instalada, retornar to the tela eclipse principal , e escolher
FILE • NEW • OTHER • UML DESIGNER • UML PROJECT.
Figure 1.24 Installing the UML2ABAP Eclipse Plug-In
Chame o projeto de "ReallyScaryMonster. " When asked for a model object, take
th e default option model. ( Neste ponto, para mim, cadaing desaparecerd. Apenas
no caso deste happ ens t o you, you shoul d be able to fix it by opening a new w
indow and selec t-ing S How VIEW • MODEL EXPLORER.)
Após pressionar o botão NEXT, você verá uma tela com três seções (Figura
1.26). No meio é uma área onde você criará seu diagrama de classes, em tele
direito são todas as coisas que você pode arrastar na tela, e na parte inferior
estão como propriedades de qualquer o cursor está em qualquer dado instante,
que você pode mudar . (No Capítulo 12, você verá o editor gráfico em Web
Dynpro ABAP é apenas como isso.)
Crie uma classe base com duas subclasses que herdam da classe base. Dê às três
propriedades algumas. na subclasse, faça alguns dos atributos verde e azul mon-
sters protegidos ou privados, e dê o método de classe principal um (chamado de
"operação" em uml falar). Você pode fazer tudo isso arrastando coisas ao redor
da tela; quando você colocar seu cursor em qualquer coisa (como um atributo),
você verá uma lista de propriedades na parte inferior da tela.
The hourglas giros, e um box intitulado ACCLEO GENERATIon RESULTS appears for
alguns segundos. O Accleo framework é alassim uma criação de Obeo. O
important thing é que now em seu projeto REALLYSCARYMONSTER você h ave a ve
a new node, chamado SRC-G EN; este tem um child node called NewModel.U mapa.
Você precisa exportar thé NewModel. uma p file to seu local machine; there não é
nada diff icult aqui - basta clicar com o botão direito do mouse no arquivo e choose
EXPORT and então a folder em seu local drive. Em seguida, execute o arquivo
Z_UMAP_IMPORT prr em your ABAP system, e nominate th e você acabou de salvar.
Se, como eu, você desconfia de tudo o que um computador lhe diz e tem uma
necessidade ardente de verificar tudo sozinho, em seguida, ir para o sistema ABAP
real através do bloco de logon normal para ter certeza de que as classes estão lá
em SE24; na verdade eles são. Com isso
preocupar-se fora de sua mente, voltar para eclipse para dar uma olhada no código
gerado (Listing 1.17). Lembre-se que em Eclipse tudo é uma visão baseada em
código fonte do que você pode ver em SE24 ou SE37 em uma exibição baseada
em formulário.
public section.
data MONSTER_NAME type INVALID . data
MONSTER_NUMBER type INVALID .
ENDCLASS.
Listing 1.17 Generated Code in Eclipse
Com certeza, o Eclipse gerou com sucesso o código para você, incluindo as
subclasses (Lista 1.18).
Até agora, não há como obter os TIPOS corretos para atributos, e os parâmetros do método não
copiaram. Isso é de se esperar; este é um pró-totype muito rudimentar, apenas uma prova de conceito
no momento. É disso que se tratam projetos de código aberto: se algo está faltando, então você mesmo
pode adicioná-lo.
class ZCL_REALLY_GREEN_MONSTER
definition public
inheriting from
ZCL_REALLY_SCARY_MONSTER create
public .
public section.
CLASSZCL_REALLY_GREEN_MONSTER
IMPLEMENTATION. ENDCLASS.
class ZCL_REALLY_BLUE_MONSTER
definition public
inheriting from
ZCL_REALLY_SCARY_MONSTER create
public .
public section.
data BLUENESS type
INVALID. protected section.
private section.
data NO_OF_BLUE_HATS type
INVALID . ENDCLASS.
CLASSZCL_REALLY_BLUE_MONSTER
IMPLEMENTATION. ENDCLASS.
Listing 1.18 Generated Subclasses
1.4.2 Obeo
O plug-in Obeo UML é apenas um protótipo no momento da escrita,
ainda não lançado ao público. É um plug-in eclipse projetado para
alcançar dois objetivos: primeiro deixar você projetar diagramas UML
dentro do Eclipse e, em seguida, transformar esses diagramas UML em
programas ABAP.
€ Você não precisa ter nada instalado no sistema ABAP backend com o
produto Obeo; ele gera o código diretamente para o sistema ABAP
usando uma opção de menu em ABAP no Eclipse. Não é necessário
baixar e fazer upload.
€ No produto UMAP, os tipos surgem como INVÁLIDOS; na versão Obeo,
os TYPEs estão em branco, e você tem que preenchê-los você mesmo,
que não é o fim do mundo.
Espero que esta seção tenha lhe dado uma ideia de que tipo de plug-ins
são possíveis para o Eclipse que poderia facilitar sua vida de programação;
talvez você esteja até mesmo motivado a ler o documento de como fazer
mencionado no final deste capítulo e criar sua própria ferramenta.
1.5 Summary
Este capítulo abordou os fundamentos do ABAP no Eclipse ou, como a
SAP gosta de chamá-lo, Ferramentas de Desenvolvimento ABAP. Depois
de lê-lo, você deve entender o que pode fazer com o Eclipse e como ele
pode fazer coisas que o SE80 não pode.
Recommended Reading
€ SAP NetWeaver How-To Guide: SDK for the ABAP Development Tools:
http://scn.sap.com/docs/DOC-40668 (Wolfgang Wöhrle)