Você está na página 1de 66

ABAP/4

Apostila 1























Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


2
Introduo

SAP

Arquitetura do SAP ERP

Linguagem ABAP

Antes de comear

Mos a obra

Programao Abap

Modularizao

Dicionrio de dados

Tabelas internas

Programas on-line

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


3
Introduo

Este material tem como objetivo ajudar voc a dar os primeiros passos na linguagem Abap. Ele deve ser usado
junto a um curso regular de Abap, como material de suporte ao instrutor. imprescindvel que o aluno
disponha de um usurio em uma instalao SAP ERP ou Minisap, com direitos de desenvolvedor.

No faz parte deste material detalhes da linguagem ou sintaxe de comandos (com raras excees), que so
encontrados facilmente no help ou em vrios sites da internet.

No preciso conhecer o SAP ERP para este curso, mas algum conhecimento de lgica de programao
necessrio. Se voc no conhece lgica de programao e algoritmos, poder ter dificuldade em acompanhar
o curso.

Toda vez que encontrar um dos smbolos abaixo fixe bem os conceitos, pois ajudaro voc por todo o curso e
pouparo muitas dores de cabea nos programas que voc desenvolver:

Info: contm informaes importantes a respeito do tpico abordado, visando complementar ou clarear
a informao.

Dica: contm uma dica que normalmente no encontrada em material regular de abap ou SAP.

Cuidado!: contm informao que, se ignorada, traz grande prejuzo no desenvolvimento do programa



Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


4
SAP

SAP AG uma empresa alem de tecnologia de informao fundada em 1972, mais conhecida pelo seu
software de mesmo nome, o SAP ERP. R/3 (l-se erre 3) ou ECC so denominaes mais comuns do SAP
ERP e representam a identificao de uma verso.

O SAP ERP um sistema integrado de gesto empresarial, que procura contemplar a empresa como um todo.
Os processos de negcios so implantados em mdulos funcionais, interligados entre si. Principais mdulos:

MM - Material Management: gesto de materiais, compras, fornecedores;
SD - Sales and Distribution: vendas e distribuio, gerao de nota fiscal;
FI Financial: contabilidade, emisso de boletos;
PP - Production Planning: planejamento da produo;
HCM - Human Capital Management: recursos humanos, controle de ponto, folha de pagamento;
PS - Project System: controle e oramento de projetos;
CO Controlling: controle de custos;
WF - Work Flow: fluxo de documentos e aprovaes;
QM - Quality Management: controle de qualidade;
WM - Warehouse Management: gerenciamento de armazns
AM - Fixed Assed Management: controle de patrimnio;
PM - Plant Maintenance: manuteno de equipamentos;
BW - Business Warehouse: armazenamento e recuperao de informaes gerenciais;
PI - Process Integration: comunicao entre SAP ERP e outros sistemas, incluindo internet.

Nem todos os clientes instalam todos os mdulos, mas a grande maioria tem pelo menos MM, FI e SD. A SAP
muda constantemente as nomenclaturas das solues oferecidas. Ultimamente a SAP no tem feito referncia
a estes mdulos individualmente. Em vez disto dividiu o SAP ERP em 4 grupos: SAP ERP Financials, SAP
ERP Operations, SAP ERP Human Capital Management (HCM) e SAP ERP Corporate Services.

Para informaes atualizadas, consulte o site www.sap.com.br.

Arquitetura do SAP ERP

A SAP baseou a arquitetura do R/3 em um modelo de cliente/servidor em trs camadas.



O servidor de apresentao

O servidor de apresentao realmente um programa identificado como sapgui.exe. Normalmente, ele
instalado em uma estao de trabalho de usurio ou notebook. Para inici-lo, o usurio d um clique duplo em
um cone na rea de trabalho ou escolhe um caminho de menu. Quando iniciado, o servidor de apresentao
exibe os menus do SAP dentro de uma janela. Essa janela comumente conhecida como SAPGUI, interface
do usurio ou simplesmente interface. A interface aceita entrada do usurio na forma de pressionamentos de

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


5
tecla, cliques de mouse e teclas de funo e envia essas solicitaes ao servidor de aplicativo para serem
processadas. O servidor de aplicativo envia os resultados de volta SAPGUI que por sua vez formata a sada
a fim de exibi-la para o usurio.
O SAP fornece tambm o front-end atravs do navegador de internet, desde que a instalao tenha um
webserver configurado para tal.

O servidor de aplicativo

Um servidor de aplicativo um conjunto de executveis que interpreta coletivamente os programas Abap e
gerencia a entrada e a sada para eles. O servidor de aplicativo existe para interpretar programas Abap, e eles
somente so executados nesse servidor os programas no funcionam no servidor de apresentao (micro
desktop ou notebook). Um programa Abap pode iniciar um executvel no servidor de apresentao (SAPGUI),
mas um programa ABAP/4 no pode ser executado nele.
Se seu programa solicitar informaes do banco de dados, o servidor de aplicativo formatar a solicitao e a
enviar ao servidor de banco de dados.

O servidor SAP de banco de dados

O servidor de banco de dados um conjunto de executveis que aceita solicitaes de banco de dados do
servidor de aplicativo. Essas solicitaes so passadas para o SGDB (Sistema Gerenciador de Banco de
Dados). Exemplos: Oracle, Microsoft SQL, Progress. O SGDB envia os dados de volta ao servidor de banco de
dados, que ento passa as informaes novamente ao servidor de aplicativo. O servidor de aplicativo por sua
vez transfere essas informaes para seu programa Abap.

Linguagem ABAP

ABAP (Advanced Business Application Programming) uma linguagem de programao de alto nvel
desenvolvida pela SAP. Todos os mdulos funcionais citados acima foram desenvolvidos em ABAP.

Ela tem sintaxe semelhante ao cobol, e em 1999 com a verso R/3 4.5 passou a suportar programao
orientada a objetos.

Todos os programas de Abap residem dentro da base de dados do SAP. No so armazenados em arquivos
separados como programas Java ou C++.

Antes de comear

Vejamos alguns conceitos do SAP ERP necessrios para iniciar a programao abap:

1 - Client (ou mandante) de logon

O termo Cliente de logon no tem nada a ver com Client/Server completamente diferente. O cliente de
logon se refere ao nmero de 3 algarismos que o usurio digita no campo Client (mandante) na tela de logon.
Para facilitar a compreenso, podemos entender como mandante um local ou mquina onde executamos os
nossos programas ou armazenamos os nossos dados. Ao agrupamento de mandantes chamamos de
Instncia.

Em uma instalao SAP tpica temos pelo menos 3 mandantes: desenvolvimento, qualidade e produo. O
mandante de desenvolvimento (muitas vezes tratado com DEV, abreviatura de DEVelopment) o local onde
fazemos e testamos os nossos programas Abap. Aps a concluso do nosso programa, fazemos uma cpia
(chamado de transporte) para o mandante ou ambiente de qualidade (chamado tambm de QA ou QAS -
Quality Assurance). Neste ambiente o usurio e/ou analista funcional testa os nossos programas. Aps a
concluso dos testes, o usurio e/ou analista funcional faz um transporte para o mandante de produo.
neste ltimo onde esto localizados os dados reais da empresa.

2 Request (Change Request ou ordem de transporte)

Cada objeto desenvolvido por um consultor abap (programa, novas tabelas, formulrios e muitos outros) ou
cada configurao feita por um analista funcional pertence a uma Change request.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


6
A Request um documento que contm uma lista dos objetos que vamos copiar de um mandante a outro. Um
conjunto de requests agrupado em Pacote ou Classe de desenvolvimento.
Enquanto desenvolvido ou corrigido, cada objeto pertence somente a uma request.
O processo de cpia de objetos de um mandante a outro chamado de transporte. A primeira operao para
o transporte dos objetos de uma request a liberao: indicamos que nossas alteraes foram concludas e a
request fica fechada para incluses ou alteraes de objetos. Se for necessrio alterar ou incluir objetos
criamos outra request. O SAP armazena todas as requests e permite comparar as vrias verses de um
objeto.


3 Transao

Cada funcionalidade do SAP ERP pode ser acionada por uma opo no menu ou por um cdigo de transao.
O cdigo da transao digitado no topo da tela (campo comando, veja abaixo). Por exemplo, ao informar a
transao SE38 e teclar Enter, acionamos o editor de programas Abap.

Transaes mais usadas no desenvolvimento Abap:

SE38: editor de programa abap
SE37: editor de mdulos de funes
SE80: navegador de objetos abap (inclui editor)
SE11: dicionrio de dados (criao/manuteno de tabelas)
SE16 / SE16N: exibio de dados de tabelas
SE93: criao/alterao de transaes
SE71: criao/alterao de formulrios sapscript
SE09 / SE10: manuteno de requests
SMARTFORMS: criao/alterao de formulrios smartforms
SE24: editor de classes


4 Interface com o usurio





Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


7
A barra de ttulo: contm o ttulo da tela atual;
A barra de menu: o contedo da barra de menu altera-se a cada tela. Pesquisando os menus dentro
dele, voc pode descobrir todas as funes que so possveis na tela atual. Os menus Sistema e
Ajuda esto presentes em todas as telas e as opes deles nunca se alteram;
O campo Comando: aqui voc digita comandos ou transaes a serem executados. Por exemplo, voc
pode efetuar o logoff digitando /nex nesse campo e pressionando a tecla Enter;
A barra de ferramentas Standard: contm o campo Comando e uma srie de botes. Estes botes
nunca se alteraram na aparncia, posio ou funo, e estaro presentes todas as telas. Alguns deles
podem estar desabilitados dependendo da funcionalidade que estiver atualmente disponvel. Voc
usar muito o boto BACK (voltar): . Cada boto tem a sua tecla de atalho. A tecla de atalho do
boto BACK F3. Para descobrir qual a tecla de atalho de um boto, posicione o cursor do mouse
sobre ele e aguarde uma pequena janela de dica ser mostrada junto ao boto;
A barra de ferramentas de aplicao: altera-se a cada tela. Exibe os botes que do a voc acesso
rpido a itens de menu dessa tela. Este um dos locais onde o consultor Abap coloca novos botes;
A barra de status: exibe mensagens, o ID de sistema, o nmero de sesso, o nmero de cliente, o
indicador do modo inserir/sobrescrever e a hora/data atual.


5 BASIS

BASIS refere-se ao ncleo que suporta toda a operao do SAP ERP. Poderia ser considerado como o
sistema operacional do SAP ERP. A melhor analogia para BASIS : assim como temos o Windows para rodar
programas C++ ou Java, temos o BASIS para rodar os programas Abap. BASIS refere-se tambm ao
profissional que trabalha com este sistema operacional, cadastrando usurios, transportando requests,
copiando e criando mandantes e muitas outras coisas.

6 Programas Z, tabelas Z, soluo Z, objetos Z, relatrio Z....

A nomenclatura de tabelas e programas feitos pelo desenvolvedor abap, salvo raras excees, deve iniciar
com as letras Z ou Y. Por extenso, tudo o que no veio pronto do pacote SAP ERP chamado de Z:
programa Z, relatrio Z, tabela Z, soluo Z, dentre outros.

7 Dicionrio de dados

O dicionrio de dados armazena, dentre outras coisas, a definio de todas as tabelas usadas no SAP ERP.
Ele no armazena os dados das tabelas, mas as estruturas (campos e tipos de dados) das tabelas e outras
definies de tipos de dados, chamados elementos de dados e domnios.
Os dados so armazenados no banco de dados, ver o tpico Arquitetura do SAP ERP.


Mos a obra

1 - Acessando o SAP ERP

Para acessar a interface de usurio mostrada anteriormente, precisamos fazer o logon no sistema SAP ERP.
Acione o cone do SAP Logon na sua rea de trabalho:



Selecione o ambiente de desenvolvimento (DEV) e tecle Enter. Informe agora o Mandante, usurio e senha na
tela de logon:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


8


Como foi informado na introduo, imprescindvel que o aluno disponha de um usurio em uma instalao
SAP ERP ou Minisap, com direitos de desenvolvedor.

Primeiro programa

quase um folclore todo curso de linguagem de programao ter como primeiro programa o Hello world.
Para manter a tradio, faamos agora o nosso programa Hello world. Apesar de simples, os conceitos de
compilao, edio e ativao valero para todos os programas que voc desenvolver.

1 Digite no campo de comando SE38 e tecle Enter ou acione o
menu destacado na figura abaixo:


Info: apesar de podermos acessar as funcionalidades do SAP ERP
atravs de menus, muitas vezes usamos o cdigo da transao.
Neste caso, SE38 a transao do editor de programas do SAP ERP.

Dica: se alguma transao j estiver ativa na tela, voc pode digitar
/NSE38. O comando /N cancela a transao atual. Se no lugar de /N
voc digitar /O, outra janela ser aberta. A maioria das instalaes
SAP ERP aceitam no mximo 7 sesses (ou modos) abertos
simultaneamente.









2 Nome do programa: informe neste campo o nome ZPRIMEIROPROGRAMA e tecle F5 (criar).





Info: nomenclatura de programas DEVE iniciar com
a letra Z ou Y, pode conter letras, dgitos e travesso
(_). Programas on-line tem regra diferente, veja no
tpico Programas on-line.









Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


9


3 Informe agora o nome do programa, o tipo Executvel e tecle Gravar:




4 Na janela seguinte clique no boto Objeto local:



Info: todo objeto a ser criado pelo usurio precisa de uma
request ou deve ser gravado como Objeto local. Para
fins de treinamento, no necessrio informar um Pacote.
Se voc informar um pacote, ser necessrio informar
uma change request.





5 Digite agora uma linha conforme mostrado:

WRITE PRIMEIRO PROGRAMA.

- Digite o espao em branco aps o WRITE;
- Os literais do tipo caracter so delimitados por apstrofos ;
- Todo comando Abap termina com um ponto.



Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


10


6 Ativando e executando:

Clique no boto Ativar (ou tecle Ctrl+F3) e tecle F8. A tela mostrada abaixo deve aparecer:



Info: ativao significa deixar o objeto pronto para uso. No caso de programas a ativao tem 3
etapas: a) verificao de sintaxe; b) gerao de cdigo para execuo pela camada de aplicao; c)
gravao do cdigo digitado. Caso queira somente verificar a sintaxe, clique no boto ou tecle
Ctrl+F2. Todos os objetos criados pelo usurio devem ser ativados antes do uso.

Dica: use sempre a ativao (Ctrl+F3). Voc verifica a sintaxe e grava ao mesmo tempo. Se precisar
somente gravar o programa, clique no boto ou tecle Ctrl+S.

Se houve algum erro de sintaxe, voc ver a tela abaixo:




Erros de sintaxe mais comuns:

- Falta de ponto no final do comando;
- Falta de espao em branco separando o comando e os argumentos;
- Colocar aspas no lugar de apstrofos;
- Falta do apstrofo final delimitando o literal caracter.


Segundo programa

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


11

1 Navegue para a tela inicial do editor de programas, transao SE38;

2 Nome do programa: ZSEGUNDOPROGRAMA

3 Tipo do programa: Executvel

4 Digite o cdigo abaixo:

REPORT ZSEGUNDOPROGRAMA.

* Segundo programa do curso de abap

PARAMETERS P_NOME(20) TYPE C.
PARAMETERS P_IDADE TYPE I.


START-OF-SELECTION.

WRITE P_NOME.
WRITE P_IDADE.

Dica: use sempre a opo Pretty Printer (Shift + F1). Ao acion-la, o editor Abap identa o seu cdigo
e acerta as palavras reservadas para maisculas/minsculas. Veja a opo do menu Utilitrios >>>
Configuraes, na aba Editor Abap >>> Pretty Printer.

Depurao de programas

Se voc estiver visualizando o cdigo do programa, acione no menu Utilitrios >>> Ponto de parada >>>
Definir/Eliminar (Ctrl+Shift+F12) para marcar ou desmarcar um ponto de parada. O programa deve estar ativo
para esta operao.

Outra forma de marcar um ponto de parada (breakpoint) inserir a instruo BREAK xxxx, onde xxxx o
cdigo de usurio de logon. O processador Abap efetuar uma parada somente para o usurio indicado.

Dica: sempre elimine comandos BREAK ao concluir o seu programa. Este comando um recurso para
auxiliar nos testes.

Estando na tela de seleo, tecle /H e Enter no campo de comando. Esta operao ativar o debug e quando
voc pressionar Enter ou teclar F8 a janela de debug aparecer.

Quando o debug estiver ativado, voc ver uma seta esquerda da linha que ser executada:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


12


Para continuar a execuo, voc pode teclar:

F5: executa uma instruo. Se a instruo for uma chamada de sub-rotina/mtodo/mdulo de funo, o debug
mostra a primeira instruo da sub-rotina e voc continua o debug DENTRO do cdigo da sub-rotina;

F6: executa uma instruo. Se a instruo for uma chamada de sub-rotina/mtodo/mdulo de funo, o debug
executa a sub-rotina/mtodo/mdulo de funo, mas NO EXIBE o cdigo da sub-rotina/mtodo/mdulo de
funo na janela de debug;

F7: executa TODAS instrues desde o ponto de parada at o final da sub-rotina/mtodo/mdulo de funo,
parando a execuo do programa na primeira instruo aps a chamada;

F8: executa todas as instrues a partir do ponto de parada atual, at encontrar um ponto de parada ou
instruo BREAK. No havendo estas instrues, executa o programa at uma exibio de tela ou
encerramento do programa.



Tipos de programas

Nos dois exemplos acima voc informou Executvel para o tipo de programa. Percebeu tambm que este tipo
de programa inclui o comando REPORT automaticamente como primeira linha do programa. Vejamos os tipos
de programa mais comuns:

REPORT (executvel): apesar do nome, no usado somente para emisso de relatrios. Este tipo de
programa normalmente usado quando temos um processamento na sequncia abaixo:

1 - Tela de seleo
2 Processamento: recuperao ou gravao de informaes em tabelas
3 Emisso de relatrio em tela e/ou spool

Pode no haver um ou mais dos passos acima. um dos tipos mais usados. No recomendado quando
temos vrias telas de interao com o usurio.

MODULE-POOL (tambm chamado de on-line ou pool de mdulos): usado quando precisamos montar telas
mais elaboradas e com grande interao com o usurio.


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


13
INCLUDE: no necessariamente um programa, mas uma forma de modularizao. Um programa do tipo
INCLUDE contm um trecho de cdigo para ser inserido dentro de outro programa. No pode ser executado
individualmente.

FUNCTION GROUP: como o nome diz, um programa do tipo FUNCTION GROUP agrupa um ou mais mdulos
de funo Abap (outra forma de modularizao).

POOL DE SUB-ROTINAS: conjunto de sub-rotinas. No pode ser executado individualmente.

POOL DE TIPOS: semelhante ao INCLUDE, contm definies de tipos de dados.


Programao Abap

Cada programa do Abap composto de uma ou mais instrues. Cada instruo contm uma variedade de
palavras separadas por pelo menos um espao. A primeira palavra de uma instruo a palavra-chave. Uma
instruo pode incluir uma ou mais adies e sempre termina com um ponto.

Definindo variveis

Use a instruo DATA para declarar variveis no programa. Um nome de varivel pode ter no mximo 30
caracteres, conter letras, dgitos e travesso (_). O nome no pode iniciar por um dgito (0-9). O interpretador
Abap no diferencia letras maisculas de letras minsculas. Exemplos:

DATA V_CONTADOR TYPE I VALUE 5. Tipo inteiro, inicializado com o valor 5

DATA ENDERECO_CLIENTE(40) TYPE C. Varivel de 50 posies caracter

DATA DT_NASC TYPE D. Varivel do tipo data. Os valores so armazenados na
forma AAAAMMDD (Ano, ms e dia)

DATA: CODIGO_EMPRESA TYPE SFLIGHT-CARRID. Varivel do mesmo tipo do campo CARRID da
tabela SFLIGHT.

Dica: no economize clareza ao definir um nome de varivel. Se precisar de um contador de registros
processados, nomeie a varivel como V_CONTADOR_REG_PROC ou V_CONT_REGISTROS_PROC
e no simplesmente V_CONT. A m escolha em nomes de variveis uma das maiores vils para
manuteno de programas.

Tipos de dados pr-definidos:

Tipo de
Dados
Significado Valor Inicial Tamanho
default
Tamanho
Permitido
P Nmero Packed 0 8 1-16
I Inteiro 0 4 4
F Float(ponto flutuante) 0.000 8 8
N Texto Numrico 00...0 1 1-max
C Caracter Branco(vazio) 1 1-max
D Data(YYYYMMDD) 00000000 8 8
T Hora(HHMMSS) 000000 6 6
X Hexadecimal X00 1 1-max

Os tipos numricos P,I e F tem as seguintes caractersticas e regio de valores:

Tipo de
Dados
Significado Faixa de trabalho Utilizao
I Inteiro -2
31
a +2
31
Contadores, quantidades, ndices,
perodo de tempo.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


14
P Nmero com Casas
decimais
2 caracteres por
bytes
Quantias em dinheiro, tamanho,
largura.
F Ponto Flutuante -,2E
308
a +1,8E
308
Clculo em larga escala, cientficos.

Utilize inteiros para variveis que sero envolvidas em clculos simples ou quando nenhum ponto decimal for
exigido. Variveis como contadores, ndices, posies ou deslocamentos so bons exemplos.
Uma varivel decimal armazena (L*2) 1 dgitos, onde L o comprimento da varivel em bytes. Valores
decimais so armazenados em dois dgitos por byte, exceto o byte final, que contm um nico dgito e um
sinal. O prprio ponto decimal no armazenado; um atributo da definio.
Variveis de ponto flutuante so sempre aproximadas. Elas podem ser utilizadas para clculos que exigem
valores muito grandes ou muitos espaos decimais. A preciso de at 15 espaos decimais possvel, mas
isso dependente de hardware.

Info: ateno para o tipo de dado N. Este tipo de dado NO numrico. Ele um tipo caracter, mas
armazena somente os dgitos de 0 a 9. Evite usar este tipo para operaes aritmticas.
Dica: sempre que possvel, declare variveis com referncia a algum elemento do dicionrio de dados
(campos de tabelas ou estruturas, elemento de dados).


Definindo comentrios

Coloque * (asterisco) na primeira coluna ou (aspas). As aspas podem ser colocadas em qualquer posio da
linha. Neste caso, todo o contedo aps as aspas so consideradas comentrios.

Dica: um programa bem comentado evita muitas dores de cabea futuras e auxilia muito em
manutenes do programa. Tome por hbito comentar bem os programas.

Definindo literais

Um literal um objeto de dados no modificvel. Ele interpretado literalmente pelo compilador abap, ou
seja, exatamente como escrito. Os literais podem aparecer em qualquer lugar em um programa e eles so
definidos meramente sendo digitados onde necessrio. H quatro tipos: string de caractere (entre apstrofos),
numrico, de ponto flutuante e hexadecimal.

Exemplos:

JOO
234
21.3

Definindo constantes

A declarao de constantes semelhante declarao de variveis. Use a palavra reservada CONSTANTS
no lugar de DATA:

CONSTANTS: LARGURA_RELAT TYPE I VALUE 100.
CONSTANTS: con_tab TYPE x VALUE '09'. Constante hexadecimal

Agrupamento de argumentos

Se h 2 ou mais comandos do mesmo tipo, no necessrio escrever a declarao mais de uma vez. Basta
colocar : (dois pontos) e separar os argumentos com vrgula. O ltimo comando deve ter um ponto no final.
As declaraes de variveis do exemplo acima podem ser escritas assim:

DATA: V_CONTADOR TYPE I, Tipo inteiro
ENDERECO_CLIENTE(40) TYPE C, Varivel de 50 posies caracter
DT_NASC TYPE D, Varivel do tipo data
CODIGO_EMPRESA TYPE SFLIGHT-CARRID. Varivel do mesmo tipo do campo CARRID da
tabela SFLIGHT


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


15
Se voc no especificar o tipo do campo, por default ser caractere. Se voc no definir o tamanho do campo
e o mesmo for C ou N, por default ter o tamanho de 1 (um).

Dica: evite omitir o tipo e tamanho da varivel. Mesmo que seja caracter de tamanho 1, deixe isto
explcito no seu cdigo: DATA V_FLAG(1) TYPE C.


Variveis estruturadas

A declarao abaixo cria uma varivel estruturada ou campo estruturado:

DATA: BEGIN OF WA_NOTA_FISCAL,
CLIENTE(20) TYPE C,
EMISSAO TYPE D,
VALOR(10) TYPE P DECIMALS 2,
IMPOSTO(10) TYPE P DECIMALS 2,
END OF WA_NOTA_FISCAL.

Info: ao analisar programas standard e mesmo programas Z, muito comum encontrar nomes de
variveis estruturadas iniciando por WA_. Estas iniciais indicam rea de Trabalho (Work Area).

Para fazer referncia a qualquer elemento da varivel estruturada, use o nome seguido de hfen e seguido do
elemento, sem espaos em branco entre eles. Assim WA_NOTA_FISCAL-VALOR refere-se ao elemento
VALOR da varivel estruturada WA_NOTA_FISCAL.

Info: uma forma muito usada de declarar variveis estruturadas a referncia a objetos do dicionrio
de dados do SAP ERP. A declarao DATA WA_FORNEC TYPE LFA1. cria uma varivel
estruturada com a mesma estrutura da tabela LFA1. A declarao TABLES tambm cria variveis
estruturadas. Muitos programadores abap entendem erroneamente que se vou usar uma tabela no
meu programa preciso da declarao TABLES. A declarao TABLES somente cria uma varivel
estruturada de mesmo nome da tabela do dicionrio.

Variveis pr-definidas ou variveis de sistema

A linguagem Abap contm uma varivel estruturada com vrios elementos que so atualizados medida que
os comandos so executados. Ela tem o nome SYST ou SY. Veja alguns exemplos:

SY-DATUM: data atual
SY-UZEIT: hora atual
SY-UNAME: cdigo do usurio que est logado
SY-LANGU: idioma de logon
SY-INDEX: nmero inteiro representando a iterao de um loop
SY-SUBRC: status de uma leitura de tabela de banco de dados e outros comandos
SY-TABIX: posio de linha na ltima operao em uma tabela interna

Info: a varivel SY-SUBRC a mais usada e mais importante.

Inicializando variveis

Voc usa o comando CLEAR para inicializar uma varivel. Uma varivel ao ser inicializada conter o seu valor
inicial conforme tabela de tipos de variveis mostrada anteriormente (valor inicial).

CLEAR: NOME, DT_NASCIMENTO, SOMA.

CLEAR: WA_NOTA_FISCAL.

O comando CLEAR em uma varivel estruturada inicializa todos os elementos.

Atribuindo valores


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


16
H 2 formas de atribuio:

MOVE <dado1> TO <dado2>.

ou

Varriavel1 = Valor1.

Exemplos:

V_CONTADOR = V_CONTADOR + 1.

Move rua alabastro, 34 to ENDERECO_CLIENTE.

WA_NOTA_FISCAL-EMISSAO = SY-DATUM.

DT_NASCIMENTO = 19780319. Atribuio de um literal com o valor de uma data

Info: usamos tambm o comando WRITE para atribuir valores e formatar a sada. O comando WRITE
DT_NASC TO V_SAIDA. atribui o valor de data (p.ex. 19871008) a uma varivel caracter. Aps o
comando, a varivel V_SAIDA ter o valor 08/10/1987.

Clculos aritmticos

Voc pode executar clculos utilizando as seguintes instrues:

Operador Operao
+ Adio
- Subtrao
* Multiplicao
/ Diviso
** Exponenciao
DIV Diviso de inteiro
MOD Resto da diviso de inteiro

Converses de dados
Se duas variveis tiverem tipos de dados ou comprimentos diferentes, os dados sero convertidos quando
movidos.
Se os comprimentos das variveis de envio e de recebimento no corresponderem, uma adaptao automtica
do comprimento ser executada.
Se os tipos de dados no corresponderem, uma adaptao automtica de tipo ser executada.

Tipo Quando atribuir para um campo maior,
o valor from ser:
Quando atribuir para um campo menor, o
valor from ser:
C Preenchido direita com espaos em
branco
Truncando direita
X Preenchido direita com zeros Truncado direita
N Preenchido esquerda com zeros Truncado esquerda
P Preenchido esquerda com zeros Atribudo se o valor numrico se adequar ao
campo to.
Se o valor numrico for grande demais para
o campo de recebimento, ocorrer um erro
de execuo

SubCampos

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


17
A parte de um campo referenciada pela especificao de um deslocamento e/ou comprimento denominado
subcampo.

V_EMPRESA = ESTRADA REAL.

WRITE:/ V_EMPRESA+1(4). Ser impresso STRA a numerao inicia em 0 (zero)

Info: variveis do tipo D so armazenadas no formato AAAAMMDD (ano, ms, dia). Portanto,
podemos fazer a referncia V_DATA+4(2) para obter o ms.

Clculo com datas
Uma varivel de data (tipo d) pode ser utilizada dentro de expresses matemticas. Podemos somar ou
subtrair valores inteiros (dias), bem como encontrar a diferena entre duas datas. O resultado da diferena
entre duas datas ser sempre uma quantidade de dias.

DATA: V_HOJE TYPE D,
V_AMANHA TYPE D.

V_AMANHA = V_HOJE + 1.

Definindo tipos
Voc pode definir seus prprios tipos de dados utilizando a instruo TYPES.

TYPES TY_NASCIMENTO TYPE D.

DATA: NASCIMEN TYPE TY_NASCIMENTO.

A utilizao de tipos torna seu cdigo mais claro e mais fcil de ler. Ele no armazena dados, somente
utilizado para criar outras variveis. As mesmas regras usadas para nomear variveis se aplicam aos tipos.
Tipos estruturados tambm so permitidos. A utilizao de tipos estruturados pode reduzir a redundncia e
torna mais fcil a manuteno do programa.

Exemplo:

TYPES: BEGIN OF Y_LANCTO,
DATA TYPE D,
CONTA_CONTABIL TYPE CSKS-HKONT,
VALOR(12) TYPE P DECIMALS 2,
END OF Y_LANCTO.

DATA: WA_LANCTO TYPE Y_LANCTO.

Grupos de tipos

Uma instruo TYPES pode ser armazenada em um grupo de tipos. Um grupo de tipos (tambm conhecido
como um pool de tipos) corresponde a um objeto do dicionrio que existe meramente para conter uma ou mais
instrues TYPES ou CONSTANTS. Utilizando a instruo TYPE-POOLS em seu programa, voc acessar
tipos ou constantes a partir de um grupo de tipo e utilizar os mesmos em seu programa. Muitos programas
podem compartilhar um grupo de tipo, proporcionando a voc a habilidade de criar definies centralizadas.

Exemplo:

TYPE-POOLS ICON.

Operadores Lgicos

Operador Significado

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


18
EQ = Igual
NE <> >< Diferente
GT > Maior que
GE >= => Maior ou igual a
LT < Menor que
LE <=
=<
Menor ou igual a
BETWEEN f1 and f2 Intervalo
IS INITIAL Valor inicial
AND E
OR Ou
NOT Negao

Instrues de controle comuns

Instruo IF

A instruo IF no Abap tem operadores relacionais para igualdade e desigualdade e operadores relacionais
especiais para comparaes de string.

IF V_SALARIO > VALOR_BASE. Pode ser escrito tambm IF V_SALARIO GT VALOR_BASE
Comandos....
ELSE.
Comandos....
ENDIF..


IF V_SALARIO > VALOR_BASE.
Comandos....
ELSEIF V_SALARIO > VALOR_MINIMO.
Comandos....
ELSEIF V_SALARIO > VALOR_RESIDUAL.
Comandos....
ENDIF.

Dica: sempre use a clusula INITIAL para testar se uma varivel est vazia. Procedendo assim voc
no precisa se preocupar quanto ao tipo e tamanho da varivel.

Operadores de caractere
Os operadores especiais para as strings de caractere so mostrados abaixo:

Operador Significa Verdadeiro quando H distino entre
maisculo e
minsculo.
Os espaos
em branco
finais so
ignorados.
V1 CO v2 Contm somente V1 for composto somente de
caracteres em v2
Sim No
V1 CN v2 Not v1 CO v2 V1 pode conter caracteres que
no esto em v2
Sim No
V1 CA v2 Contm qualquer V1 pode conter pelo menos um
caractere em v2
Sim No
V1 NA v2 Not v1 ca v2 V1 no pode conter nenhum
caractere em v
Sim No
V1 CS v2 Contm string V1 pode conter a string de
caractere em v2
No Sim
V1 NS v2 Not v1 CS v2 V1 no pode conter a string de
caractere em v2
No Sim

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


19
V1 CP v2 Contm padro V1 pode conter o padro em v2 No Sim
V1 NP v2 Not v1 CP v2 V1 no pode conter o padro
em v2
No sim

Esses operadores podem ser utilizados em qualquer expresso de comparao. Os operadores CS, NS, CP e
NP ignoram os espaos em branco finais e no distinguem maisculas de minsculas.
Instruo CASE
A instruo CASE executa uma srie de comparaes:

CASE OK_CODE.
WHEN SALVAR.
Comandos
WHEN IMPRIMIR
Comandos
WHEN EXLCUIR
Comandos
WHEN OTHERS
Comandos
ENDCASE.

Somente as instrues aps a primeira correspondncia WHEN sero executadas.

Comandos entre o WHEN OTHERS e ENDCASE sero executados se nenhuma condio anterior for
atendida.
Se WHEN OTHERS no estiver codificada e nenhuma condio for satisfeita, o processamento continuar
com a primeira instruo aps ENDCASE.

As expresses lgicas no so permitidas no comando CASE, como WHEN OK_CODE <> INCLUIR.

Case muito semelhante a if/elseif. A nica diferena que em todos os if/elseif, voc pode especificar uma
expresso complexa. Com case, voc pode especificar somente um nico valor a ser comparado e os valores
so sempre comparados quanto igualdade.

Instruo EXIT

A instruo EXIT impede que processamentos posteriores ocorram. Ela pode ser utilizada em vrias situaes
e seu efeito depende do local onde aparece no cdigo. Entretanto, ela sempre impede processamentos
posteriores. Dentro de estruturas de loop, select..endselect, do...enddo e while ela fora o encerramento do
loop.
Dentro de sub-rotinas, fora o encerramento do processamento da sub-rotinas.

Cuidado!: muita ateno ao usar o comando EXIT dentro de trechos de cdigos inseridos com o
comando INCLUDE. O comando INCLUDE somente copia o cdigo dentro de um trecho de programa.
No existe o conceito do uso do EXIT para sair do INCLUDE. Veremos o comando include mais
adiante.

Instruo DO

A instruo DO corresponde a um mecanismo de loop bsico.

DO 5 TIMES.
Comandos....
ENDDO.

Contador = 8.
DO Contador TIMES.
PERFORM IMPRIME_UMA_COPIA.
ENDDO.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


20

Dentro do loop, SY-INDEX contem o nmero da iterao atual. A primeira vez que o processamento entrar no
DO, o valor de SY-INDEX ser 1. A segunda vez, SY-INDEX ser 2 e assim por diante.

Instruo WHILE

A instruo WHILE corresponde a um mecanismo de loop semelhante ao DO, mas o encerramento do loop
ocorre quando a expresso a frente do WHILE fica falsa.

WHILE VC_CONTADOR <= 10.
Comandos...
ADD 1 TO CONTADOR.
ENDWHILE.

Instruo CONTINUE

A instruo CONTINUE inserida sempre dentro de um loop. Ela atua como um desvio para o incio do loop e
comea uma nova passagem de loop. Na verdade, faz com que as instrues abaixo dela, dentro do loop,
sejam ignoradas e uma nova passagem de loop comece.

LOOP AT T_CLIENTE.

IF T_CLIENTE-VALOR < 10.
CONTINUE.
ENDIF.
ENDLOOP.

Utilizando a instruo CHECK

A instruo CHECK codificada dentro de um loop. Ela atua como um CONTINUE condicional. Se a
condio for falsa, um CONTINUE executado.

WHILE V_FLAG IS INITIAL.

CHECK SY-SUBRC = 0.

ENDWHILE.

A instruo CHECK pode aparecer tambm dentro de uma sub-rotina: se a condio for falsa, o
processamento da rotina encerrado.

Comparando as instrues EXIT, CONTINUE e CHECK

Instruo Efeito
Exit Sai do loop atual ou sub-rotina atual
Continue Faz um salto incondicional para o final do loop
Check exp Saltar para o final do loop se exp for falso.


Modularizao

Unidades de modularizao no ABAP/4

Uma unidade de modularizao permite voc separar um grupo de linhas de cdigo do restante e ento
execut-las em um tempo especifico. As linhas de cdigo dentro de uma unidade de modularizao
comportam-se de maneira muito semelhante a um mini-programa que pode ser chamado de outro programa.

A modularizao usada com 2 objetivos principais:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


21
1 Clareza para leitura do cdigo
2 Evitar repetio de cdigo

O Abap oferece as seguintes opes de modularizao:

a) Eventos
b) Sub-rotinas
c) Mdulo de funo
d) Include
e) Mtodo
f) Chamada de outro programa

Utilize as unidades de modularizao para eliminar o cdigo redundante dentro de seu programa e para torn-
lo mais fcil de ler. Por exemplo, suponha que voc tenha uma srie de instrues que formatam um endereo
e precise formatar endereos em vrios lugares diferentes em seu programa. Em vez de duplicar o cdigo
dentro de seu programa, uma boa ideia colocar esse cdigo em uma unidade de modularizao e cham-lo
sempre que voc precisar formatar um endereo.

a) Eventos

Na execuo de um programa do tipo report ocorrem vrios eventos. Para aproveitar este recurso, escrevemos
no programa o nome do evento e colocamos comandos que gostaramos de executar na ocorrncia daquele
evento. Alguns eventos de um programa do tipo report so:

INITIALIZATION: ocorre logo que o programa executado;
AT SELECTION-SCREEN: ocorre ao teclar Enter, F8 ou outro comando na tela de seleo;
START-OF-SELECTION: aps teclar F8 e logo aps o AT SELECTION-SCREEN;
END-OF-SELECTION: aps o ltimo comando do evento START-OF-SELECTION;
TOP-OF-PAGE: ocorre no incio de impresso de uma pgina;
END-OF-PAGE: ocorre no incio da impresso do rodap da pgina.

Os nomes de evento so palavras reservadas. Voc no pode criar novos eventos somente pode utilizar os
existentes. Um evento termina quando o nome de um outro evento encontrado.

Um programa report executado na seguinte seqncia:

1 O evento INITIALIZATION acionado, se voc escreveu este evento no programa;
2 A tela de seleo mostrada. Se seu programa no tiver uma tela de seleo, ele pular esse passo. Se
houver um evento AT SELECTION-SCREEN OUTPUT os comandos dentro dele sero executados;
3 O evento AT SELECTION-SCREEN acionado;
4 O evento START-OF-SELECTION executado (aps teclar F8);
5 O evento END-OF-SELECTION executado.

Voc pode codificar os eventos em qualquer ordem e a ordem de execuo ainda ser a mesma. Se voc
colocar o evento END-OF-SELECTION no incio do programa, ele ainda ser executado em ltimo lugar.

Normalmente interessante posicionar os eventos na ordem em que eles so acionados para deixar o
programa mais fcil de entender.

Se a primeira instruo executvel em seu programa no for precedida por um nome de evento, em tempo de
execuo o sistema automaticamente insere START-OF-SELECTION antes da primeira linha de cdigo
executvel. Portanto, se voc no tiver quaisquer eventos codificados, ou se no tiver colocado cdigo na
parte superior do programa sem atribuir nomes a um evento, START-OF-SELECION inserido. Isto foi feito no
nosso primeiro programa, na seo Mos a obra.

Info: voc no deve colocar definies de dados dentro de eventos. Embora isso no cause um erro
de sintaxe, trata-se de um estilo de programao pobre. Todas as definies de dados ficam melhor
na parte superior do programa (definies globais consulte a modularizao com sub-rotinas, mais
adiante).

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


22
Cada evento tem um propsito especfico e necessrio realizar uma tarefa de programao
especfica. Se voc no vir quaisquer eventos em um programa, lembre-se de que ainda existe um
START-OF-SELECTION.

Saindo de um evento

Voc pode sair de um evento a qualquer hora utilizando as seguintes instrues: EXIT, CHECK, STOP ou
RETURN.

b) Sub-rotinas

Uma sub-rotina uma seo de cdigo reutilizvel. como uma mini-programa que pode ser chamado de
outro ponto em seu programa ou mesmo de outros programas. Dentro dele voc pode definir variveis,
executar instrues, computar resultados e escrever sada. Para definir uma sub-rotina, utilize a instruo
FORM para indicar o incio de uma sub-rotina e utilize ENDFORM para indicar o seu fim. O nome de uma sub-
rotina no pode exceder 30 caracteres. Para chamar uma sub-rotina, utilize a instruo PERFORM.

Info: uma das principais caractersticas de um bom programa uma boa modularizao. Ela traz
clareza ao cdigo e facilidade de manuteno. Se voc define uma rotina com o nome
CALCULA_PESO_LIQUIDO, outro programador ter facilidade de fazer manuteno em seu
programa.

Definindo e chamando sub-rotinas internas

As definies de sub-rotina normalmente so colocadas no fim do programa, depois de todos os eventos. A
instruo FORM define o fim do evento precedente e o comeo de uma sub-rotina. As sub-rotinas no podem
ser aninhadas no interior de eventos.

Sintaxe de definio:

FORM S tables t1 t2 ....]
[using u1 value(u2) .]
[changing c1 value(c2) .]
.
ENDFORM.

Onde:

S: o nome da sub-rotina.
T1, t2, u1, u2, c1 e c2: parmetros.
Value indica que a passagem de parmetro feita por valor (a varivel no alterada)

TABLES permite que as tabelas internas sejam passadas como parmetros. VALUE no pode ser
utilizada depois de TABLES.
Quando so codificadas, a ordem dos nomes TABLES, USING e CHANGING devem aparecer na
ordem mostrada e se podem aparecer somente uma vez. No pode haver 2 USING.
No utilize vrgulas para separar parmetros.
TABLES somente permite que tabelas internas sejam passadas no tabelas de banco de dados.
Uma sub-rotina pode chamar outra sub-rotina.
A recurso suportada. Uma sub-rotina pode chamar a si mesma ou uma sub-rotina que a chama de
volta.
As definies de sub-rotina no podem ser aninhadas: voc no pode definir uma sub-rotina dentro de
outra.

Sintaxe de chamada:

PERFORM sub [tables t1 t2 .]
[using u1 u2 ]
[changing c1 c2 ].

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


23

Onde:
sub: nome da sub-rotina.
T1, t2, u1, u2, c1, c2: parmetros

Deixando uma sub-rotina

Voc pode sair de uma sub-rotina a qualquer hora utilizando EXIT, CHECK, STOP ou RETURN.

Definindo variveis locais e globais

Uma varivel global aquela que definida fora de uma sub-rotina utilizando a instruo DATA. Ela pode ser
acessada de qualquer ponto no programa, seja dentro de um evento ou dentro de uma sub-rotina. boa
prtica de programao colocar definies de variveis globais na parte superior do programa, em algum lugar
antes da primeira linha de cdigo executvel.

Uma varivel definida dentro de uma sub-rotina utilizando as instrues DATA ou STATICS. Dizemos que ela
local sub-rotina. As variveis definidas utilizando DATA ou STATICS no so visveis fora da sub-rotina.

Para variveis locais definidas utilizando DATA, a memria alocada toda vez que a sub-rotina chamada.
Essa memria liberada quando a memria retirada.

Dica: se voc vai usar a varivel somente dentro de uma sub-rotina, use a declarao DATA dentro da
sub-rotina. Procedendo assim voc evita alocar memria desnecessariamente e aumenta a
reusabilidade da sua rotina em outros programas. Imagine que voc vai montar uma sub-rotina e
lembrou que j fez algo parecido em outro programa. Se no outro programa voc tomou o cuidado de
tornar a rotina o mais independente possvel, ser mais fcil aproveitar esta rotina.

Dica: use o prefixo L_ ou VL_ para indicar que uma varivel local.


Definindo uma rea de trabalho TABLES

As variveis definidas que utilizam a instruo TABLES so sempre globais. Colocar a instruo TABLES na
parte superior de um programa define uma varivel estruturada global. Colocar a mesma instruo dentro de
uma sub-rotina tambm define uma varivel global desse nome. Portanto, voc no deve utilizar a instruo
TABLES dentro de uma sub-rotina, uma vez que a definio sempre global; essas definies globais devem
ser colocadas na parte superior do programa.
Para definir uma rea de trabalho de tabelas local dentro de uma sub-rotina, utilize DATA em vez da instruo
TABLES.
Lembre que no necessrio o uso de TABLES para manipular tabelas do banco de dados.

Definindo dados

As variveis definidas pela instruo DATA na parte superior do programa so globais. As definies de DATA
dentro de uma sub-rotina so locais para a sub-rotina. A memria alocada para essas variveis quando a
sub-rotina chamada e liberada quando ela retorna. Os valores nessas variveis sero perdidos quando a
sub-rotina retornar.
Utilize a instruo STATICS para criar variveis locais que no sejam libertadas quando a sub-rotina termina. A
sintaxe para STATICS a mesma que a sintaxe para a instruo DATA. A memria para uma varivel esttica
alocada na primeira vez que a sub-rotina chamada e retida quando a sub-rotina termina. Entretanto, uma
varivel esttica visvel somente de dentro da prpria sub-rotina, e no de dentro de sub-rotinas iniciadas por
ela. Da prxima vez que a sub-rotina for chamada, a memria para essa varivel torna-se visvel novamente. O
valor dentro dela ser o mesmo de quando voc tiver retornado dessa sub-rotina da ltima vez.
A memria de uma varivel esttica pertence sub-rotina que a alocou; essa varivel no visvel a partir de
outras sub-rotinas. Se voc alocar uma varivel esttica do mesmo nome em mltiplas sub-rotinas, essas
sero variveis separadas com sua prpria memria e seus prprios valores.

Passando parmetros


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


24
Alm de definir variveis utilizando TABLES, DATA e STATICS, tambm podem ser definidas variveis na
prpria instruo FORM. Estas so conhecidas como parmetros, que podem ser locais ou referncias para
variveis globais. A memria de parmetros locais alocada quando a sub-rotina chamada e liberada
quando finalizada.
Se voc definir variveis na instruo FORM, a instruo PERFORM deve passar um valor para cada uma
dessas variveis.

Criando parmetros com definio de tipo

Os parmetros de uma sub-rotina podem ter ou no definio de tipos. Parmetros sem definio de tipo
permitem que voc passe uma varivel de qualquer tipo de dado ou comprimento para ele. Parmetros com
definio de tipo exigem que a varivel passada seja do mesmo tipo e tamanho

1 Parmetro sem tipo

FORM BUSCA_FORNECEDOR USING P_CODIGO.
.....
ENDFORM.

2 Parmetro com tipo

FORM BUSCA_FORNECEDOR USING P_CODIGO TYPE LFA1-LIFNR.
.....
ENDFORM.

Os parmetros com tipo so mais eficientes. necessrio menos CPU a fim de alocar memria e ajudam a
prevenir erros de codificao. J que voc no pode passar um parmetro de tipo incompatvel, o verificador
de sintaxe indicar o erro para voc se tentar passar um parmetro incompatvel.

Passando estrutura

Voc pode passar uma estrutura da mesma maneira que qualquer outro parmetro. Entretanto, se voc quiser
acessar os componentes da string de campo dentro da sub-rotina, voc deve fazer a estrutura ficar conhecida
para a sub-rotina, por meio de uma destas duas adies instruo FORM:

LIKE x
STRUCTURE x

Aqui, x pode ser uma estrutura definida no programa ou uma estrutura/tabela do dicionrio de dados.

Controlando como os parmetros so passados

As maneiras mais usadas para os parmetros para uma sub-rotina so:

Passar por referncia
Passar por valor

A sintaxe na instruo FORM determina como as variveis so passadas. A sintaxe em PERFORM no faz
isso.

Using v1 Passe por referncia
Changing v1 Passe por referncia
Using value(v1) Passe por valor

Lembre-se:

- PERFORM e FORM devem conter o mesmo nmero de parmetros.
- A sintaxe na instruo FORM determina apenas o mtodo pelo qual um parmetro passado.
- A adio VALUE() no pode ser utilizada na instruo PERFORM.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


25
- USING deve vir antes de CHANGING.
- A adio USING s pode ocorrer uma vez em uma instruo. A mesma regra se aplica a CHANGING.

Utilizando os mtodos de passagem de parmetros

Mtodo Descrio Vantagens
Por referncia Passa um ponteiro para a posio de memria
original
Muito eficiente
Por valor Aloca uma nova posio de memria para
utilizao dentro da sub-rotina. A memria
liberada quando a sub-rotina termina
Impede alteraes na varivel
passada.

Passando parmetros por referncia

Quando voc passa um parmetro por referncia, a nova memria no alocada para o valor. Em vez disso,
um ponteiro para a posio original da memria passado. Todas as referncias para o parmetro so
referncias para posio original da memria. Alteraes na varivel dentro da sub-rotina atualizam a posio
original da memria imediatamente.
Com sub-rotinas internas (definidas no mesmo programa), h pouca diferena entre passar parmetros por
referncia e acessar variveis globais de dentro da sub-rotina. Ambos permitem que voc altere o valor de uma
varivel global diretamente. Nas sub-rotinas externas e mdulos de funo, a passagem por referncia mais
til. Mesmo assim, passar parmetros para uma sub-rotina seja ela interna ou externa um bom estilo de
programao, que torna a manuteno mais fcil e melhora a readaptabilidade de seu programa.
As duas adies USING f1 e CHANGING f1 passam f1 por referncia elas so idnticas na funo. A razo
para que as duas existam que utilizadas adequadamente podem documentar quando a sub-rotina
mudar um parmetro ou no.

Passando parmetros por valor

Quando voc passa um parmetro por valor, uma nova memria alocada para esse valor. Essa memria
alocada quando a sub-rotina chamada e liberada quando a sub-rotina retorna. Portanto, as referncias para o
parmetro so voltadas para uma nica rea da memria que conhecida apenas dentro da sub-rotina; a
posio original da memria est separada. O original est inalterado se voc alterar o valor do parmetro.
Utilize a passagem por valor, quando voc precisar de uma cpia local de uma varivel que possa ser alterada
sem afetar a original. A passagem por referncia mais eficiente que a passagem por valor. Utilize o mtodo
por referncia, a menos que voc precise de uma cpia local independente da varivel.


c) Mdulo de funo

O mdulo de funo semelhante a uma rotina externa e ser tratado em detalhes na apostila 2.

d) Include

J citado no tpico Tipos de programas: contm um trecho de definio ou cdigo a ser includo em um
programa. Exemplo:

REPORT ZLISTAFORNEC.

INCLUDE ZXUPDA01.

Quando da execuo do programa, o contedo da include ZXUPDA01 inserido dentro do report
ZLISTAFORNEC. Lembre-se: o INCLUDE apenas copia um trecho de cdigo para dentro de um programa.

e) Mtodo

Um mtodo semelhante a uma sub-rotina: ele representa um conjunto de comandos dentro do conceito de
programao orientada a objeto. A programao orientada a objetos no ser abordada neste material.


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


26
f) Chamada de outro programa

Um programa do tipo REPORT pode ser chamado de outro programa com a instruo SUBMIT. Esta forma de
modularizao usada somente em casos muito especficos.


Dicionrio de dados
Dicionrio de Dados (DDIC)
O Dicionrio de dados do SAP ERP (Data Dictionary DDIC) um utilitrio para definir objetos de dados. Com
o dicionrio de dados, voc pode criar e armazenar objetos como tabelas, estruturas e visualizaes. A
transao do dicionrio de dados a SE11:



O DDIC est dentro do SAP ERP. Voc pode pensar nele estando acima de um sistema gerenciador de banco
de dados (como Oracle ou Microsoft SQL) e agindo como um controle remoto, que envia instrues para os
bancos de dados. Por exemplo, voc pode criar uma definio de tabela no DDIC. Quando voc ativa a
definio de tabela, o DDIC envia os comando para o SGBD, fazendo com que ele crie a tabela real no banco
de dados. Quando quiser modificar a tabela, voc deve modificar a definio de tabela no DDIC. Quando ativar
a tabela novamente, mais SQL gerado, fazendo com que o SGBD modifique a tabela.


Info: uma confuso muito comum dos iniciantes no SAP ERP refere-se a diferena entre dicionrio de
dados e banco de dados. De uma maneira simplificada, podemos entender o dicionrio de dados do
SAP ERP como uma mscara para enxergar as tabelas do banco de dados real (Oracle, por exemplo).
Veja novamente no incio deste documento o tpico Arquitetura do SAP ERP.

No SAP ERP uma tabela uma coleo de linhas. Cada linha contm campos, tambm chamados de colunas.
Normalmente, dentro de uma tabela, cada linha tem o mesmo nmero de colunas, como as outras linhas da
tabela.
Uma tabela armazena dados persistentes. Em outras palavras, se voc coloca dados em uma tabela, eles
permanecem l depois que seu programa finalizar. Eles permanecero at serem alterados ou excludos por
seu programa ou outro.
O nome de uma tabela nico dentro do sistema SAP ERP inteiro. Quando voc olha uma tabela no DDIC,
est visualizando a descrio de uma tabela no banco de dados subjacente. Voc no est olhando
diretamente a prpria tabela de banco de dados.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


27
H no DDIC trs tipos de tabelas: Transparentes, Pool e Cluster. O primeiro tipo o mais comum e
provavelmente ser utilizado ao se criar uma nova tabela em customizaes do sistema. Pool e cluster so
tipos de armazenamentos proprietrios da SAP. Segue abaixo uma comparao entre os trs tipos de tabela:

Transparente: Uma tabela transparente no dicionrio tem relacionamento um-para-um com uma tabela no
banco de dados. Sua estrutura no dicionrio de dados do R/3 corresponde a uma nica tabela de banco de
dados. Para cada definio de tabela transparente no dicionrio, h uma tabela associada no banco de dados.
A tabela de banco de dados tem o mesmo nome, o mesmo nmero de campos e os campos tm os mesmos
nomes que a definio de tabela do SAP ERP. Quando examinar a definio de uma tabela transparente do
SAP ERP, voc pode achar que est olhando para a prpria tabela de banco de dados.

Pool: Uma tabela de pool tem um relacionamento muitos-para-um com uma tabela no banco de dados. Para
uma tabela no banco de dados, h muitas tabelas no dicionrio de dados do R/3. A tabela no banco de dados
tem um nome diferente do das tabelas no dicionrio de dados, tem um nmero de campos diferente e os
campos tambm tm nomes diferentes. O DDIC utiliza pools de tabela para armazenar um grande nmero
(dezenas a milhares) de tabelas muito pequenas (aproximadamente de 10 a 100 linhas cada uma). Os pools
de tabela reduzem a quantidade de recursos de banco de dados necessrios quando muitas tabelas pequenas
tm de ser abertas ao mesmo tempo.

Cluster: So utilizadas para armazenar dados de algumas (aproximadamente de 2 a 10) tabelas muito
grandes. As tabelas de cluster so utilizadas quando essas tabelas tivessem uma parte de suas chaves
primrias em comum e se os dados nessas tabelas fossem todos acessados simultaneamente. Os clusters de
tabela contm menos tabelas que os pools de tabela e, diferente dos pools de tabela, a chave primria de cada
tabela dentro do cluster de tabelas comea com o mesmo campo ou campos. As linhas das tabelas de cluster
so combinadas em uma nica linha no cluster de tabelas. As linhas so combinadas com base na parte da
chave primria que elas tm em comum. Assim, quando uma linha lida de qualquer uma das tabelas no
cluster, todas as linhas relacionadas em todas as tabelas de cluster tambm so recuperadas, mas apenas
uma nica operao de I/O necessria. Um cluster vantajoso no caso em que os dados so acessados a
partir de mltiplas tabelas simultaneamente e essas tabelas tm pelo menos um de seus campos de chave
primria em comum. As tabelas de cluster reduzem o nmero de leituras do banco de dados e assim melhoram
o desempenho.

As tabelas de pool e de cluster so normalmente utilizadas somente pela SAP e no pelos desenvolvimentos
dos clientes, provavelmente por causa do formato proprietrio dessas tabelas dentro do banco de dados e por
causa das restries tcnicas colocadas sobre sua utilizao dentro dos programas ABAP/4, como a seguir:

No se podem criar ndices secundrios;
No se pode utilizar SELECT DISTINCT ou GROUP BY;
No se pode utilizar SQL nativo;
No se podem especificar nomes de campos depois da clusula ORDER BY. A nica variao
permitida ORDER BY PRIMARY KEY;
No caso especfico das tabelas de cluster, no possvel realizar leitura atravs de JOIN, nem a
criao de VIEWS.

Explorando os componentes de tabela

Uma tabela composta de campos. Para criar um campo voc precisa de um elemento de dados. O elemento
de dados contm rtulos de campo e a documentao on-line (tambm chamada ajuda F1) para o campo. Ele
puramente descritivo; contm as caractersticas semnticas para o campo, tambm conhecidas como
contexto do negcio. Os rtulos que voc oferece dentro de um elemento de dados sero exibidos na tela ao
lado de um campo de entrada. O elemento de dados tambm contm documentao que exibida quando o
usurio pede ajuda nesse campo pressionando a tecla F1.
Uma definio de elemento de dados pode exigir um domnio. O domnio contm a caracterstica tcnica de
um campo, como o comprimento do campo e o tipo de dado.
Os domnios e os elementos de dados so reutilizveis. Um domnio pode ser utilizado em mais de um
elemento de dados, e um elemento de dados pode ser utilizado em mais de um campo e em mais de uma
tabela.
Por exemplo, imagine que voc precise projetar uma tabela de informaes de cliente chamada ZCLIENTE
que deve conter os nmeros de telefone comercial, fax e residencial.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


28
Para criar um campo, voc normalmente inicia criando um domnio para ele. Neste caso, voc pode criar um
domnio genrico de nmero de telefone, chamado ZFONE e dar a ele um tipo de dado de CHAR e um
comprimento de 12. Isso seria um domnio genrico de nmero de telefone; a maioria dos tipos de nmeros de
telefone poderia ser armazenada utilizando-se esse domnio.
Depois de criar o domnio para armazenar a descrio puramente tcnica de um campo, voc ento cria um
elemento de dados para armazenar os atributos descritivos do campo. No elemento de dados, voc deve
digitar o nome de um domnio para dar-lhe a caracterstica tcnica. Ento, voc insere os rtulos e a
documentao (ajuda F1) para descrever os dados que voc armazenar. Nesse exemplo, voc criaria trs
elementos de dados, um para cada nmero de telefone (residencial, comercial e fax). Em cada elemento de
dados, voc digita rtulos de campo descrevendo o tipo de nmero de telefone que voc armazenar com ele
e a ajuda F1 para o usurio final.
Tendo criado os elementos de dados, voc agora pode criar a tabela. Voc pode criar trs campos de nmero
de telefone na tabela (residencial, comercial e fax) e atribuir o elemento de dados correspondente a cada
campo. Um elemento de dados atribudo a cada campo. Isso oferece informaes descritivas do campo do
elemento de dados e informaes tcnicas do domnio a que ele faz referncia. Quando o campo utilizado
em uma tela, ele obtm um rtulo e a documentao de ajuda F1 do elemento de dados e seu comprimento e
tipo de dado formam o domnio dentro do elemento de dados.
Se voc precisa alterar o comprimento do campo depois que criou uma tabela, voc apenas precisa alter-lo
no domnio. Se o domnio utilizado em mais de uma tabela, a alterao automaticamente propagada para
todos os campos que utilizam esse domnio.

Criar ou reutilizar domnios e elementos de dados existentes?

Uma instalao tpica do SAP ERP tem por volta de 100.000 domnios preexistentes (isso mesmo, cem mil) e
400.000 elementos de dados. Quando voc cria um novo campo, voc deve decidir se cria um novo domnio e
elemento de dados ou reutiliza um existente. Para tomar essa deciso, determine se o tipo ou comprimento de
dados de seu campo deve ser dependente de um campo existente da SAP. Se seu campo precisa ser
independente, crie um novo domnio. Se seu campo deve ser dependente, reutilize um domnio existente. De
forma similar, voc deve reutilizar elementos de dados se seus rtulos de campo e documentao alterarem
quando a SAP alterar os dela.

Convenes para atribuio de nome para tabelas e seus componentes

Tipo de Objeto
Comprimento mx.
nome
Primeiro caractere permitido
Tabela 16 Y, Z
Elemento de dados 30 Y, Z
Domnio 30 Y, Z
Campo 16 Qualquer caractere

Os nomes de todas as tabelas, domnios e elementos de dados ou demais objetos criados no SAP ERP devem
iniciar com Y ou Z. Voc no pode utilizar qualquer outro caractere no comeo; todos os outros so reservados
pela SAP. O SAP ERP impe essa conveno; voc obter uma mensagem de erro se tentar criar um objeto
que tem um nome que no se adapte a essas convenes.
Os nomes de campos podem comear com qualquer caractere. Entretanto, certas palavras so reservadas e
no podem ser utilizadas como nomes de campo.
A tabela TRESE contm a lista completa das palavras reservadas. Para acess-la, use a transao SE16
SELECT

O comando SELECT uma definio do padro SQL (Structured Query Language) usado para acessar e
selecionar dados das tabelas do banco de dados. Cada fornecedor de banco de dados (e de alguns ERPs)
define suas prprias sintaxes dos comandos, baseado em um padro mnimo (ANSI SQL). O SQL do Abap
chamado de Open SQL.

Sintaxe simplificada

SELECT <lista de campos> / SINGLE <lista de campos>
FROM <tabela ou viso>
INTO <destino da leitura> / INTO TABLE <tabela interna>

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


29
WHERE <condio>

Info: logo aps o comando SELECT teste o valor da varivel de ambiente SY-SUBRC: se o valor for
zero, pelo menos um registro foi lido; caso contrrio nenhum registro foi encontrado.

Exemplos:

1) L os valores dos campos VBELN, POSNR e NETWR da tabela transparente VBAP (registro nico
SINGLE) e atribui os valores s variveis V_ORDEM, V_POSICAO, V_VALOR:

SELECT SINGLE VBELN POSNR NETWR
FROM VBAP
INTO (V_ORDEM, V_POSICAO, V_VALOR)
WHERE VBELN = V_OV AND
POSNR = V_ITEM.

Info: a clusula SINGLE sempre dever ser usada ao buscar um registro nico na tabela, quando
informamos a chave completa de um ndice nico. Neste exemplo, os campos VBELN e POSNR
formam a chave primria da tabela VBAP.


2) L todos os campos de um registro da tabela PA0001 e atribui o contedo varivel estruturada
WA_INFOTIPO1, para a matrcula 00000254 e data final entre os valores VDATA_INI e VDATA_FIM

SELECT * FROM PA0001 INTO WA_INFOTIPO1 UP TO 1 ROWS WHERE PERNR = 00000254 AND
ENDDA >= VDATA_INI AND ENDDA <= VDATA_FIM. ENDSELECT.

Para melhor visualizao, melhor usar vrias linhas para escrever o comando:

SELECT *
FROM PA0001
INTO WA_INFOTIPO1
UP TO 1 ROWS
WHERE PERNR = 00000254 AND
ENDDA >= VDATA_INI AND
ENDDA <= VDATA_FIM.
ENDSELECT.

Info: se a clusula SINGLE ou INTO TABLE no for informada, necessrio fechar o SELECT com
ENDSELECT, pois a condio no WHERE indica a possvel leitura de mais de um registro. A clusula
UP TO 1 ROWS colocada aqui para limitar a quantidade de registros lidos, trazendo somente o
primeiro registro que satisfaa condio.

Cuidado! use o SELECT . ENDSELECT somente quando precisar ler uma tabela onde voc no
tenha a chave completa do ndice e retorne somente uma linha com a opo UP TO 1 ROWS. Caso
contrrio use SELECT...SINGLE ou SELECT .... INTO TABLE.


3) L vrios registros da tabela BKPF e coloca o resultado na tabela interna IT_DOC_CONTABIL:
SELECT *
FROM BKPF
INTO TABLE IT_DOC_CONTABIL
WHERE BUKRS = 1000 AND
BLART = SA AND
BSTAT = A.

4) L vrios registros da tabela MAKT e coloca o resultado na tabela interna T_DESC_MATERIAL. A
condio de busca leva em conta todas as entradas da tabela interna T_MAT_REF:

SELECT MATNR MAKTX

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


30
FROM MAKT
INTO TABLE T_DESC_MATERIAL
FOR ALL ENTRIES IN T_MAT_REF
WHERE MATNR = T_MAT_REF-MATNR.

Cuidado! sempre antes de usar o FOR ALL ENTRIES certifique que a tabela interna de referncia
(T_MAT_REF no exemplo acima) tenha pelo menos uma linha. Se ela estiver vazia, todos os registros
da tabela MAKT sero selecionados .

5) L vrios registros da tabela MSEG e coloca o resultado na tabela interna T_MOVTO_MATERIAL. A
condio de busca do campo BWART est na varivel do R_MOVTO (faixa de valores):

SELECT *
FROM MSEG
INTO TABLE T_MOVTO_MATERIAL
WHERE MATNR = V_MATERIAL AND
BWART IN R_MOVTO.

Info: a varivel R_MOVTO declarada com SELECT-OPTIONS na tela de seleo ou DATA...
RANGE OF... Ela contm uma lista de um ou mais valores vlidos para um tipo de dado. Exemplo:
DATA R_MOVTO LIKE RANGE OF MSEG-BWART.


Tabelas internas

Uma tabela interna uma tabela temporria armazenada na memria do servidor do aplicativo. Ela criada e
preenchida por um programa durante a execuo e descartada quando o programa termina. Como uma
tabela de banco de dados, uma tabela interna consiste em uma ou mais linhas com uma estrutura idntica,
mas, diferentemente de uma tabela de banco de dados, ela no pode armazenar dados aps o trmino do
programa. Utilize a tabela interna como um armazenamento temporrio para a manipulao de dados.

Os iniciantes em Abap tem uma grande desconfiana da capacidade de tabelas internas, mas conseguimos
manipular sem problemas tabelas internas com milhares de linhas. Muitos dos comandos de manipulao de
tabelas de bancos de dados tm referncia s tabelas internas (leitura e gravao). Ao manipular registros de
bancos de dados, carregamos para as tabelas internas milhares de registros de uma s vez.

Uma tabela interna consiste em um corpo (linhas) e uma rea de trabalho (work rea). A rea de trabalho
uma varivel de estruturada idntica a uma linha da tabela interna.
Todas as operaes de recuperar, incluir ou alterar linhas so feitas usando a work rea. A work rea pode ser
declarada de forma explicita ou implcita. Quando declarada de forma implcita, dizemos que a tabela interna
tem linha de cabealho ou header line, e neste caso a work rea tem o mesmo nome da tabela interna.
Exemplos:

1) Declarao de uma tabela interna com linha de cabealho. A instruo abaixo declara 2 variveis
ao mesmo tempo: uma tabela interna de nome T_MATERIAL e uma work rea de nome
T_MATERIAL:

DATA: T_MATERIAL TYPE TABLE OF MARA WITH HEADER LINE.

2) Declarao de uma tabela interna sem linha de cabealho:

DATA: T_MATERIAL TYPE TABLE OF MARA.

Neste caso precisamos declarar explicitamente uma varivel estruturada que serve de armazenamento
temporrio nas operaes de leitura, incluso e alterao de linhas. Exemplo de declarao de work rea para
tabela interna sem linha de cabealho:

DATA: T_MATERIAL TYPE TABLE OF MARA, Tabela interna
WA_MATERIAL TYPE MARA. Work rea

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


31

Ou:

WA_MATERIAL LIKE LINE OF T_MATERIAL.

Info: o prefixo WA_ muito usado para declarar work reas de tabelas internas.


3) Declarando uma tabela interna e sua work rea a partir de um tipo definido no programa:

TYPES: BEGIN OF Y_DOC_CONTABIL,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF- GJAHR,
XBLNR TYPE BKPF-XBLNR,
END OF Y_DOC_CONTABIL.


DATA: T_DOCUMENTO TYPE TABLE OF Y_DOC_CONTABIL,
WA_DOC TYPE Y_DOC_CONTABIL.

4) Declarao de tabela interna com linha de cabealho usando a clusula OCCURS:

DATA: BEGIN OF T_DOCUMENTO OCCURS 0,
BELNR TYPE BKPF-BELNR,
GJAHR TYPE BKPF- GJAHR,
XBLNR TYPE BKPF-XBLNR,
END OF T_DOCUMENTO.

Info: OCCURS 0 indica que o servidor de aplicativo alocar automaticamente o espao necessrio
para as linhas da tabela interna. Use esta clusula sempre com o valor 0.



Adicionando linhas a uma tabela interna

Para adicionar uma nica linha em uma tabela interna, voc poder utilizar a instruo APPEND. APPEND
copia uma nica linha de qualquer rea de trabalho e a coloca no corpo ao final das linhas existentes. A rea
de trabalho pode ser a linha de cabealho ou qualquer outro campo estruturado com a mesma estrutura de
uma linha no corpo.

1) Incluindo uma linha ao final da tabela interna T_MATERIAL (sem linha de cabealho). A work rea
WA_MATERIAL tem a linha a ser includa:

WA_MATERIAL-MATNR = 123445.
WA_MATERIAL-UNIDADE_MEDIDA = KG.

APPEND WA_MATERIAL TO T_MATERIAL.

2) Incluindo uma linha ao final da tabela interna T_MATERIAL (com linha de cabealho):

T_MATERIAL-MATNR = 123445.
T_MATERIAL-UNIDADE_MEDIDA = KG.

APPEND T_MATERIAL.


Depois de executado, o APPEND a varivel de sistema SY-TABIX configurada com o nmero de linha
relativo da linha recm acrescentada. Por exemplo, depois de acrescentar a primeira linha, SY-TABIX ser
configurada como 1. Depois de acrescentar a segunda linha, SY-TABIX ser configurada com 2 e assim por
diante.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


32
A instruo APPEND INITIAL LINE to it acrescenta uma linha contendo valores iniciais (espaos em branco e
zeros) tabela interna. Equivale a executar as duas instrues a seguir em seqncia:

CLEAR IT. Limpa a work rea
APPEND IT. Acrescenta a linha ao final da tabela

Cuidado!: se a tabela interna no tiver linha de cabealho, o comando CLEAR IT apagar todo o
contedo da tabela interna (corpo). Uma maneira muito utilizada para fazer referncia ao corpo da
tabela interna o uso de colchetes: o comando CLEAR IT[] apaga o corpo da tabela, tenha ela linha de
cabealho ou no.


Lendo dados a partir de uma tabela interna

Duas instrues so comumente utilizadas para a leitura dos dados a partir de uma tabela interna:

LOOP AT / READ TABLE
Utilize LOOP AT para ler vrias linhas da tabela interna. Utilize READ TABLE para ler uma nica linha.

Lendo vrias linhas utilizando a instruo LOOP AT

Para ler algumas ou todas as linhas de uma tabela interna, voc pode utilizar a instruo LOOP AT. LOOP AT
l o contedo da tabela interna, colocando as linhas do contedo, uma por vez, na rea de trabalho (ou linha
de cabealho)

As linhas so lidas da tabela interna, uma por vez, e colocadas em seqncia na rea de trabalho. As linhas de
cdigo entre LOOP AT e ENDLOOP so executadas para cada linha recuperada. O LOOP termina
automaticamente quando a ltima linha lida e a instruo aps ENDLOOP ento executada.

1) Percorrendo e imprimindo o valor de 2 campos da tabela interna T_MATERIAL (com linha de
cabealho):


LOOP AT T_MATERIAL.
WRITE:/ T_MATERIAL-MATNR, T_MATERIAL-DESCRICAO.
ENDLOOP.

2) Percorrendo e imprimindo o valor de 2 campos da tabela interna T_MATERIAL (sem linha de
cabealho):


LOOP AT T_MATERIAL INTO WA_MATERIAL.
WRITE:/ WA_MATERIAL-MATNR, WA_MATERIAL-DESCRICAO.
ENDLOOP.


Dentro do LOOP, SY-TABIX contm o nmero de linha relativo do registro atual. Aps ENDLOOP, SY-SUBRC
ser zero se a tabela interna contiver pelo menos uma linha. Ser diferente de zero se nenhuma linha tiver sido
lida a partir da tabela interna.

Utilizando as adies FROM e WHERE, voc poder restringir o nmero de linhas lidas da tabela interna.
Embora WHERE retorne um subconjunto do contedo da tabela, uma varredura total da tabela ser sempre
executado (pesquisa seqencial).

3) Percorrendo e imprimindo o valor de 2 campos da tabela interna T_MATERIAL (sem linha de
cabealho), sob uma determinada condio:

LOOP AT T_MATERIAL INTO WA_MATERIAL WHERE VALOR > 0.
WRITE:/ WA_MATERIAL-MATNR, WA_MATERIAL-DESCRICAO.
ENDLOOP.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


33

4) Percorrendo e imprimindo o valor de 2 campos da tabela interna T_MATERIAL (sem linha de
cabealho), da linha 30 at a linha 95:

LOOP AT T_MATERIAL INTO WA_MATERIAL FROM 30 TO 95.
WRITE:/ WA_MATERIAL-MATNR, WA_MATERIAL-DESCRICAO.
ENDLOOP.

Lendo uma nica linha utilizando a instruo READ TABLE

Para localizar e ler uma nica linha de uma tabela interna, utilize READ TABLE. Ela l uma nica linha que
corresponda com os critrios especficos e a coloca em uma rea de trabalho. Lembre-se que todas as
operaes de recuperao ou gravao de dados em um tabela interna devem ser feitas atravs de uma rea
de trabalho.

1) Recuperando uma linha da tabela interna T_MATERIAL para o material 00012543.

READ TABLE T_MATERIAL WITH KEY MATNR = 00012543.
IF SY-SUBRC = 0.
WRITE:/ T_MATERIAL-DESCRICAO.
ELSE.
WRITE:/ No encontrado.
ENDIF.

2) Recuperando a quinta linha da tabela interna T_MATERIAL (sem linha de cabealho)

READ TABLE T_MATERIAL INTO WA_MATERIAL INDEX 5.
IF SY-SUBRC = 0.
WRITE:/ WA_MATERIAL-DESCRICAO.
ELSE.
WRITE:/ No encontrado.
ENDIF.

3) Recuperando uma linha da tabela interna T_DOC_MATERIAL. A tabela interna DEVE estar
classificada pela chave de busca ao usar a clusula BINARY SEARCH:

READ TABLE T_MATERIAL INTO WA_MATERIAL
KEY MATNR = 00012543
BINARY SEARCH.

Cuidado!: se a tabela interna no tiver classificada pela chave de busca, o interpretador Abap no
retorna erro na adio BINARY SEARCH e voc poder pensar que tudo est bem. O seu programa
pode funcionar por um tempo, por que coincidentemente a tabela pode estar classificada. Um dia ele
deixa de funcionar simplesmente porque um registro foi inserido na tabela fora da ordem da chave.

Info: existe outra forma de acessar uma linha da tabela interna, atravs de smbolos de campo (field-
symbols). Usamos para isto a clusula ASSIGNING em uma instruo READ ou LOOP. Um smbolo
de campo um ponteiro para a linha lida. Consulte a ajuda (F1) para mais detalhes.

Classificando o contedo de uma tabela interna

Para classificar o contedo de uma tabela interna, utilize a instruo SORT. As linhas podem ser classificadas
por uma ou mais colunas em ordem ascendente ou descendente. A prpria seqncia de classificao pode
tambm ser modificada.

SORT T_CLIENTE BY NOME. Classifica a tabela interna T_CLIENTE pela coluna NOME.

Determinando se uma tabela interna est vazia


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


34
Para determinar se uma tabela interna contm quaisquer linhas, faa um teste do corpo com a seguinte
instruo:

IF T_CLIENTE[] IS INITIAL.

Se o teste for verdadeiro, a tabela interna estar vazia. Quando falso, ele ir conter pelo menos uma linha.

Determinando o nmero de linhas em uma tabela interna

DESCRIBE TABLE T_CLIENTE LINES V_LINHAS. Atualiza a varivel V_LINHAS com o nmero de linhas
da tabela interna.

Inserindo linhas em uma tabela interna

Para inserir uma nica linha em uma tabela interna, em uma posio especfica, utilize a instruo INSERT:

INSERT WA_CLIENTE INTO T_CLIENTE INDEX 7.

O commando anterior insere a work rea WA_CLIENTE na stima linha da tabela interna T_CLIENTE. As
linhas existentes anteriormente a partir da linha 7 tem seu nmero acrescido de 1 (um).

Dica: Depois que cada instruo INSERT for executada, o sistema indexar novamente todas as
linhas abaixo da inserida. Isso leva a uma queda de performance quando voc insere linhas prximas
ao incio de uma grande tabela interna. Se voc precisar inserir um bloco de linhas em uma grande
tabela interna, prepare uma outra tabela com as linhas a serem inseridas e utilize INSERT LINES por
sua vez. As linhas na tabela alvo sero novamente indexadas apenas uma nica vez, depois que essa
instruo for executada.

Modificando as linhas em uma tabela interna

Para modificar o contedo de uma ou mais linhas de uma tabela interna, utilize a instruo MODIFY (sempre
atravs de uma work-rea). O comando MODIFY sempre precisa da indicao de qual linha deve alterar. Isto
indicado de uma das duas formas: a) explicitamente pela clusula INDEX; b) implicitamente dentro de um loop.

1) Modificando a quinta linha da tabela interna TCLIENTE (sem linha de cabealho):

MODIFY TCLIENTE FROM WA_CLIENTE INDEX 5.

2) Modificando a quinta linha da tabela interna TCLIENTE (com linha de cabealho)

MODIFY TCLIENTE INDEX 5.

3) Modificando todas as linhas da tabela interna TCLIENTE:

LOOP AT TCLIENTE.
TCLIENTE-DATA_PAGTO = SY-DATUM + 30.
MODIFY TCLIENTE.
ENDLOOP.

Excluindo o contedo da tabela interna

Para excluir o contedo de uma tabela interna, voc poder utilizar as seguintes instrues: FREE, REFRESH,
CLEAR e DELETE.

1) FREE: exclui todas as linhas da tabela interna e libera a memria ocupada por ela

FREE TCLIENTE.


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


35
2) CLEAR e REFRESH: elimina todas as linhas da tabela interna. Para tabelas internas com linha de
cabealho, CLEAR limpa a linha de cabealho. Estes comandos no liberam a memria usada
pelas tabelas:

CLEAR TCLIENTE. Elimina todas as linhas, caso TCLIENTE no tenha linha de cabealho
CLEAR TCLIENTE[]. Elimina todas as linhas, independente se houver ou no linha de cabealho
REFRESH TCLIENTE. Idntico a CLEAR TCLIENTE[].

Info: se a tabela interna TCLIENTE tiver linha de cabealho, os comandos CLEAR TCLIENTE[] e
REFRESH TCLIENTE no alteram o contedo da linha de cabealho.

3) Eliminar linhas sob alguma condio:

DELETE TCLIENTE WHERE DATA_PAGTO <= SY-DATUM.

4) Eliminar a dcima oitava linha da tabela interna:

DELETE TCLIENTE INDEX 18.

5) Eliminando linhas de uma tabela interna dentro de um loop. A excluso de uma linha no afeta o
LOOP:

LOOP AT TCLIENTE.
IF TCLIENTE-DATA_PAGTO > SY-DATUM.
DELETE TCLIENTE.
ENDIF.
ENDLOOP.


Preenchendo uma tabela interna utilizando collect

Utilizando a instruo COLLECT ser possvel criar totais dentro de uma tabela interna medida que voc a
preenche.

Quando COLLECT for executado, o sistema formar uma chave a partir dos campos de chave padro na rea
de trabalho. Os campos de chave padro so os campos de caractere (tipo c, n, d, t e x). Portanto, a chave
ser composta dos valores de todos os campos do tipo c, d, n, t e x. No importa se esto uma ao lado do
outro, ou se esto separados um do outro por outros campos.
O sistema ento pesquisar o corpo da tabela interna quanto a uma linha com a mesma chave daquela na
rea de trabalho. Se no localizar uma, a linha ser acrescentada ao final da tabela. Se localizar uma, os
campos numricos (tipos i, p e f) na rea de trabalho sero adicionados nos campos correspondentes da linha
localizada.

Programas on-line (Pool de Mdulos)

Usamos programas do tipo M (Pool de Mdulos) quando precisamos fornecer ao usurio SAP interfaces de
tela mais elaboradas em relao aos programas do tipo Report. Os programas do tipo report, de uma maneira
geral, fornecem 3 passos de processamento:
1 Tela de seleo (um tela por programa): opes de seleo de informaes para um relatrio e/ou
processamentos diversos (gravao em tabelas, consolidao de informaes). Conseguimos montar mais de
uma tela em um programa report, mas no uma operao usual;
2 Processamento: aps a digitao de informaes na tela de seleo, usamos o evento START-OF-
SELECTION para codificar o tratamento destas informaes;
3 - Sada: aps o processamento, exibimos as informaes lidas/calculadas (em tela e/ou impressora) ou
consolidamos alguma informao em tabelas (totalizao das vendas do ms, por exemplo).

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


36
Esta apresentao simplificada do programa report atende a grande maioria das necessidades de
desenvolvimentos de programas abap, mas no todas.
Quando precisamos utilizar mais de uma tela para exibio/entrada de informaes e navegao entre telas, o
programa do tipo report mostra-se limitado. Para este tipo de processamento a SAP disponibiliza o programa
do tipo M (Pool de Mdulos, Programas on-line ou Module Pool).
Programas do tipo M so dotados de uma grande capacidade de customizao das telas (leia-se editor
grfico) e flexibilidade para criar uma interface mais amigvel com o usurio.
Na maioria dos casos cada tela de um programa on-line contem os seguintes elementos:

Ttulo;
Status GUI - conjunto de botes e menus. Lembre-se que as telas SAP tem local fixo para os botes:
barra de botes padro e barra de botes de aplicao (vide pgina seguinte);
Layout: campos para exibio e digitao;
Lgica de processamento (tambm conhecido como eventos de tela):
o comandos para execuo ANTES da tela ser exibida: Process Before Output PBO;
o comandos para execuo DEPOIS de acionado um boto ou ao do usurio: Process After
Input PAI. Se no PAI no for acionado outra tela do programa, o processamento retorna para
o PBO;
o Ajuda de pesquisa (acionamento da tecla F4): Process On Value Request POV
o Help (acionamento da tecla F1): Process On Help Request - POH

Observao: os eventos POV e POH no sero tratados neste documento.

O Ttulo e o Status GUI so feitos de forma separada do desenho da tela. De forma geral, os passos para
criao de um tela em abap so:

1 Criamos a tela vazia (no necessariamente o primeiro passo). Cada tela tem uma identificao
numrica de 4 posies e sempre est associada a um programa. Podemos ter vrias telas com o nmero
9100, mas em programas diferentes;
2 Criamos o ttulo e as aes (Status GUI) separados da tela. Estes elementos existem de forma
independente da tela e no programa podem existir inmeros ttulos e Status GUI. Podemos at mesmo copiar
estes elementos de outros programas existentes. Ratificando: o ttulo e status GUI esto sempre associados a
um programa, mas nunca a uma tela;
3 Antes da tela ser exibida, informamos qual o ttulo e o status GUI a ser usado, no PBO;
4 Codificamos no PAI os resultados de cada ao do usurio, como por exemplo, um clique no boto salvar
ou seleo de item no menu.

Veja na figura abaixo as reas de tela que manipulamos em um programa on-line:




Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


37
1 Menu
2 Barra de ferramentas padro: TODAS as telas SAP tem exatamente os botes mostrados acima, mas eles
ficam habilitados ou no dependendo da funcionalidade a qual a tela se destina;
3 Barra de ttulo: a identificao da tela sempre exibida nesta posio;
4 Barra de ferramentas de aplicao: muda a cada tela. Nesta barra colocamos os botes que criamos.
Dependendo da tela, esta rea pode estar vazia, sem nenhum boto;
5 rea de layout: exibio e digitao de dados do usurio. Podemos colocar botes na rea de layout, mas
precisamos tomar o cuidado para deixar a funcionalidade da tela coerente com a informao exibida. No
exemplo acima temos dois botes na rea de layout, mas a funcionalidade deles refere-se exclusivamente aos
campos Nome e Domiclio Fiscal. Estes botes so criados no editor grfico.

Concluindo:

O menu e as barras de botes (reas 1, 2 e 4) so criados no Status GUI;
O ttulo (contedo da rea 3) criado na opo Ttulos GUI;
O layout da tela (rea 5) criado no editor grfico.

Criando um programa module-pool

Vejamos um programa on-line para alterar o e-mail de um cliente:

1 - Use a transao SE80 para criar o programa on-line (module pool):



O nome de um programa on-line no-standard pode iniciar com a letra Z, mas a SAP recomenda usar o prefixo
SAPM (em oposio ao prefixo SAPL, para programas on-line standard). Aps informar o nome do
programa tecle Enter. Surge a tela de confirmao:



Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


38



Aps confirmar aparece a tela:



Deixe o checkbox Com include TOP marcado. Ser criado automaticamente um novo include e ele ser
colocado no incio do programa. Usamos este include para declarao de variveis do programa module-pool.
Aps confirmar aparece a tela com a sugesto para o nome do include:



Observe a sugesto: MZALTERA_EMAILTOP. um programa do tipo include e inicia pela letra M. Mais
adiante criaremos outros includes, pois no programa on-line usamos 4 includes: declarao de variveis
(include TOP), rotinas para PBO, rotinas para PAI e rotinas gerais.

Confirme e veja a tela seguinte. Observe o tipo de programa sugerido pela SAP, Pool de mdulos:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


39



Observao: possvel criar telas em um programa tipo Report, mas no usual. Uma exceo ocorre
quando em um programa report precisamos de um elemento disponvel apenas no editor grfico (por
exemplo, uma caixa de texto ou um relatrio ALV orientado a objeto). Neste caso o processo o
mesmo, usamos a SE80 e criamos a tela e seus objetos.

Confirme a tela anterior e informe Objeto local na tela de requests (ou crie uma request):



Aps a criao, o lado esquerdo do painel mostra a rvore de objetos do programa on-line:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


40


Observao: a cor azul no nome do programa e no nome do include indica que no foram ativados.

Criando uma tela

Posicione o cursor sobre o nome do programa e use o menu de contexto (boto direito do mouse) para criar
uma tela:




Informe o nmero da tela:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


41



A SAP recomenda que as telas de usurio iniciem com a numerao 9000, apesar de no haver restries
com outra numerao. Veja o que diz a ajuda do campo N tela (aparece ao teclar F1):



Na aba Caractersticas informe a descrio breve para a tela (campo obrigatrio). Esta descrio breve no
aparece quando a tela exibida, serve apenas como documentao.





Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


42
Informe na aba Lista elems. o campo OKCODE. Esta varivel armazenar o valor da ao do usurio na
tela (clique de um boto, por exemplo). Veremos esta varivel mais adiante neste documento:



Clique agora na aba LgProcmto. Observe que o SAP cria o modelo da lgica de processamento
(inicialmente com os MODULEs comentados). O comando MODULE para a lgica de processamento como
um PERFORM para um programa abap. Refere-se a chamada de uma rotina de tela. Os comandos que
colocamos na lgica de processamento so especficos para telas: no permitido colocar, por exemplo,
PERFORM, CLEAR ou outros comandos de programas abap.





medida que criamos elementos do programa, a rvore de objetos atualizada. Salve o programa e observe
a rvore de objetos at agora:




Crie agora a varivel OKCODE. Selecione o include TOP criado (clique-duplo sobre o nome
MZALTERA_EMAILTOP) e declare a varivel OKCODE conforme abaixo:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


43


Selecione a tela 9100 no painel esquerdo e clique no boto Layout:




Aparece o editor grfico:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


44



H duas formas de colocar elementos nesta tela. A primeira consiste em selecionar o elemento desejado (por
exemplo, um texto no smbolo ou um campo de entrada de dados ) e arrast-lo para a rea de layout.

Na outra forma partimos de uma tabela ou estrutura do dicionrio de dados, copiando os campos desejados e
modificando os atributos. Esta forma tem a vantagem de trazer o tipo e tamanho corretos do campo para a tela.

Acione a tecla F6 para exibir a tela de seleo de campos. Informe a tabela SCUSTOM e tecle Enter. Em
seguida selecione os campos abaixo (clicando na coluna esquerda de cada campo):




Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


45

Coloque os campos selecionados esquerda da tela:



Clique no campo de digitao do nmero do cliente e veja o nome do campo. Como foi feita uma cpia a partir
do dicionrio de dados, o SAP sugere o nome SCUSTOM-ID para o campo. Lembre que para cada nome de
campo altervel da tela deve ter uma varivel de mesmo nome declarada no programa. Voc pode usar o
nome sugerido pela SAP ou alter-lo. A falta da declarao da varivel um erro muito comum em iniciantes,
pois a compilao/ativao no detecta erro neste caso (realmente no um erro, as variveis de tela e de
programa existem de forma independente).



Este programa tem a inteno de alterar o e-mail de um cliente. Portanto, o campo de nome do cliente no
pode estar habilitado para alterao, somente para exibio. Alm disso, o nmero do cliente digitao
obrigatria.

Primeiro marque o nmero do cliente como campo obrigatrio. Selecione o campo de nmero do cliente e tecle
F2 ou use o clique-duplo sobre ele. Selecione required conforme mostrado:



Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


46


Na aba dicionrio, desmarque o flag Verificao de chave externa:



Deixe o campo nome do cliente apenas como exibio, desmarcando o flag Campo de entrada (figura
abaixo). Toda informao varivel que voc precisar exibir deve usar o elemento de tela campo de entrada e
sada ( .) O campo de texto ( ) sempre representa um valor fixo e no pode ser alterado:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


47


Volte para a tela anterior e clique no boto salvar.

Criando um ttulo para a tela

Use o menu de contexto (boto direito do mouse) e selecione Ttulos GUI:



Informe o Code ttulo e o Ttulo:




Criando uma transao para o programa

Um programa on-line s pode ser executado se tiver uma transao associada a ele. Novamente use o boto
direito do mouse:

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


48




Informe o cdigo da transao e o texto breve. O texto breve serve como documentao, ele no ser exibido
na tela:




O cdigo da transao DEVE iniciar pela letra Z ou Y. Informe o nome do programa e a tela inicial:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


49


J criamos a tela, o ttulo e a transao. Podemos at executar a transao ZALT_EMAIL para visualizar a
tela, mas no teremos nenhum processamento, pois falta o Status GUI. Veja a chamada da transao
ZALT_EMAIL at agora. Observe que no h botes disponveis e tambm no h ttulo:



Criando o Status GUI

O Status GUI representa as aes possveis para a tela. A cada ao associamos um cdigo de funo.
com o cdigo de funo que identificamos dentro do programa qual boto foi pressionado. Podemos ter vrios
Status GUI em um programa on-line, cada um com um conjunto de aes.

Neste exemplo colocaremos 3 botes:

Voltar ( ): encerra o programa. Cdigo de funo: VOLTAR
Salvar ( ): grava o e-mail informado. Cdigo de funo: GRAVAR
Buscar ( ): a partir do cdigo do cliente informado na tela, busca na tabela de cliente (SCUSTOM) os
dados do cliente. Cdigo de funo: PESQUISAR

Os dois primeiros botes esto na barra de botes padro; o boto buscar ser colocado na barra de botes
de aplicao.

Use o menu de contexto (clique com o boto direito do mouse) para criar o status GUI:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


50


Apesar de nomear o status GUI como STAT_9100, ele poderia ser usado em qualquer tela.





A barra de ferramentas padro contm os botes mais usados, mas para faz-los disponveis para o usurio
precisamos definir o Cdigo de funo. Cada Cdigo de funo deve ter um conjunto de teclas de atalho
associado (CTRL+F5, por exemplo). O nome do cdigo de funo usado na lgica de processamento da tela
para direcionarmos o processamento desejado (gravar, imprimir, excluir e assim por diante). Selecione (clique-
duplo no nome do status GUI) e abra a opo Teclas de funo, conforme mostrado. Informe o cdigo de
funo VOLTAR para o boto : Lembre de gravar a sua alterao:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


51



Coloque agora o cdigo de funo GRAVAR, como mostrado abaixo:



D um clique duplo no cdigo de funo VOLTAR e altere o tipo de funo para E. Esta operao indica que
podemos ter um MODULE exclusivo para este boto (ser explicado mais adiante):



Observao importante: no crie botes desnecessrios na sua tela. Se a sua tela tem a funcionalidade de
gravao, use o boto da barra de ferramentas padro.


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


52
Coloque agora o boto Pesquisar na barra de botes de aplicao. Informe o cdigo de funo e tecle Enter:



Aparece a tela solicitando o texto. Tecle Enter:



Informe o texto para aparecer no boto e tecle Enter. Nesta tela podemos informar tambm um cone para o
boto. Ateno! O cdigo de funo deste boto PESQUISAR, mas o nome que aparecer na tela
Busca:



Toda ao de tela deve ter um conjunto de teclas de atalho associado. A tela seguinte pede as teclas de
atalho. Selecione alguma (por exemplo, Shift-F4) e tecle Enter:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


53


Observe que as aes da barra de ferramentas padro tem teclas de atalho pr-definidas: F3 para voltar
( ), Ctrl+S para salvar ( ) e outros.


Criando a lgica de processamento PBO

Aps criar o ttulo e status GUI (botes) do nosso programa, precisamos associ-los tela que foi criada.
Selecione a lgica de processamento da tela e retire o comentrio dos MODULE. Lembre sempre de salvar o
seu trabalho:




Com um clique duplo (ou F2) sobre o nome do module STATUS_9100 criamos o module e o include (se no
tiver sido criado). Observe que este um nome sugerido para o module, mas podemos troc-lo. Se voc no
salvou sua alterao anterior, o SAP pedir para salvar:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


54






O SAP sugere o nome MZALTERA_EMAIL_STATUS_9100O01 para o include, mas no precisamos seguir
este nome. Observe que o nome sugerido contm o nome do module (STATUS_9100) e um sufixo O01 (
zero um). A letra O aqui refere ao evento PBO. Vamos resumir este nome para MZALTERA_EMAIL_O01,
para no parecer que teramos somente o module STATUS_9100 neste include. Ficamos assim:



Aps a confirmao vemos o lembrete da colocao do include no programa principal. Tecle Enter nesta tela:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


55



Lembre-se que o processamento do module STATUS_9100 ser feito ANTES da tela ser exibida (Process
Before Output). O prximo passo a codificao do module STATUS_9100. Observe que foi sugerido dois
comandos para este module: um para indicar qual status GUI ser usado e outro para indicar o ttulo:



Retire os comentrios do module, informando o status GUI e ttulo nos comandos, sempre em letras
maisculas. O cdigo final deste module deve ficar assim:

Est em um bom momento para salvar o seu trabalho e ativ-lo. Salve esta alterao e selecione o programa
principal em seguida:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


56



Ative agora todo o programa, com o boto direito do mouse:



A tela de ativao mostra os elementos no ativados. Pode ser que sua tela esteja diferente, caso tenha
ativado algum item separadamente. Selecionando o programa principal primeiro garante a ativao de todos os
elementos inativos:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


57



Veja como ficou a rvore de objetos do programa at agora:




Veja a tela aps acionar a transao ZALT_EMAIL:




Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


58

Observe:

Os botes VOLTAR ( ), GRAVAR ( ) e PESQUISAR ( ) esto ativos devido ao comando
SET PF-STATUS;
O ttulo Alterao de e-mail apareceu devido ao comando SET TITLEBAR;
O N cliente campo obrigatrio ( );
O Nome do cliente campo somente para exibio.

Criando a lgica de processamento PAI

At agora finalizamos os passos necessrios para a exibio da tela. Desenhamos o layout, ttulos e botes da
tela, mas no codificamos nenhuma ao do usurio. Vamos agora colocar algum cdigo para responder s
aes do usurio (Process After Input).

De modo semelhante ao PBO, selecione a tela e d um clique duplo sobre o nome do module
USER_COMMAND_9100 (nome sugerido pelo SAP: comandos de usurio para a tela 9100):




Confirme a criao:



Altere o nome do include para MZALTERA_EMAIL_I01. No sufixo I zero um, a letra I refere-se ao PAI:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


59


Confirme a mensagem seguinte com um Enter:



A tela de edio do module aparece:



Toda vez que o usurio teclar Enter, clicar um boto ou acionar um item do menu, os comandos dentro do
module USER_COMMAND_9100 sero executados. Estas aes possveis do usurio so os cdigos de
funo definidos no status GUI. Lembrando os cdigos de funo j definidos:



Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


60

Ao acionar um dos botes acima, a varivel OKCODE (vide pgina 41 para lembrar sobre esta varivel) ser
preenchida com algum dos valores acima (PESQUISAR, GRAVAR ou VOLTAR). Portanto, no module
USER_COMMAND_9100 questionamos o valor desta varivel e executamos a ao desejada pelo usurio.
Codifique o module conforme mostrado abaixo e salve seu trabalho. Cuidado ao escrever os literais, coloque-
os em letras maisculas:




Agora criamos as rotinas BUSCA_CLIENTE e ATUALIZA_EMAIL. Estas rotinas sero colocadas em um novo
include. D um clique duplo sobre o nome da rotina BUSCA_CLIENTE:




Novamente o SAP sugere o nome para o novo include:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


61


Altere o nome do include para MZALTERA_EMAIL_F01 e tecle Enter:



Aps a confirmao aparece o aviso. Tecle Enter:



Codifique a rotina conforme abaixo (abaixo da figura est o cdigo-fonte para voc copiar/colar):


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


62


FORM busca_cliente .

SELECT SINGLE *
FROM scustom
WHERE id = scustom-id.
IF sy-subrc <> 0.
CLEAR scustom.
ENDIF.

ENDFORM. " BUSCA_CLIENTE

Explicando o cdigo: a varivel SCUSTOM-ID recebe da tela o valor digitado para o cdigo de cliente. Para
declarar esta varivel coloque no include TOP: TABLES SCUSTOM, conforme mostrado abaixo.



Observao: a declarao TABLES no significa necessariamente que vamos usar a tabela SCUSTOM no
programa. Podemos ler e gravar na tabela SCUSTOM sem usar esta declarao. Basicamente a declarao
TABLES indica duas coisas:

Cria uma varivel estruturada de mesmo nome e tipo da tabela transparente SCUSTOM;
Se a work rea em comandos do open SQL for omitida, esta varivel ser usada.

Portanto, os cdigos abaixo produzem o mesmo efeito:

Cdigo 1: SELECT SINGLE * FROM SCUSTOM WHERE ID = 00003404.

Cdigo 2: SELECT SINGLE * FROM SCUSTOM INTO SCUSTOM WHERE ID = 00003404.

O cdigo 1 s pode ser usado se houver a declarao TABLES. Se voc no usar a declarao TABLES,
necessrio criar uma work rea como mostrado abaixo:

DATA WA_CLIENTE TYPE SCUSTOM.

SELECT SINGLE * FROM SCUSTOM INTO WA_CLIENTE WHERE ID = 00003404.

Salve seu trabalho e retorne ao module USER_COMMAND_9100. Crie agora a rotina ATUALIZA_EMAIL:

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


63



Confirme a criao com um Enter:



O SAP sugere o nome de um novo include, mas j criamos um para as rotinas. Selecione o include j criado:



Codifique a rotina conforme figura abaixo e salve seu trabalho:




FORM atualiza_email .

UPDATE scustom
SET email = scustom-email
WHERE id = scustom-id.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


64

ENDFORM. " ATUALIZA_EMAIL

Ative todos os seus objetos (pginas 54). Use a transao ZALT_EMAIL para testar o seu programa. Na tela
da transao ZALT_EMAIL:
Informe o cdigo do cliente (ou use o search-help do campo) e tecle o boto PESQUISAR ( );
Se o cliente existir, o nome e e-mail devem aparecer na tela. Caso contrrio todos os campos da tela
sero apagados, inclusive o cdigo digitado;
Altere o e-mail e clique no boto Salvar ( ). Saia da transao e entre novamente, selecionando o
mesmo cliente. Clique no boto Buscar: o novo e-mail deve aparecer na tela;
Deixe o campo cdigo em branco e tecle o boto Voltar ( ). O que aconteceu?

Module de sada AT EXIT-COMMAND

Na montagem do layout da tela, marcamos o campo cdigo como obrigatrio (vide pgina 44). Se ele no for
informado, no conseguimos abandonar a tela usando o boto VOLTAR, pois o SAP emitir a mensagem
Preencher todos os campos obrigatrios.
A opo AT EXIT-COMMAND em um module do PAI indica que, mesmo com campos obrigatrios, o module
ser executado ANTES de qualquer verificao de tela. Desta forma conseguimos colocar cdigo de sada da
tela. Ateno: um module com a opo AT EXIT-COMMAND ser executado somente se o boto tiver com o
tipo E (vide pgina 16).

Inclua um novo module no PAI conforme mostrado:



D um clique duplo sobre o nome do module para cri-lo:




Selecione o include de module j criado:


Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


65


Coloque o comando de sada no module. Aproveite para ativar o programa:



A partir de agora o clique no boto Voltar ( ) acionar o module SAIDA_DA_TELA antes de qualquer outro
module do PAI. O comando LEAVE PROGRAM no module USER_COMMAND_9100 no mais necessrio.
Edite o module USER_COMMAND_9100 e retire este cdigo, conforme mostrado abaixo:



Aps ativar todo o programa faa o teste: entre na transao, deixe o campo cdigo em branco e tecle o boto
Voltar. Esta ao dever mostrar a tela inicial do SAP.

Camilo Veloso Workshop Abap
camiloveloso@hotmail.com / camilo@geraessolutio.com.br


66
CONSIDERAES FINAIS

O exemplo citado neste roteiro altera diretamente uma tabela standard, a SCUSTOM. Lembre que
alteraes diretas em tabelas standard so procedimentos raros em programao abap;
Os erros mais comuns para iniciantes no desenvolvimento de programas on-line so:
o Esquecer de ativar algum elemento do programa (include, tela, status gui);
o Omitir o campo OKCODE na lista de elementos da tela;
o No declarar no programa as variveis de tela. Se voc fizer isto, a compilao no apresenta
erro, pois as variveis de tela e de programa existem de forma independente;
o Declarar varivel no programa com nome diferente da varivel de tela;
o No codificar os modules ou nome-los de forma diferente daquela que consta na lgica de
processamento. A compilao no apresenta erro se voc escrever MODULE na lgica de
processamento e no existir cdigo para ele;
Uma boa ferramenta de aprendizado para programas on-line (e outros tambm...) o debug. Use-o
antes de acionar um comando de tela (com o /H) e inspecione os valores das variveis no PBO e PAI,
principalmente o OKCODE. Logo voc descobrir a necessidade de limp-la no PBO, pois se no
definimos um cdigo de funo para a tecla Enter, o OKCODE mantm o ltimo cdigo de funo
selecionado;
Coloque agora no seu programa uma validao no campo de e-mail. Por exemplo, emita uma
mensagem de erro caso o endereo de e-mail digitado no contenha um @. Para isto voc precisar
do comando FIELD no PAI;
Crie um novo boto Detalhe (cdigo de funo DETALHE) para exibir em uma outra tela (9200, por
exemplo) os outros dados do cliente: endereo, cidade, telefone, forma de tratamento. Use o comando
CALL SCREEN ou SET SCREEN/LEAVE SCREEN para chamar a tela 9200.

Você também pode gostar