Curso ABAP 1 de 2

66
ABAP/4 Apostila 1

Transcript of Curso ABAP 1 de 2

Page 1: Curso ABAP 1 de 2

ABAP/4

Apostila 1

Page 2: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

2

Introdução SAP Arquitetura do SAP ERP

Linguagem ABAP

Antes de começar Mãos a obra Programação Abap Modularização Dicionário de dados Tabelas internas Programas on-line

Page 3: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

3

Introdução 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. É imprescindível que o aluno disponha de um usuário em uma instalação SAP ERP ou Minisap, com direitos de desenvolvedor. Não faz parte deste material detalhes da linguagem ou sintaxe de comandos (com raras exceções), que são encontrados facilmente no help ou em vários sites da internet. Não é preciso conhecer o SAP ERP para este curso, mas algum conhecimento de lógica de programação é necessário. Se você não conhece lógica de programação e algoritmos, poderá ter dificuldade em acompanhar o curso. Toda vez que encontrar um dos símbolos abaixo fixe bem os conceitos, pois ajudarão você por todo o curso e pouparão muitas dores de cabeça nos programas que você desenvolver:

Info: contém informações importantes a respeito do tópico abordado, visando complementar ou clarear a informação.

Dica: contém uma dica que normalmente não é encontrada em material regular de abap ou SAP.

Cuidado!: contém informação que, se ignorada, traz grande prejuízo no desenvolvimento do programa

Page 4: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

4

SAP SAP AG é uma empresa alemã de tecnologia de informação fundada em 1972, mais conhecida pelo seu software de mesmo nome, o SAP ERP. R/3 (lê-se “erre 3”) ou ECC são denominações mais comuns do SAP ERP e representam a identificação de uma versão. O SAP ERP é um sistema integrado de gestão empresarial, que procura contemplar a empresa como um todo. Os processos de negócios são implantados em módulos funcionais, interligados entre si. Principais módulos: MM - Material Management: gestão de materiais, compras, fornecedores; SD - Sales and Distribution: vendas e distribuição, geração de nota fiscal; FI – Financial: contabilidade, emissão de boletos; PP - Production Planning: planejamento da produção; HCM - Human Capital Management: recursos humanos, controle de ponto, folha de pagamento; PS - Project System: controle e orçamento de projetos; CO – Controlling: controle de custos; WF - Work Flow: fluxo de documentos e aprovações; QM - Quality Management: controle de qualidade; WM - Warehouse Management: gerenciamento de armazéns AM - Fixed Assed Management: controle de patrimônio; PM - Plant Maintenance: manutenção de equipamentos; BW - Business Warehouse: armazenamento e recuperação de informações gerenciais; PI - Process Integration: comunicação entre SAP ERP e outros sistemas, incluindo internet. Nem todos os clientes instalam todos os módulos, mas a grande maioria tem pelo menos MM, FI e SD. A SAP muda constantemente as nomenclaturas das soluções oferecidas. Ultimamente a SAP não tem feito referência a estes módulos 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 informações 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 três camadas.

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

Page 5: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

5

tecla, cliques de mouse e teclas de função e envia essas solicitações ao servidor de aplicativo para serem processadas. O servidor de aplicativo envia os resultados de volta à SAPGUI que por sua vez formata a saída a fim de exibi-la para o usuário. O SAP fornece também o front-end através do navegador de internet, desde que a instalação tenha um webserver configurado para tal. O servidor de aplicativo Um servidor de aplicativo é um conjunto de executáveis que interpreta coletivamente os programas Abap e gerencia a entrada e a saída para eles. O servidor de aplicativo existe para interpretar programas Abap, e eles somente são executados nesse servidor – os programas não funcionam no servidor de apresentação (micro desktop ou notebook). Um programa Abap pode iniciar um executável no servidor de apresentação (SAPGUI), mas um programa ABAP/4 não pode ser executado nele. Se seu programa solicitar informações do banco de dados, o servidor de aplicativo formatará a solicitação 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 executáveis que aceita solicitações de banco de dados do servidor de aplicativo. Essas solicitações são 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 então passa as informações novamente ao servidor de aplicativo. O servidor de aplicativo por sua vez transfere essas informações para seu programa Abap.

Linguagem ABAP ABAP (Advanced Business Application Programming) é uma linguagem de programação de alto nível desenvolvida pela SAP. Todos os módulos funcionais citados acima foram desenvolvidos em ABAP. Ela tem sintaxe semelhante ao cobol, e em 1999 com a versão R/3 4.5 passou a suportar programação orientada a objetos. Todos os programas de Abap residem dentro da base de dados do SAP. Não são armazenados em arquivos separados como programas Java ou C++.

Antes de começar Vejamos alguns conceitos do SAP ERP necessários para iniciar a programação abap: 1 - Client (ou mandante) de logon O termo Cliente de logon não tem nada a ver com Client/Server – é completamente diferente. O cliente de logon se refere ao número de 3 algarismos que o usuário digita no campo Client (mandante) na tela de logon. Para facilitar a compreensão, podemos entender como mandante um “local” ou “máquina” onde executamos os nossos programas ou armazenamos os nossos dados. Ao agrupamento de mandantes chamamos de “Instância”. Em uma instalação SAP típica temos pelo menos 3 mandantes: desenvolvimento, qualidade e produção. O mandante de desenvolvimento (muitas vezes tratado com “DEV”, abreviatura de DEVelopment) é o local onde fazemos e testamos os nossos programas Abap. Após a conclusão do nosso programa, fazemos uma cópia (chamado de “transporte”) para o mandante ou ambiente de qualidade (chamado também de QA ou QAS - Quality Assurance). Neste ambiente o usuário e/ou analista funcional testa os nossos programas. Após a conclusão dos testes, o usuário e/ou analista funcional faz um transporte para o mandante de produção. É neste último onde estão localizados os dados reais da empresa. 2 – Request (Change Request ou ordem de transporte) Cada objeto desenvolvido por um consultor abap (programa, novas tabelas, formulários e muitos outros) ou cada configuração feita por um analista funcional pertence a uma “Change request”.

Page 6: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

6

A Request é um documento que contém 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 cópia de objetos de um mandante a outro é chamado de “transporte”. A primeira operação para o transporte dos objetos de uma request é a liberação: indicamos que nossas alterações foram concluídas e a request fica “fechada” para inclusões ou alterações de objetos. Se for necessário alterar ou incluir objetos criamos outra request. O SAP armazena todas as requests e permite comparar as várias versões de um objeto. 3 – Transação Cada funcionalidade do SAP ERP pode ser acionada por uma opção no menu ou por um código de transação. O código da transação é digitado no topo da tela (campo comando, veja abaixo). Por exemplo, ao informar a transação SE38 e teclar Enter, acionamos o editor de programas Abap. Transações mais usadas no desenvolvimento Abap: SE38: editor de programa abap SE37: editor de módulos de funções SE80: navegador de objetos abap (inclui editor) SE11: dicionário de dados (criação/manutenção de tabelas) SE16 / SE16N: exibição de dados de tabelas SE93: criação/alteração de transações SE71: criação/alteração de formulários sapscript SE09 / SE10: manutenção de requests SMARTFORMS: criação/alteração de formulários smartforms SE24: editor de classes 4 – Interface com o usuário

Page 7: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

7

A barra de título: contém o título da tela atual;

A barra de menu: o conteúdo da barra de menu altera-se a cada tela. Pesquisando os menus dentro dele, você pode descobrir todas as funções que são possíveis na tela atual. Os menus Sistema e Ajuda estão presentes em todas as telas e as opções deles nunca se alteram;

O campo Comando: aqui você digita comandos ou transações a serem executados. Por exemplo, você pode efetuar o logoff digitando /nex nesse campo e pressionando a tecla Enter;

A barra de ferramentas Standard: contém o campo Comando e uma série de botões. Estes botões nunca se alteraram na aparência, posição ou função, e estarão presentes todas as telas. Alguns deles podem estar desabilitados dependendo da funcionalidade que estiver atualmente disponível. Você

usará muito o botão BACK (voltar): . Cada botão tem a sua tecla de atalho. A tecla de atalho do botão BACK é F3. Para descobrir qual a tecla de atalho de um botão, posicione o cursor do mouse sobre ele e aguarde uma pequena janela de dica ser mostrada junto ao botão;

A barra de ferramentas de aplicação: altera-se a cada tela. Exibe os botões que dão a você acesso rápido a itens de menu dessa tela. Este é um dos locais onde o consultor Abap coloca novos botões;

A barra de status: exibe mensagens, o ID de sistema, o número de sessão, o número de cliente, o indicador do modo inserir/sobrescrever e a hora/data atual.

5 – BASIS BASIS refere-se ao núcleo que suporta toda a operação 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 também ao profissional que trabalha com este “sistema operacional”, cadastrando usuários, transportando requests, copiando e criando mandantes e muitas outras coisas. 6 – Programas Z, tabelas Z, solução Z, objetos Z, relatório Z.... A nomenclatura de tabelas e programas feitos pelo desenvolvedor abap, salvo raras exceções, deve iniciar com as letras Z ou Y. Por extensão, tudo o que não veio pronto do pacote SAP ERP é chamado de Z: programa Z, relatório Z, tabela Z, solução Z, dentre outros. 7 – Dicionário de dados O dicionário de dados armazena, dentre outras coisas, a definição de todas as tabelas usadas no SAP ERP. Ele não armazena os dados das tabelas, mas as estruturas (campos e tipos de dados) das tabelas e outras definições de tipos de dados, chamados elementos de dados e domínios. Os dados são armazenados no banco de dados, ver o tópico “Arquitetura do SAP ERP”.

Mãos a obra 1 - Acessando o SAP ERP Para acessar a interface de usuário 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, usuário e senha na tela de logon:

Page 8: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

8

Como foi informado na introdução, é imprescindível que o aluno disponha de um usuário em uma instalação SAP ERP ou Minisap, com direitos de desenvolvedor. Primeiro programa É quase um folclore todo curso de linguagem de programação ter como primeiro programa o “Hello world”. Para manter a tradição, façamos agora o nosso programa “Hello world”. Apesar de simples, os conceitos de compilação, edição e ativação valerão 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 através de menus, muitas vezes usamos o código da transação. Neste caso, SE38 é a transação do editor de programas do SAP ERP. Dica: se alguma transação já estiver ativa na tela, você pode digitar /NSE38. O comando /N cancela a transação atual. Se no lugar de /N você digitar /O, outra janela será aberta. A maioria das instalações SAP ERP aceitam no máximo 7 sessões (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, dígitos e travessão (_). Programas on-line tem regra diferente, veja no tópico “Programas on-line”.

Page 9: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

9

3 – Informe agora o nome do programa, o tipo “Executável” e tecle Gravar:

4 – Na janela seguinte clique no botão “Objeto local”:

Info: todo objeto a ser criado pelo usuário precisa de uma request ou deve ser gravado como “Objeto local”. Para fins de treinamento, não é necessário informar um Pacote. Se você informar um pacote, será necessário informar uma change request.

5 – Digite agora uma linha conforme mostrado:

WRITE ‘PRIMEIRO PROGRAMA’.

- Digite o espaço em branco após o WRITE; - Os literais do tipo caracter são delimitados por apóstrofos ; - Todo comando Abap termina com um ponto.

Page 10: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

10

6 – Ativando e executando:

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

Info: ativação significa deixar o objeto pronto para uso. No caso de programas a ativação tem 3 etapas: a) verificação de sintaxe; b) geração de código para execução pela camada de aplicação; c)

gravação do código digitado. Caso queira somente verificar a sintaxe, clique no botão ou tecle Ctrl+F2. Todos os objetos criados pelo usuário devem ser ativados antes do uso.

Dica: use sempre a ativação (Ctrl+F3). Você verifica a sintaxe e grava ao mesmo tempo. Se precisar

somente gravar o programa, clique no botão 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 espaço em branco separando o comando e os argumentos; - Colocar aspas no lugar de apóstrofos; - Falta do apóstrofo final delimitando o literal caracter. Segundo programa

Page 11: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

11

1 – Navegue para a tela inicial do editor de programas, transação SE38; 2 – Nome do programa: ZSEGUNDOPROGRAMA 3 – Tipo do programa: Executável 4 – Digite o código 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 opção “Pretty Printer” (Shift + F1). Ao acioná-la, o editor Abap identa o seu código e acerta as palavras reservadas para maiúsculas/minúsculas. Veja a opção do menu Utilitários >>> Configurações, na aba Editor Abap >>> Pretty Printer.

Depuração de programas Se você estiver visualizando o código do programa, acione no menu Utilitários >>> Ponto de parada >>> Definir/Eliminar (Ctrl+Shift+F12) para marcar ou desmarcar um ponto de parada. O programa deve estar ativo para esta operação. Outra forma de marcar um ponto de parada (breakpoint) é inserir a instrução BREAK xxxx, onde xxxx é o código de usuário de logon. O processador Abap efetuará uma parada somente para o usuário indicado.

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

Estando na tela de seleção, tecle /H e Enter no campo de comando. Esta operação 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:

Page 12: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

12

Para continuar a execução, você pode teclar: F5: executa uma instrução. Se a instrução for uma chamada de sub-rotina/método/módulo de função, o debug mostra a primeira instrução da sub-rotina e você continua o debug DENTRO do código da sub-rotina; F6: executa uma instrução. Se a instrução for uma chamada de sub-rotina/método/módulo de função, o debug executa a sub-rotina/método/módulo de função, mas NÃO EXIBE o código da sub-rotina/método/módulo de função na janela de debug; F7: executa TODAS instruções desde o ponto de parada até o final da sub-rotina/método/módulo de função, parando a execução do programa na primeira instrução após a chamada; F8: executa todas as instruções a partir do ponto de parada atual, até encontrar um ponto de parada ou instrução BREAK. Não havendo estas instruções, executa o programa até uma exibição de tela ou encerramento do programa. Tipos de programas Nos dois exemplos acima você informou “Executável” para o tipo de programa. Percebeu também que este tipo de programa inclui o comando REPORT automaticamente como primeira linha do programa. Vejamos os tipos de programa mais comuns: REPORT (executável): apesar do nome, não é usado somente para emissão de relatórios. Este tipo de programa é normalmente usado quando temos um processamento na sequência abaixo: 1 - Tela de seleção 2 – Processamento: recuperação ou gravação de informações em tabelas 3 – Emissão de relatório em tela e/ou spool Pode não haver um ou mais dos passos acima. É um dos tipos mais usados. Não é recomendado quando temos várias telas de interação com o usuário. MODULE-POOL (também chamado de on-line ou pool de módulos): usado quando precisamos montar telas mais elaboradas e com grande interação com o usuário.

Page 13: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

13

INCLUDE: não é necessariamente um programa, mas uma forma de modularização. Um programa do tipo INCLUDE contém um trecho de código para ser inserido dentro de outro programa. Não pode ser executado individualmente. FUNCTION GROUP: como o nome diz, um programa do tipo FUNCTION GROUP agrupa um ou mais módulos de função Abap (outra forma de modularização). POOL DE SUB-ROTINAS: conjunto de sub-rotinas. Não pode ser executado individualmente. POOL DE TIPOS: semelhante ao INCLUDE, contém definições de tipos de dados.

Programação Abap Cada programa do Abap é composto de uma ou mais instruções. Cada instrução contém uma variedade de palavras separadas por pelo menos um espaço. A primeira palavra de uma instrução é a palavra-chave. Uma instrução pode incluir uma ou mais adições e sempre termina com um ponto. Definindo variáveis Use a instrução DATA para declarar variáveis no programa. Um nome de variável pode ter no máximo 30 caracteres, conter letras, dígitos e travessão (_). O nome não pode iniciar por um dígito (0-9). O interpretador Abap não diferencia letras maiúsculas de letras minúsculas. Exemplos: DATA V_CONTADOR TYPE I VALUE 5. “ Tipo inteiro, inicializado com o valor 5 DATA ENDERECO_CLIENTE(40) TYPE C. “ Variável de 50 posições caracter DATA DT_NASC TYPE D. “ Variável do tipo data. Os valores são armazenados na forma AAAAMMDD (Ano, mês e dia) DATA: CODIGO_EMPRESA TYPE SFLIGHT-CARRID. “ Variável do mesmo tipo do campo CARRID da tabela SFLIGHT.

Dica: não economize clareza ao definir um nome de variável. Se precisar de um contador de registros processados, nomeie a variável como V_CONTADOR_REG_PROC ou V_CONT_REGISTROS_PROC e não simplesmente V_CONT. A má escolha em nomes de variáveis é uma das maiores vilãs para manutenção de programas.

Tipos de dados pré-definidos:

Tipo de Dados

Significado Valor Inicial Tamanho default

Tamanho Permitido

P Número Packed 0 8 1-16

I Inteiro 0 4 4

F Float(ponto flutuante) 0.000 8 8

N Texto Numérico 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 X’00 1 1-max

Os tipos numéricos P,I e F tem as seguintes características e região de valores:

Tipo de Dados

Significado Faixa de trabalho Utilização

I Inteiro -231

a +231

Contadores, quantidades, índices, período de tempo.

Page 14: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

14

P Número com Casas decimais

2 caracteres por bytes

Quantias em dinheiro, tamanho, largura.

F Ponto Flutuante -,2E308

a +1,8E308

Cálculo em larga escala, científicos.

Utilize inteiros para variáveis que serão envolvidas em cálculos simples ou quando nenhum ponto decimal for exigido. Variáveis como contadores, índices, posições ou deslocamentos são bons exemplos. Uma variável decimal armazena (L*2) – 1 dígitos, onde L é o comprimento da variável em bytes. Valores decimais são armazenados em dois dígitos por byte, exceto o byte final, que contêm um único dígito e um sinal. O próprio ponto decimal não é armazenado; é um atributo da definição. Variáveis de ponto flutuante são sempre aproximadas. Elas podem ser utilizadas para cálculos que exigem valores muito grandes ou muitos espaços decimais. A precisão de até 15 espaços decimais é possível, mas isso é dependente de hardware.

Info: atenção para o tipo de dado N. Este tipo de dado NÃO é numérico. Ele é um tipo caracter, mas armazena somente os dígitos de 0 a 9. Evite usar este tipo para operações aritméticas. Dica: sempre que possível, declare variáveis com referência a algum elemento do dicionário de dados (campos de tabelas ou estruturas, elemento de dados).

Definindo comentários Coloque * (asterisco) na primeira coluna ou “ (aspas). As aspas podem ser colocadas em qualquer posição da linha. Neste caso, todo o conteúdo após as aspas são consideradas comentários.

Dica: um programa bem comentado evita muitas dores de cabeça futuras e auxilia muito em manutenções do programa. Tome por hábito comentar bem os programas.

Definindo literais Um literal é um objeto de dados não modificável. Ele é interpretado “literalmente” pelo compilador abap, ou seja, exatamente como é escrito. Os literais podem aparecer em qualquer lugar em um programa e eles são definidos meramente sendo digitados onde necessário. Há quatro tipos: string de caractere (entre apóstrofos), numérico, de ponto flutuante e hexadecimal. Exemplos: ‘JOÃO’ 234 ’21.3’ Definindo constantes A declaração de constantes é semelhante à declaração de variáveis. 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, não é necessário escrever a declaração mais de uma vez. Basta colocar “:” (dois pontos) e separar os argumentos com vírgula. O último comando deve ter um ponto no final. As declarações de variáveis do exemplo acima podem ser escritas assim: DATA: V_CONTADOR TYPE I, “ Tipo inteiro ENDERECO_CLIENTE(40) TYPE C, “ Variável de 50 posições caracter DT_NASC TYPE D, “ Variável do tipo data

CODIGO_EMPRESA TYPE SFLIGHT-CARRID. “ Variável do mesmo tipo do campo CARRID da tabela SFLIGHT

Page 15: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

15

Se você não especificar o tipo do campo, por default será caractere. Se você não 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 variável. Mesmo que seja caracter de tamanho 1, deixe isto explícito no seu código: DATA V_FLAG(1) TYPE C.

Variáveis estruturadas A declaração abaixo cria uma variável 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 variáveis estruturadas iniciando por WA_. Estas iniciais indicam “Área de Trabalho” (Work Area).

Para fazer referência a qualquer elemento da variável estruturada, use o nome seguido de hífen e seguido do elemento, sem espaços em branco entre eles. Assim WA_NOTA_FISCAL-VALOR refere-se ao elemento VALOR da variável estruturada WA_NOTA_FISCAL.

Info: uma forma muito usada de declarar variáveis estruturadas é a referência a objetos do dicionário de dados do SAP ERP. A declaração “DATA WA_FORNEC TYPE LFA1.” cria uma variável estruturada com a mesma estrutura da tabela LFA1. A declaração TABLES também cria variáveis estruturadas. Muitos programadores abap entendem erroneamente que “se vou usar uma tabela no meu programa preciso da declaração TABLES”. A declaração TABLES somente cria uma variável estruturada de mesmo nome da tabela do dicionário.

Variáveis pré-definidas ou variáveis de sistema A linguagem Abap contém uma variável estruturada com vários elementos que são atualizados à medida que os comandos são executados. Ela tem o nome SYST ou SY. Veja alguns exemplos: SY-DATUM: data atual SY-UZEIT: hora atual SY-UNAME: código do usuário que está logado SY-LANGU: idioma de logon SY-INDEX: número inteiro representando a iteração de um loop SY-SUBRC: status de uma leitura de tabela de banco de dados e outros comandos SY-TABIX: posição de linha na última operação em uma tabela interna

Info: a variável SY-SUBRC é a mais usada e mais importante. Inicializando variáveis Você usa o comando CLEAR para inicializar uma variável. Uma variável ao ser inicializada conterá o seu valor inicial conforme tabela de tipos de variáveis mostrada anteriormente (valor inicial). CLEAR: NOME, DT_NASCIMENTO, SOMA. CLEAR: WA_NOTA_FISCAL. O comando CLEAR em uma variável estruturada inicializa todos os elementos. Atribuindo valores

Page 16: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

16

Há 2 formas de atribuição: 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’. “ Atribuição de um literal com o valor de uma data

Info: usamos também o comando WRITE para atribuir valores e formatar a saída. O comando “WRITE DT_NASC TO V_SAIDA.” atribui o valor de data (p.ex. ‘19871008’) a uma variável caracter. Após o comando, a variável V_SAIDA terá o valor 08/10/1987.

Cálculos aritméticos Você pode executar cálculos utilizando as seguintes instruções:

Operador Operação

+ Adição

- Subtração

* Multiplicação

/ Divisão

** Exponenciação

DIV Divisão de inteiro

MOD Resto da divisão de inteiro

Conversões de dados

Se duas variáveis tiverem tipos de dados ou comprimentos diferentes, os dados serão convertidos quando movidos. Se os comprimentos das variáveis de envio e de recebimento não corresponderem, uma adaptação automática do comprimento será executada. Se os tipos de dados não corresponderem, uma adaptação automática 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 espaços em branco

Truncando à direita

X Preenchido à direita com zeros Truncado à direita

N Preenchido à esquerda com zeros Truncado à esquerda

P Preenchido à esquerda com zeros Atribuído se o valor numérico se adequar ao campo ‘to’. Se o valor numérico for grande demais para o campo de recebimento, ocorrerá um erro de execução

SubCampos

Page 17: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

17

A parte de um campo referenciada pela especificação de um deslocamento e/ou comprimento é denominado subcampo. V_EMPRESA = ‘ESTRADA REAL’. WRITE:/ V_EMPRESA+1(4). “ Será impresso STRA – a numeração inicia em 0 (zero)

Info: variáveis do tipo D são armazenadas no formato AAAAMMDD (ano, mês, dia). Portanto, podemos fazer a referência V_DATA+4(2) para obter o mês.

Cálculo com datas

Uma variável de data (tipo d) pode ser utilizada dentro de expressões matemáticas. Podemos somar ou subtrair valores inteiros (dias), bem como encontrar a diferença entre duas datas. O resultado da diferença 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 próprios tipos de dados utilizando a instrução TYPES. TYPES TY_NASCIMENTO TYPE D. DATA: NASCIMEN TYPE TY_NASCIMENTO. A utilização de tipos torna seu código mais claro e mais fácil de ler. Ele não armazena dados, somente é utilizado para criar outras variáveis. As mesmas regras usadas para nomear variáveis se aplicam aos tipos. Tipos estruturados também são permitidos. A utilização de tipos estruturados pode reduzir a redundância e torna mais fácil a manutenção 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 instrução TYPES pode ser armazenada em um grupo de tipos. Um grupo de tipos (também conhecido como um pool de tipos) corresponde a um objeto do dicionário que existe meramente para conter uma ou mais instruções TYPES ou CONSTANTS. Utilizando a instrução 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 definições centralizadas. Exemplo: TYPE-POOLS ICON. Operadores Lógicos

Operador Significado

Page 18: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

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 Negação

Instruções de controle comuns

Instrução IF A instrução IF no Abap tem operadores relacionais para igualdade e desigualdade e operadores relacionais especiais para comparações de string. IF V_SALARIO > VALOR_BASE. “ Pode ser escrito também 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 cláusula INITIAL para testar se uma variável está vazia. Procedendo assim você não precisa se preocupar quanto ao tipo e tamanho da variável.

Operadores de caractere

Os operadores especiais para as strings de caractere são mostrados abaixo:

Operador Significa Verdadeiro quando Há distinção entre maiúsculo e minúsculo.

Os espaços em branco finais são ignorados.

V1 CO v2 Contém somente V1 for composto somente de caracteres em v2

Sim Não

V1 CN v2 Not v1 CO v2 V1 pode conter caracteres que não estão em v2

Sim Não

V1 CA v2 Contém qualquer V1 pode conter pelo menos um caractere em v2

Sim Não

V1 NA v2 Not v1 ca v2 V1 não pode conter nenhum caractere em v

Sim Não

V1 CS v2 Contém string V1 pode conter a string de caractere em v2

Não Sim

V1 NS v2 Not v1 CS v2 V1 não pode conter a string de caractere em v2

Não Sim

Page 19: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

19

V1 CP v2 Contém padrão V1 pode conter o padrão em v2 Não Sim

V1 NP v2 Not v1 CP v2 V1 não pode conter o padrão em v2

Não sim

Esses operadores podem ser utilizados em qualquer expressão de comparação. Os operadores CS, NS, CP e NP ignoram os espaços em branco finais e não distinguem maiúsculas de minúsculas.

Instrução CASE

A instrução CASE executa uma série de comparações: CASE OK_CODE. WHEN ‘SALVAR’. Comandos WHEN ‘IMPRIMIR’ Comandos WHEN ‘EXLCUIR’ Comandos WHEN OTHERS Comandos ENDCASE. Somente as instruções após a primeira correspondência WHEN serão executadas. Comandos entre o WHEN OTHERS e ENDCASE serão executados se nenhuma condição anterior for atendida. Se WHEN OTHERS não estiver codificada e nenhuma condição for satisfeita, o processamento continuará com a primeira instrução após ENDCASE. As expressões lógicas não são permitidas no comando CASE, como WHEN OK_CODE <> ‘INCLUIR’. Case é muito semelhante a if/elseif. A única diferença é que em todos os if/elseif, você pode especificar uma expressão complexa. Com case, você pode especificar somente um único valor a ser comparado e os valores são sempre comparados quanto à igualdade. Instrução EXIT A instrução EXIT impede que processamentos posteriores ocorram. Ela pode ser utilizada em várias situações e seu efeito depende do local onde aparece no código. Entretanto, ela sempre impede processamentos posteriores. Dentro de estruturas de loop, select..endselect, do...enddo e while ela força o encerramento do loop. Dentro de sub-rotinas, força o encerramento do processamento da sub-rotinas.

Cuidado!: muita atenção ao usar o comando EXIT dentro de trechos de códigos inseridos com o comando INCLUDE. O comando INCLUDE somente copia o código dentro de um trecho de programa. Não existe o conceito do uso do EXIT para “sair” do INCLUDE. Veremos o comando include mais adiante.

Instrução DO A instrução DO corresponde a um mecanismo de loop básico. DO 5 TIMES. Comandos.... ENDDO. Contador = 8. DO Contador TIMES. PERFORM IMPRIME_UMA_COPIA. ENDDO.

Page 20: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

20

Dentro do loop, SY-INDEX contem o número da iteração 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. Instrução WHILE A instrução WHILE corresponde a um mecanismo de loop semelhante ao DO, mas o encerramento do loop ocorre quando a expressão a frente do WHILE fica falsa. WHILE VC_CONTADOR <= 10. Comandos... ADD 1 TO CONTADOR. ENDWHILE. Instrução CONTINUE A instrução CONTINUE é inserida sempre dentro de um loop. Ela atua como um desvio para o início do loop e começa uma nova passagem de loop. Na verdade, faz com que as instruções 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 instrução CHECK A instrução CHECK é codificada dentro de um loop. Ela atua como um “CONTINUE condicional”. Se a condição for falsa, um CONTINUE é executado. WHILE V_FLAG IS INITIAL. CHECK SY-SUBRC = 0. ENDWHILE. A instrução CHECK pode aparecer também dentro de uma sub-rotina: se a condição for falsa, o processamento da rotina é encerrado. Comparando as instruções EXIT, CONTINUE e CHECK

Instrução 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.

Modularização Unidades de modularização no ABAP/4 Uma unidade de modularização permite você separar um grupo de linhas de código do restante e então executá-las em um tempo especifico. As linhas de código dentro de uma unidade de modularização comportam-se de maneira muito semelhante a um mini-programa que pode ser chamado de outro programa. A modularização é usada com 2 objetivos principais:

Page 21: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

21

1 – Clareza para leitura do código 2 – Evitar repetição de código O Abap oferece as seguintes opções de modularização:

a) Eventos b) Sub-rotinas c) Módulo de função d) Include e) Método f) Chamada de outro programa

Utilize as unidades de modularização para eliminar o código redundante dentro de seu programa e para torná-lo mais fácil de ler. Por exemplo, suponha que você tenha uma série de instruções que formatam um endereço e precise formatar endereços em vários lugares diferentes em seu programa. Em vez de duplicar o código dentro de seu programa, é uma boa ideia colocar esse código em uma unidade de modularização e chamá-lo sempre que você precisar formatar um endereço.

a) Eventos Na execução de um programa do tipo report ocorrem vários eventos. Para aproveitar este recurso, escrevemos no programa o nome do evento e colocamos comandos que gostaríamos de executar na ocorrência daquele evento. Alguns eventos de um programa do tipo report são: INITIALIZATION: ocorre logo que o programa é executado; AT SELECTION-SCREEN: ocorre ao teclar Enter, F8 ou outro comando na tela de seleção; START-OF-SELECTION: após teclar F8 e logo após o AT SELECTION-SCREEN; END-OF-SELECTION: após o último comando do evento START-OF-SELECTION; TOP-OF-PAGE: ocorre no início de impressão de uma página; END-OF-PAGE: ocorre no início da impressão do rodapé da página. Os nomes de evento são palavras reservadas. Você não 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 seqüência: 1 – O evento INITIALIZATION é acionado, se você escreveu este evento no programa; 2 – A tela de seleção é mostrada. Se seu programa não tiver uma tela de seleção, ele pulará esse passo. Se houver um evento AT SELECTION-SCREEN OUTPUT os comandos dentro dele serão executados; 3 – O evento AT SELECTION-SCREEN é acionado; 4 – O evento START-OF-SELECTION é executado (após teclar F8); 5 – O evento END-OF-SELECTION é executado. Você pode codificar os eventos em qualquer ordem e a ordem de execução ainda será a mesma. Se você colocar o evento END-OF-SELECTION no início do programa, ele ainda será executado em último lugar. Normalmente é interessante posicionar os eventos na ordem em que eles são acionados para deixar o programa mais fácil de entender. Se a primeira instrução executável em seu programa não for precedida por um nome de evento, em tempo de execução o sistema automaticamente insere START-OF-SELECTION antes da primeira linha de código executável. Portanto, se você não tiver quaisquer eventos codificados, ou se não tiver colocado código na parte superior do programa sem atribuir nomes a um evento, START-OF-SELECION é inserido. Isto foi feito no nosso primeiro programa, na seção “Mãos a obra”.

Info: você não deve colocar definições de dados dentro de eventos. Embora isso não cause um erro de sintaxe, trata-se de um estilo de programação pobre. Todas as definições de dados ficam melhor na parte superior do programa (definições globais – consulte a modularização com sub-rotinas, mais adiante).

Page 22: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

22

Cada evento tem um propósito específico e é necessário realizar uma tarefa de programação específica. Se você não 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 instruções: EXIT, CHECK, STOP ou RETURN.

b) Sub-rotinas Uma sub-rotina é uma seção de código reutilizável. É como uma mini-programa que pode ser chamado de outro ponto em seu programa ou mesmo de outros programas. Dentro dele você pode definir variáveis, executar instruções, computar resultados e escrever saída. Para definir uma sub-rotina, utilize a instrução FORM para indicar o início de uma sub-rotina e utilize ENDFORM para indicar o seu fim. O nome de uma sub-rotina não pode exceder 30 caracteres. Para chamar uma sub-rotina, utilize a instrução PERFORM.

Info: uma das principais características de um bom programa é uma boa modularização. Ela traz clareza ao código e facilidade de manutenção. Se você define uma rotina com o nome CALCULA_PESO_LIQUIDO, outro programador terá facilidade de fazer manutenção em seu programa.

Definindo e chamando sub-rotinas internas As definições de sub-rotina normalmente são colocadas no fim do programa, depois de todos os eventos. A instrução FORM define o fim do evento precedente e o começo de uma sub-rotina. As sub-rotinas não podem ser aninhadas no interior de eventos. Sintaxe de definição: 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: parâmetros. Value indica que a passagem de parâmetro é feita por valor (a variável não é alterada)

TABLES permite que as tabelas internas sejam passadas como parâmetros. VALUE não pode ser utilizada depois de TABLES.

Quando são codificadas, a ordem dos nomes TABLES, USING e CHANGING devem aparecer na ordem mostrada e se podem aparecer somente uma vez. Não pode haver 2 USING.

Não utilize vírgulas para separar parâmetros.

TABLES somente permite que tabelas internas sejam passadas – não tabelas de banco de dados.

Uma sub-rotina pode chamar outra sub-rotina.

A recursão é suportada. Uma sub-rotina pode chamar a si mesma ou uma sub-rotina que a chama de volta.

As definições de sub-rotina não podem ser aninhadas: você não pode definir uma sub-rotina dentro de outra.

Sintaxe de chamada: PERFORM sub [tables t1 t2 ….]

[using u1 u2 …] [changing c1 c2 …].

Page 23: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

23

Onde:

sub: nome da sub-rotina. T1, t2, u1, u2, c1, c2: parâmetros

Deixando uma sub-rotina Você pode sair de uma sub-rotina a qualquer hora utilizando EXIT, CHECK, STOP ou RETURN. Definindo variáveis locais e globais Uma variável global é aquela que é definida fora de uma sub-rotina utilizando a instrução DATA. Ela pode ser acessada de qualquer ponto no programa, seja dentro de um evento ou dentro de uma sub-rotina. É boa prática de programação colocar definições de variáveis globais na parte superior do programa, em algum lugar antes da primeira linha de código executável. Uma variável é definida dentro de uma sub-rotina utilizando as instruções DATA ou STATICS. Dizemos que ela é local à sub-rotina. As variáveis definidas utilizando DATA ou STATICS não são visíveis fora da sub-rotina. Para variáveis locais definidas utilizando DATA, a memória é alocada toda vez que a sub-rotina é chamada. Essa memória é liberada quando a memória é retirada.

Dica: se você vai usar a variável somente dentro de uma sub-rotina, use a declaração DATA dentro da sub-rotina. Procedendo assim você evita alocar memória 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 possível, será mais fácil aproveitar esta rotina. Dica: use o prefixo L_ ou VL_ para indicar que uma variável é local.

Definindo uma área de trabalho TABLES As variáveis definidas que utilizam a instrução TABLES são sempre globais. Colocar a instrução TABLES na parte superior de um programa define uma variável estruturada global. Colocar a mesma instrução dentro de uma sub-rotina também define uma variável global desse nome. Portanto, você não deve utilizar a instrução TABLES dentro de uma sub-rotina, uma vez que a definição é sempre global; essas definições 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 instrução TABLES. Lembre que não é necessário o uso de TABLES para manipular tabelas do banco de dados. Definindo dados As variáveis definidas pela instrução DATA na parte superior do programa são globais. As definições de DATA dentro de uma sub-rotina são locais para a sub-rotina. A memória é alocada para essas variáveis quando a sub-rotina é chamada e é liberada quando ela retorna. Os valores nessas variáveis serão perdidos quando a sub-rotina retornar. Utilize a instrução STATICS para criar variáveis locais que não sejam libertadas quando a sub-rotina termina. A sintaxe para STATICS é a mesma que a sintaxe para a instrução DATA. A memória para uma variável estática é alocada na primeira vez que a sub-rotina é chamada e é retida quando a sub-rotina termina. Entretanto, uma variável estática é visível somente de dentro da própria sub-rotina, e não de dentro de sub-rotinas iniciadas por ela. Da próxima vez que a sub-rotina for chamada, a memória para essa variável torna-se visível novamente. O valor dentro dela será o mesmo de quando você tiver retornado dessa sub-rotina da última vez. A memória de uma variável estática pertence à sub-rotina que a alocou; essa variável não é visível a partir de outras sub-rotinas. Se você alocar uma variável estática do mesmo nome em múltiplas sub-rotinas, essas serão variáveis separadas com sua própria memória e seus próprios valores. Passando parâmetros

Page 24: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

24

Além de definir variáveis utilizando TABLES, DATA e STATICS, também podem ser definidas variáveis na própria instrução FORM. Estas são conhecidas como parâmetros, que podem ser locais ou referências para variáveis globais. A memória de parâmetros locais é alocada quando a sub-rotina é chamada e liberada quando finalizada. Se você definir variáveis na instrução FORM, a instrução PERFORM deve passar um valor para cada uma dessas variáveis. Criando parâmetros com definição de tipo Os parâmetros de uma sub-rotina podem ter ou não definição de tipos. Parâmetros sem definição de tipo permitem que você passe uma variável de qualquer tipo de dado ou comprimento para ele. Parâmetros com definição de tipo exigem que a variável passada seja do mesmo tipo e tamanho 1 – Parâmetro sem tipo FORM BUSCA_FORNECEDOR USING P_CODIGO. ..... ENDFORM. 2 – Parâmetro com tipo FORM BUSCA_FORNECEDOR USING P_CODIGO TYPE LFA1-LIFNR. ..... ENDFORM. Os parâmetros com tipo são mais eficientes. É necessário menos CPU a fim de alocar memória e ajudam a prevenir erros de codificação. Já que você não pode passar um parâmetro de tipo incompatível, o verificador de sintaxe indicará o erro para você se tentar passar um parâmetro incompatível. Passando estrutura Você pode passar uma estrutura da mesma maneira que qualquer outro parâmetro. 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 adições à instrução FORM:

LIKE x

STRUCTURE x Aqui, x pode ser uma estrutura definida no programa ou uma estrutura/tabela do dicionário de dados. Controlando como os parâmetros são passados As maneiras mais usadas para os parâmetros para uma sub-rotina são:

Passar por referência

Passar por valor A sintaxe na instrução FORM determina como as variáveis são passadas. A sintaxe em PERFORM não faz isso.

Using v1 Passe por referência

Changing v1 Passe por referência

Using value(v1) Passe por valor

Lembre-se: - PERFORM e FORM devem conter o mesmo número de parâmetros. - A sintaxe na instrução FORM determina apenas o método pelo qual um parâmetro é passado. - A adição VALUE() não pode ser utilizada na instrução PERFORM.

Page 25: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

25

- USING deve vir antes de CHANGING. - A adição USING só pode ocorrer uma vez em uma instrução. A mesma regra se aplica a CHANGING. Utilizando os métodos de passagem de parâmetros

Método Descrição Vantagens

Por referência Passa um ponteiro para a posição de memória original

Muito eficiente

Por valor Aloca uma nova posição de memória para utilização dentro da sub-rotina. A memória é liberada quando a sub-rotina termina

Impede alterações na variável passada.

Passando parâmetros por referência Quando você passa um parâmetro por referência, a nova memória não é alocada para o valor. Em vez disso, um ponteiro para a posição original da memória é passado. Todas as referências para o parâmetro são referências para posição original da memória. Alterações na variável dentro da sub-rotina atualizam a posição original da memória imediatamente. Com sub-rotinas internas (definidas no mesmo programa), há pouca diferença entre passar parâmetros por referência e acessar variáveis globais de dentro da sub-rotina. Ambos permitem que você altere o valor de uma variável global diretamente. Nas sub-rotinas externas e módulos de função, a passagem por referência é mais útil. Mesmo assim, passar parâmetros para uma sub-rotina – seja ela interna ou externa – é um bom estilo de programação, que torna a manutenção mais fácil e melhora a readaptabilidade de seu programa. As duas adições USING f1 e CHANGING f1 passam f1 por referência – elas são idênticas na função. A razão para que as duas existam é que – utilizadas adequadamente – podem documentar quando a sub-rotina mudará um parâmetro ou não. Passando parâmetros por valor Quando você passa um parâmetro por valor, uma nova memória é alocada para esse valor. Essa memória é alocada quando a sub-rotina é chamada e liberada quando a sub-rotina retorna. Portanto, as referências para o parâmetro são voltadas para uma única área da memória que é conhecida apenas dentro da sub-rotina; a posição original da memória está separada. O original está inalterado se você alterar o valor do parâmetro. Utilize a passagem por valor, quando você precisar de uma cópia local de uma variável que possa ser alterada sem afetar a original. A passagem por referência é mais eficiente que a passagem por valor. Utilize o método por referência, a menos que você precise de uma cópia local independente da variável.

c) Módulo de função O módulo de função é semelhante a uma rotina externa e será tratado em detalhes na apostila 2.

d) Include Já citado no tópico “Tipos de programas”: contém um trecho de definição ou código a ser incluído em um programa. Exemplo: REPORT ZLISTAFORNEC. INCLUDE ZXUPDA01. Quando da execução do programa, o conteúdo da include ZXUPDA01 é inserido dentro do report ZLISTAFORNEC. Lembre-se: o INCLUDE apenas copia um trecho de código para dentro de um programa.

e) Método Um método é semelhante a uma sub-rotina: ele representa um conjunto de comandos dentro do conceito de programação orientada a objeto. A programação orientada a objetos não será abordada neste material.

Page 26: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

26

f) Chamada de outro programa Um programa do tipo REPORT pode ser chamado de outro programa com a instrução SUBMIT. Esta forma de modularização é usada somente em casos muito específicos.

Dicionário de dados

Dicionário de Dados (DDIC)

O Dicionário de dados do SAP ERP (Data Dictionary – DDIC) é um utilitário para definir objetos de dados. Com o dicionário de dados, você pode criar e armazenar objetos como tabelas, estruturas e visualizações. A transação do dicionário 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 instruções para os bancos de dados. Por exemplo, você pode criar uma definição de tabela no DDIC. Quando você ativa a definição 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 definição de tabela no DDIC. Quando ativar a tabela novamente, mais SQL é gerado, fazendo com que o SGBD modifique a tabela.

Info: uma confusão muito comum dos iniciantes no SAP ERP refere-se a diferença entre dicionário de dados e banco de dados. De uma maneira simplificada, podemos entender o dicionário de dados do SAP ERP como uma máscara para enxergar as tabelas do banco de dados real (Oracle, por exemplo). Veja novamente no início deste documento o tópico “Arquitetura do SAP ERP”.

No SAP ERP uma tabela é uma coleção de linhas. Cada linha contém campos, também chamados de colunas. Normalmente, dentro de uma tabela, cada linha tem o mesmo número 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 permanecerão até serem alterados ou excluídos 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 descrição de uma tabela no banco de dados subjacente. Você não está olhando diretamente a própria tabela de banco de dados.

Page 27: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

27

Há no DDIC três tipos de tabelas: Transparentes, Pool e Cluster. O primeiro tipo é o mais comum e provavelmente será utilizado ao se criar uma nova tabela em customizações do sistema. Pool e cluster são tipos de armazenamentos proprietários da SAP. Segue abaixo uma comparação entre os três tipos de tabela: Transparente: Uma tabela transparente no dicionário tem relacionamento um-para-um com uma tabela no banco de dados. Sua estrutura no dicionário de dados do R/3 corresponde a uma única tabela de banco de dados. Para cada definição de tabela transparente no dicionário, há uma tabela associada no banco de dados. A tabela de banco de dados tem o mesmo nome, o mesmo número de campos e os campos têm os mesmos nomes que a definição de tabela do SAP ERP. Quando examinar a definição de uma tabela transparente do SAP ERP, você pode achar que está olhando para a própria 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 dicionário de dados do R/3. A tabela no banco de dados tem um nome diferente do das tabelas no dicionário de dados, tem um número de campos diferente e os campos também têm nomes diferentes. O DDIC utiliza pools de tabela para armazenar um grande número (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 necessários quando muitas tabelas pequenas têm de ser abertas ao mesmo tempo. Cluster: São utilizadas para armazenar dados de algumas (aproximadamente de 2 a 10) tabelas muito grandes. As tabelas de cluster são utilizadas quando essas tabelas tivessem uma parte de suas chaves primárias em comum e se os dados nessas tabelas fossem todos acessados simultaneamente. Os clusters de tabela contêm menos tabelas que os pools de tabela e, diferente dos pools de tabela, a chave primária de cada tabela dentro do cluster de tabelas começa com o mesmo campo ou campos. As linhas das tabelas de cluster são combinadas em uma única linha no cluster de tabelas. As linhas são combinadas com base na parte da chave primária que elas têm em comum. Assim, quando uma linha é lida de qualquer uma das tabelas no cluster, todas as linhas relacionadas em todas as tabelas de cluster também são recuperadas, mas apenas uma única operação de I/O é necessária. Um cluster é vantajoso no caso em que os dados são acessados a partir de múltiplas tabelas simultaneamente e essas tabelas têm pelo menos um de seus campos de chave primária em comum. As tabelas de cluster reduzem o número de leituras do banco de dados e assim melhoram o desempenho. As tabelas de pool e de cluster são normalmente utilizadas somente pela SAP e não pelos desenvolvimentos dos clientes, provavelmente por causa do formato proprietário dessas tabelas dentro do banco de dados e por causa das restrições técnicas colocadas sobre sua utilização dentro dos programas ABAP/4, como a seguir:

Não se podem criar índices secundários;

Não se pode utilizar SELECT DISTINCT ou GROUP BY;

Não se pode utilizar SQL nativo;

Não se podem especificar nomes de campos depois da cláusula ORDER BY. A única variação permitida é ORDER BY PRIMARY KEY;

No caso específico das tabelas de cluster, não é possível realizar leitura através de JOIN, nem a criação 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 contém rótulos de campo e a documentação on-line (também chamada ajuda F1) para o campo. Ele é puramente descritivo; contém as características semânticas para o campo, também conhecidas como “contexto do negócio”. Os rótulos que você oferece dentro de um elemento de dados serão exibidos na tela ao lado de um campo de entrada. O elemento de dados também contém documentação que é exibida quando o usuário pede ajuda nesse campo pressionando a tecla F1. Uma definição de elemento de dados pode exigir um domínio. O domínio contém a característica técnica de um campo, como o comprimento do campo e o tipo de dado. Os domínios e os elementos de dados são reutilizáveis. Um domínio 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 informações de cliente chamada ZCLIENTE que deve conter os números de telefone comercial, fax e residencial.

Page 28: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

28

Para criar um campo, você normalmente inicia criando um domínio para ele. Neste caso, você pode criar um domínio genérico de número de telefone, chamado ZFONE e dar a ele um tipo de dado de CHAR e um comprimento de 12. Isso seria um domínio genérico de número de telefone; a maioria dos tipos de números de telefone poderia ser armazenada utilizando-se esse domínio. Depois de criar o domínio para armazenar a descrição puramente técnica de um campo, você então cria um elemento de dados para armazenar os atributos descritivos do campo. No elemento de dados, você deve digitar o nome de um domínio para dar-lhe a característica técnica. Então, você insere os rótulos e a documentação (ajuda F1) para descrever os dados que você armazenará. Nesse exemplo, você criaria três elementos de dados, um para cada número de telefone (residencial, comercial e fax). Em cada elemento de dados, você digita rótulos de campo descrevendo o tipo de número de telefone que você armazenará com ele e a ajuda F1 para o usuário final. Tendo criado os elementos de dados, você agora pode criar a tabela. Você pode criar três campos de número de telefone na tabela (residencial, comercial e fax) e atribuir o elemento de dados correspondente a cada campo. Um elemento de dados é atribuído a cada campo. Isso oferece informações descritivas do campo do elemento de dados e informações técnicas do domínio a que ele faz referência. Quando o campo é utilizado em uma tela, ele obtém um rótulo e a documentação de ajuda F1 do elemento de dados e seu comprimento e tipo de dado formam o domínio dentro do elemento de dados. Se você precisa alterar o comprimento do campo depois que criou uma tabela, você apenas precisa alterá-lo no domínio. Se o domínio é utilizado em mais de uma tabela, a alteração é automaticamente propagada para todos os campos que utilizam esse domínio.

Criar ou reutilizar domínios e elementos de dados existentes? Uma instalação típica do SAP ERP tem por volta de 100.000 domínios preexistentes (isso mesmo, cem mil) e 400.000 elementos de dados. Quando você cria um novo campo, você deve decidir se cria um novo domínio e elemento de dados ou reutiliza um existente. Para tomar essa decisão, 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 domínio. Se seu campo deve ser dependente, reutilize um domínio existente. De forma similar, você deve reutilizar elementos de dados se seus rótulos de campo e documentação alterarem quando a SAP alterar os dela. Convenções para atribuição de nome para tabelas e seus componentes

Tipo de Objeto Comprimento máx. nome

Primeiro caractere permitido

Tabela 16 Y, Z

Elemento de dados 30 Y, Z

Domínio 30 Y, Z

Campo 16 Qualquer caractere

Os nomes de todas as tabelas, domínios e elementos de dados ou demais objetos criados no SAP ERP devem iniciar com Y ou Z. Você não pode utilizar qualquer outro caractere no começo; todos os outros são reservados pela SAP. O SAP ERP impõe essa convenção; você obterá uma mensagem de erro se tentar criar um objeto que tem um nome que não se adapte a essas convenções. Os nomes de campos podem começar com qualquer caractere. Entretanto, certas palavras são reservadas e não podem ser utilizadas como nomes de campo. A tabela TRESE contém a lista completa das palavras reservadas. Para acessá-la, use a transação SE16 SELECT

O comando SELECT é uma definição do padrão 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 próprias sintaxes dos comandos, baseado em um padrão mínimo (ANSI SQL). O SQL do Abap é chamado de Open SQL. Sintaxe simplificada SELECT <lista de campos> / SINGLE <lista de campos> FROM <tabela ou visão> INTO <destino da leitura> / INTO TABLE <tabela interna>

Page 29: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

29

WHERE <condição>

Info: logo após o comando SELECT teste o valor da variável de ambiente SY-SUBRC: se o valor for zero, pelo menos um registro foi lido; caso contrário 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 variáveis 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 cláusula 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 primária da tabela VBAP.

2) Lê todos os campos de um registro da tabela PA0001 e atribui o conteúdo à variável estruturada WA_INFOTIPO1, para a matrícula ‘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 visualização, melhor usar várias 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 cláusula SINGLE ou INTO TABLE não for informada, é necessário “fechar” o SELECT com ENDSELECT, pois a condição no WHERE indica a possível leitura de mais de um registro. A cláusula UP TO 1 ROWS é colocada aqui para limitar a quantidade de registros lidos, trazendo somente o primeiro registro que satisfaça à condição.

Cuidado! use o SELECT …. ENDSELECT somente quando precisar ler uma tabela onde você não tenha a chave completa do índice e retorne somente uma linha com a opção UP TO 1 ROWS. Caso contrário use SELECT...SINGLE ou SELECT .... INTO TABLE.

3) Lê vários 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ê vários registros da tabela MAKT e coloca o resultado na tabela interna T_DESC_MATERIAL. A condição de busca leva em conta todas as entradas da tabela interna T_MAT_REF:

SELECT MATNR MAKTX

Page 30: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

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 referência (T_MAT_REF no exemplo acima) tenha pelo menos uma linha. Se ela estiver vazia, todos os registros da tabela MAKT serão selecionados .

5) Lê vários registros da tabela MSEG e coloca o resultado na tabela interna T_MOVTO_MATERIAL. A

condição de busca do campo BWART está na variável 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 variável R_MOVTO é declarada com SELECT-OPTIONS na tela de seleção ou DATA... RANGE OF... Ela contém uma lista de um ou mais valores válidos para um tipo de dado. Exemplo: DATA R_MOVTO LIKE RANGE OF MSEG-BWART.

Tabelas internas Uma tabela interna é uma tabela temporária armazenada na memória do servidor do aplicativo. Ela é criada e preenchida por um programa durante a execução 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 idêntica, mas, diferentemente de uma tabela de banco de dados, ela não pode armazenar dados após o término do programa. Utilize a tabela interna como um armazenamento temporário para a manipulação de dados. Os iniciantes em Abap tem uma grande desconfiança da capacidade de tabelas internas, mas conseguimos manipular sem problemas tabelas internas com milhares de linhas. Muitos dos comandos de manipulação de tabelas de bancos de dados têm referência às tabelas internas (leitura e gravação). 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 variável de estruturada idêntica a uma linha da tabela interna. Todas as operações de recuperar, incluir ou alterar linhas são feitas usando a work área. A work área pode ser declarada de forma explicita ou implícita. Quando declarada de forma implícita, dizemos que a tabela interna tem linha de cabeçalho ou header line, e neste caso a work área tem o mesmo nome da tabela interna. Exemplos:

1) Declaração de uma tabela interna com linha de cabeçalho. A instrução abaixo declara 2 variáveis 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) Declaração de uma tabela interna sem linha de cabeçalho: DATA: T_MATERIAL TYPE TABLE OF MARA. Neste caso precisamos declarar explicitamente uma variável estruturada que serve de armazenamento temporário nas operações de leitura, inclusão e alteração de linhas. Exemplo de declaração de work área para tabela interna sem linha de cabeçalho: DATA: T_MATERIAL TYPE TABLE OF MARA, “ Tabela interna WA_MATERIAL TYPE MARA. “ Work área

Page 31: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

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) Declaração de tabela interna com linha de cabeçalho usando a cláusula 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 espaço necessário para as linhas da tabela interna. Use esta cláusula sempre com o valor 0.

Adicionando linhas a uma tabela interna Para adicionar uma única linha em uma tabela interna, você poderá utilizar a instrução 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 cabeçalho 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 cabeçalho). A work área WA_MATERIAL tem a linha a ser incluída:

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 cabeçalho):

T_MATERIAL-MATNR = ‘123445’. T_MATERIAL-UNIDADE_MEDIDA = ‘KG’. APPEND T_MATERIAL.

Depois de executado, o APPEND a variável de sistema SY-TABIX é configurada com o número de linha relativo da linha recém 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.

Page 32: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

32

A instrução APPEND INITIAL LINE to it acrescenta uma linha contendo valores iniciais (espaços em branco e zeros) à tabela interna. Equivale a executar as duas instruções a seguir em seqüência: CLEAR IT. “ Limpa a work área APPEND IT. “ Acrescenta a linha ao final da tabela

Cuidado!: se a tabela interna não tiver linha de cabeçalho, o comando CLEAR IT apagará todo o conteúdo da tabela interna (corpo). Uma maneira muito utilizada para fazer referência ao corpo da tabela interna é o uso de colchetes: o comando CLEAR IT[] apaga o corpo da tabela, tenha ela linha de cabeçalho ou não.

Lendo dados a partir de uma tabela interna Duas instruções são comumente utilizadas para a leitura dos dados a partir de uma tabela interna: LOOP AT / READ TABLE Utilize LOOP AT para ler várias linhas da tabela interna. Utilize READ TABLE para ler uma única linha. Lendo várias linhas utilizando a instrução LOOP AT Para ler algumas ou todas as linhas de uma tabela interna, você pode utilizar a instrução LOOP AT. LOOP AT lê o conteúdo da tabela interna, colocando as linhas do conteúdo, uma por vez, na área de trabalho (ou linha de cabeçalho) As linhas são lidas da tabela interna, uma por vez, e colocadas em seqüência na área de trabalho. As linhas de código entre LOOP AT e ENDLOOP são executadas para cada linha recuperada. O LOOP termina automaticamente quando a última linha é lida e a instrução após ENDLOOP é então executada.

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

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 cabeçalho):

LOOP AT T_MATERIAL INTO WA_MATERIAL. WRITE:/ WA_MATERIAL-MATNR, WA_MATERIAL-DESCRICAO. ENDLOOP. Dentro do LOOP, SY-TABIX contém o número de linha relativo do registro atual. Após 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 adições FROM e WHERE, você poderá restringir o número de linhas lidas da tabela interna. Embora WHERE retorne um subconjunto do conteúdo da tabela, uma varredura total da tabela será sempre executado (pesquisa seqüencial).

3) Percorrendo e imprimindo o valor de 2 campos da tabela interna T_MATERIAL (sem linha de cabeçalho), sob uma determinada condição:

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

Page 33: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

33

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

cabeçalho), 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 instrução 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 critérios específicos e a coloca em uma área de trabalho. Lembre-se que todas as operações de recuperação ou gravação de dados em um tabela interna devem ser feitas através 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:/ ‘Não encontrado’. ENDIF.

2) Recuperando a quinta linha da tabela interna T_MATERIAL (sem linha de cabeçalho) READ TABLE T_MATERIAL INTO WA_MATERIAL INDEX 5. IF SY-SUBRC = 0. WRITE:/ WA_MATERIAL-DESCRICAO. ELSE. WRITE:/ ‘Não 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 cláusula BINARY SEARCH:

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

Cuidado!: se a tabela interna não tiver classificada pela chave de busca, o interpretador Abap não retorna erro na adição 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, através de símbolos de campo (field-symbols). Usamos para isto a cláusula ASSIGNING em uma instrução READ ou LOOP. Um símbolo de campo é um ponteiro para a linha lida. Consulte a ajuda (F1) para mais detalhes.

Classificando o conteúdo de uma tabela interna Para classificar o conteúdo de uma tabela interna, utilize a instrução SORT. As linhas podem ser classificadas por uma ou mais colunas em ordem ascendente ou descendente. A própria seqüência de classificação pode também ser modificada. SORT T_CLIENTE BY NOME. “ Classifica a tabela interna T_CLIENTE pela coluna NOME. Determinando se uma tabela interna está vazia

Page 34: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

34

Para determinar se uma tabela interna contém quaisquer linhas, faça um teste do corpo com a seguinte instrução: 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 número de linhas em uma tabela interna DESCRIBE TABLE T_CLIENTE LINES V_LINHAS. “ Atualiza a variável V_LINHAS com o número de linhas da tabela interna. Inserindo linhas em uma tabela interna Para inserir uma única linha em uma tabela interna, em uma posição específica, utilize a instrução INSERT: INSERT WA_CLIENTE INTO T_CLIENTE INDEX 7. O commando anterior insere a work área WA_CLIENTE na sétima linha da tabela interna T_CLIENTE. As linhas existentes anteriormente a partir da linha 7 tem seu número acrescido de 1 (um).

Dica: Depois que cada instrução INSERT for executada, o sistema indexará novamente todas as linhas abaixo da inserida. Isso leva a uma queda de performance quando você insere linhas próximas ao início 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 serão novamente indexadas apenas uma única vez, depois que essa instrução for executada.

Modificando as linhas em uma tabela interna Para modificar o conteúdo de uma ou mais linhas de uma tabela interna, utilize a instrução MODIFY (sempre através de uma work-área). O comando MODIFY sempre precisa da indicação de qual linha deve alterar. Isto é indicado de uma das duas formas: a) explicitamente pela cláusula INDEX; b) implicitamente dentro de um loop.

1) Modificando a quinta linha da tabela interna TCLIENTE (sem linha de cabeçalho): MODIFY TCLIENTE FROM WA_CLIENTE INDEX 5.

2) Modificando a quinta linha da tabela interna TCLIENTE (com linha de cabeçalho) 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 conteúdo da tabela interna Para excluir o conteúdo de uma tabela interna, você poderá utilizar as seguintes instruções: FREE, REFRESH, CLEAR e DELETE.

1) FREE: exclui todas as linhas da tabela interna e libera a memória ocupada por ela FREE TCLIENTE.

Page 35: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

35

2) CLEAR e REFRESH: elimina todas as linhas da tabela interna. Para tabelas internas com linha de cabeçalho, CLEAR limpa a linha de cabeçalho. Estes comandos não liberam a memória usada pelas tabelas:

CLEAR TCLIENTE. “ Elimina todas as linhas, caso TCLIENTE não tenha linha de cabeçalho CLEAR TCLIENTE[]. “ Elimina todas as linhas, independente se houver ou não linha de cabeçalho REFRESH TCLIENTE. “ Idêntico a CLEAR TCLIENTE[].

Info: se a tabela interna TCLIENTE tiver linha de cabeçalho, os comandos CLEAR TCLIENTE[] e REFRESH TCLIENTE não alteram o conteúdo da linha de cabeçalho.

3) Eliminar linhas sob alguma condição:

DELETE TCLIENTE WHERE DATA_PAGTO <= SY-DATUM.

4) Eliminar a décima oitava linha da tabela interna: DELETE TCLIENTE INDEX 18.

5) Eliminando linhas de uma tabela interna dentro de um loop. A exclusão de uma linha não afeta o LOOP:

LOOP AT TCLIENTE. IF TCLIENTE-DATA_PAGTO > SY-DATUM. DELETE TCLIENTE. ENDIF. ENDLOOP. Preenchendo uma tabela interna utilizando collect Utilizando a instrução COLLECT será possível 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 padrão na área de trabalho. Os campos de chave padrão são 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. Não importa se estão uma ao lado do outro, ou se estão separados um do outro por outros campos. O sistema então pesquisará o corpo da tabela interna quanto a uma linha com a mesma chave daquela na área de trabalho. Se não localizar uma, a linha será acrescentada ao final da tabela. Se localizar uma, os campos numéricos (tipos i, p e f) na área de trabalho serão adicionados nos campos correspondentes da linha localizada.

Programas on-line (Pool de Módulos) Usamos programas do tipo M (Pool de Módulos) quando precisamos fornecer ao usuário SAP interfaces de tela mais elaboradas em relação aos programas do tipo Report. Os programas do tipo report, de uma maneira geral, fornecem 3 passos de processamento:

1 – Tela de seleção (um tela por programa): opções de seleção de informações para um relatório e/ou processamentos diversos (gravação em tabelas, consolidação de informações). Conseguimos montar mais de uma tela em um programa report, mas não é uma operação usual;

2 – Processamento: após a digitação de informações na tela de seleção, usamos o evento START-OF-SELECTION para codificar o tratamento destas informações;

3 - Saída: após o processamento, exibimos as informações lidas/calculadas (em tela e/ou impressora) ou consolidamos alguma informação em tabelas (“totalização das vendas do mês”, por exemplo).

Page 36: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

36

Esta apresentação simplificada do programa report atende a grande maioria das necessidades de desenvolvimentos de programas abap, mas não todas.

Quando precisamos utilizar mais de uma tela para exibição/entrada de informações e navegação 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 Módulos, Programas on-line ou Module Pool).

Programas do tipo M são dotados de uma grande capacidade de customização das telas (leia-se “editor gráfico”) e flexibilidade para criar uma interface mais amigável com o usuário.

Na maioria dos casos cada tela de um programa on-line contem os seguintes elementos:

Título;

Status GUI - conjunto de botões e menus. Lembre-se que as telas SAP tem local fixo para os botões: barra de botões padrão e barra de botões de aplicação (vide página seguinte);

Layout: campos para exibição e digitação;

Lógica de processamento (também conhecido como eventos de tela): o comandos para execução ANTES da tela ser exibida: Process Before Output – PBO; o comandos para execução DEPOIS de acionado um botão ou ação do usuário: Process After

Input – PAI. Se no PAI não 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

Observação: os eventos POV e POH não serão tratados neste documento.

O Título e o Status GUI são feitos de forma separada do desenho da tela. De forma geral, os passos para criação de um tela em abap são: 1 – Criamos a tela “vazia” (não necessariamente é o primeiro passo). Cada tela tem uma identificação numérica de 4 posições e sempre está associada a um programa. Podemos ter várias telas com o número 9100, mas em programas diferentes; 2 – Criamos o título e as ações (Status GUI) separados da tela. Estes elementos existem de forma independente da tela e no programa podem existir inúmeros títulos e Status GUI. Podemos até mesmo copiar estes elementos de outros programas existentes. Ratificando: o título e status GUI estão sempre associados a um programa, mas nunca a uma tela; 3 – Antes da tela ser exibida, informamos qual o título e o status GUI a ser usado, no PBO; 4 – Codificamos no PAI os resultados de cada ação do usuário, como por exemplo, um clique no botão salvar ou seleção de item no menu. Veja na figura abaixo as áreas de tela que manipulamos em um programa on-line:

Page 37: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

37

1 – Menu 2 – Barra de ferramentas padrão: TODAS as telas SAP tem exatamente os botões mostrados acima, mas eles ficam habilitados ou não dependendo da funcionalidade a qual a tela se destina; 3 – Barra de título: a identificação da tela sempre é exibida nesta posição; 4 – Barra de ferramentas de aplicação: muda a cada tela. Nesta barra colocamos os botões que criamos. Dependendo da tela, esta área pode estar vazia, sem nenhum botão; 5 – Área de layout: exibição e digitação de dados do usuário. Podemos colocar botões na área de layout, mas precisamos tomar o cuidado para deixar a funcionalidade da tela coerente com a informação exibida. No exemplo acima temos dois botões na área de layout, mas a funcionalidade deles refere-se exclusivamente aos campos “Nome” e “Domicílio Fiscal”. Estes botões são criados no editor gráfico. Concluindo:

O menu e as barras de botões (áreas 1, 2 e 4) são criados no Status GUI;

O título (conteúdo da área 3) é criado na opção “Títulos GUI”;

O layout da tela (área 5) é criado no editor gráfico. Criando um programa module-pool Vejamos um programa on-line para alterar o e-mail de um cliente: 1 - Use a transação SE80 para criar o programa on-line (module pool):

O nome de um programa on-line não-standard pode iniciar com a letra Z, mas a SAP recomenda usar o prefixo “SAPM” (em oposição ao prefixo “SAPL”, para programas on-line standard). Após informar o nome do programa tecle Enter. Surge a tela de confirmação:

Page 38: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

38

Após confirmar aparece a tela:

Deixe o checkbox “Com include TOP” marcado. Será criado automaticamente um novo include e ele será colocado no início do programa. Usamos este include para declaração de variáveis do programa module-pool. Após confirmar aparece a tela com a sugestão para o nome do include:

Observe a sugestão: 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: declaração de variáveis (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 módulos:

Page 39: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

39

Observação: é possível criar telas em um programa tipo Report, mas não é usual. Uma exceção ocorre quando em um programa report precisamos de um elemento disponível apenas no editor gráfico (por exemplo, uma caixa de texto ou um relatório 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):

Após a criação, o lado esquerdo do painel mostra a árvore de objetos do programa on-line:

Page 40: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

40

Observação: a cor azul no nome do programa e no nome do include indica que não foram ativados. Criando uma tela Posicione o cursor sobre o nome do programa e use o menu de contexto (botão direito do mouse) para criar uma tela:

Informe o número da tela:

Page 41: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

41

A SAP recomenda que as telas de usuário iniciem com a numeração 9000, apesar de não haver restrições com outra numeração. Veja o que diz a ajuda do campo “N° tela” (aparece ao teclar F1):

Na aba “Características” informe a descrição breve para a tela (campo obrigatório). Esta descrição breve não aparece quando a tela é exibida, serve apenas como documentação.

Page 42: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

42

Informe na aba “Lista elems.” o campo “OKCODE”. Esta variável armazenará o valor da ação do usuário na tela (clique de um botão, por exemplo). Veremos esta variável mais adiante neste documento:

Clique agora na aba “LógProcmto”. Observe que o SAP cria o modelo da lógica de processamento (inicialmente com os MODULEs comentados). O comando MODULE para a lógica de processamento é como um PERFORM para um programa abap. Refere-se a chamada de uma “rotina” de tela. Os comandos que colocamos na lógica de processamento são específicos para telas: não é 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 variável OKCODE. Selecione o include TOP criado (clique-duplo sobre o nome MZALTERA_EMAILTOP) e declare a variável OKCODE conforme abaixo:

Page 43: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

43

Selecione a tela 9100 no painel esquerdo e clique no botão “Layout”:

Aparece o editor gráfico:

Page 44: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

44

Há duas formas de colocar elementos nesta tela. A primeira consiste em selecionar o elemento desejado (por

exemplo, um texto no símbolo 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 dicionário 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 seleção de campos. Informe a tabela SCUSTOM e tecle Enter. Em seguida selecione os campos abaixo (clicando na coluna à esquerda de cada campo):

Page 45: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

45

Coloque os campos selecionados à esquerda da tela:

Clique no campo de digitação do número do cliente e veja o nome do campo. Como foi feita uma cópia a partir do dicionário de dados, o SAP sugere o nome SCUSTOM-ID para o campo. Lembre que para cada nome de campo alterável da tela deve ter uma variável de mesmo nome declarada no programa. Você pode usar o nome sugerido pela SAP ou alterá-lo. A falta da declaração da variável é um erro muito comum em iniciantes, pois a compilação/ativação não detecta erro neste caso (realmente não é um erro, as variáveis de tela e de programa existem de forma independente).

Este programa tem a intenção de alterar o e-mail de um cliente. Portanto, o campo de nome do cliente não pode estar habilitado para alteração, somente para exibição. Além disso, o número do cliente é digitação obrigatória. Primeiro marque o número do cliente como campo obrigatório. Selecione o campo de número do cliente e tecle F2 ou use o clique-duplo sobre ele. Selecione “required” conforme mostrado:

Page 46: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

46

Na aba dicionário, desmarque o flag “Verificação de chave externa”:

Deixe o campo nome do cliente apenas como exibição, desmarcando o flag “Campo de entrada” (figura abaixo). Toda informação variável que você precisar exibir deve usar o elemento de tela “campo de entrada e

saída” ( .) O campo de texto ( ) sempre representa um valor fixo e não pode ser alterado:

Page 47: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

47

Volte para a tela anterior e clique no botão salvar. Criando um título para a tela Use o menu de contexto (botão direito do mouse) e selecione “Títulos GUI”:

Informe o “Code título” e o “Título”:

Criando uma transação para o programa Um programa on-line só pode ser executado se tiver uma transação associada a ele. Novamente use o botão direito do mouse:

Page 48: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

48

Informe o código da transação e o texto breve. O texto breve serve como documentação, ele não será exibido na tela:

O código da transação DEVE iniciar pela letra Z ou Y. Informe o nome do programa e a tela inicial:

Page 49: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

49

Já criamos a tela, o título e a transação. Podemos até executar a transação ZALT_EMAIL para visualizar a tela, mas não teremos nenhum processamento, pois falta o Status GUI. Veja a chamada da transação ZALT_EMAIL até agora. Observe que não há botões disponíveis e também não há título:

Criando o Status GUI O Status GUI representa as ações possíveis para a tela. A cada ação associamos um “código de função”. É com o código de função que identificamos dentro do programa qual botão foi pressionado. Podemos ter vários Status GUI em um programa on-line, cada um com um conjunto de ações. Neste exemplo colocaremos 3 botões:

Voltar ( ): encerra o programa. Código de função: VOLTAR

Salvar ( ): grava o e-mail informado. Código de função: GRAVAR

Buscar ( ): a partir do código do cliente informado na tela, busca na tabela de cliente (SCUSTOM) os dados do cliente. Código de função: PESQUISAR Os dois primeiros botões estão na barra de botões padrão; o botão buscar será colocado na barra de botões de aplicação. Use o menu de contexto (clique com o botão direito do mouse) para criar o status GUI:

Page 50: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

50

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

A barra de ferramentas padrão contém os botões mais usados, mas para fazê-los disponíveis para o usuário precisamos definir o “Código de função”. Cada “Código de função” deve ter um conjunto de teclas de atalho associado (CTRL+F5, por exemplo). O nome do código de função é usado na lógica 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 opção “Teclas de função”, conforme mostrado. Informe o código de

função VOLTAR para o botão : Lembre de gravar a sua alteração:

Page 51: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

51

Coloque agora o código de função GRAVAR, como mostrado abaixo:

Dê um clique duplo no código de função VOLTAR e altere o tipo de função para “E”. Esta operação indica que podemos ter um MODULE exclusivo para este botão (será explicado mais adiante):

Observação importante: não crie botões desnecessários na sua tela. Se a sua tela tem a funcionalidade de

“gravação”, use o botão da barra de ferramentas padrão.

Page 52: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

52

Coloque agora o botão “Pesquisar” na barra de botões de aplicação. Informe o código de função e tecle Enter:

Aparece a tela solicitando o texto. Tecle Enter:

Informe o texto para aparecer no botão e tecle Enter. Nesta tela podemos informar também um ícone para o botão. Atenção! O código de função deste botão é “PESQUISAR”, mas o nome que aparecerá na tela é “Busca”:

Toda ação 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:

Page 53: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

53

Observe que as ações da barra de ferramentas padrão tem teclas de atalho pré-definidas: F3 para voltar

( ), Ctrl+S para salvar ( ) e outros. Criando a lógica de processamento – PBO Após criar o título e status GUI (botões) do nosso programa, precisamos associá-los à tela que foi criada. Selecione a lógica de processamento da tela e retire o comentário 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 não tiver sido criado). Observe que este é um nome sugerido para o module, mas podemos trocá-lo. Se você não salvou sua alteração anterior, o SAP pedirá para salvar:

Page 54: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

54

O SAP sugere o nome MZALTERA_EMAIL_STATUS_9100O01 para o include, mas não precisamos seguir este nome. Observe que o nome sugerido contém 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 não parecer que teríamos somente o module STATUS_9100 neste include. Ficamos assim:

Após a confirmação vemos o lembrete da colocação do include no programa principal. Tecle Enter nesta tela:

Page 55: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

55

Lembre-se que o processamento do module STATUS_9100 será feito ANTES da tela ser exibida (Process Before Output). O próximo passo é a codificação 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 título:

Retire os comentários do module, informando o status GUI e título nos comandos, sempre em letras maiúsculas. O código final deste module deve ficar assim:

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

Page 56: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

56

Ative agora todo o programa, com o botão direito do mouse:

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

Page 57: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

57

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

Veja a tela após acionar a transação ZALT_EMAIL:

Page 58: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

58

Observe:

Os botões VOLTAR ( ), GRAVAR ( ) e PESQUISAR ( ) estão ativos devido ao comando SET PF-STATUS;

O título “Alteração de e-mail” apareceu devido ao comando SET TITLEBAR;

O N° cliente é campo obrigatório ( );

O Nome do cliente é campo somente para exibição. Criando a lógica de processamento – PAI Até agora finalizamos os passos necessários para a exibição da tela. Desenhamos o layout, títulos e botões da tela, mas não codificamos nenhuma ação do usuário. Vamos agora colocar algum código para responder às ações do usuário (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 usuário para a tela 9100”):

Confirme a criação:

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

Page 59: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

59

Confirme a mensagem seguinte com um Enter:

A tela de edição do module aparece:

Toda vez que o usuário teclar Enter, clicar um botão ou acionar um item do menu, os comandos dentro do module USER_COMMAND_9100 serão executados. Estas ações possíveis do usuário são os códigos de função definidos no status GUI. Lembrando os códigos de função já definidos:

Page 60: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

60

Ao acionar um dos botões acima, a variável OKCODE (vide página 41 para lembrar sobre esta variável) será preenchida com algum dos valores acima (PESQUISAR, GRAVAR ou VOLTAR). Portanto, no module USER_COMMAND_9100 questionamos o valor desta variável e executamos a ação desejada pelo usuário. Codifique o module conforme mostrado abaixo e salve seu trabalho. Cuidado ao escrever os literais, coloque-os em letras maiúsculas:

Agora criamos as rotinas BUSCA_CLIENTE e ATUALIZA_EMAIL. Estas rotinas serão 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:

Page 61: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

61

Altere o nome do include para MZALTERA_EMAIL_F01 e tecle Enter:

Após a confirmação aparece o aviso. Tecle Enter:

Codifique a rotina conforme abaixo (abaixo da figura está o código-fonte para você copiar/colar):

Page 62: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

62

FORM busca_cliente .

SELECT SINGLE *

FROM scustom

WHERE id = scustom-id.

IF sy-subrc <> 0.

CLEAR scustom.

ENDIF.

ENDFORM. " BUSCA_CLIENTE

Explicando o código: a variável SCUSTOM-ID recebe da tela o valor digitado para o código de cliente. Para declarar esta variável coloque no include TOP: TABLES SCUSTOM, conforme mostrado abaixo.

Observação: a declaração TABLES não significa necessariamente que vamos usar a tabela SCUSTOM no programa. Podemos ler e gravar na tabela SCUSTOM sem usar esta declaração. Basicamente a declaração TABLES indica duas coisas:

Cria uma variável estruturada de mesmo nome e tipo da tabela transparente SCUSTOM;

Se a work área em comandos do open SQL for omitida, esta variável será usada. Portanto, os códigos abaixo produzem o mesmo efeito: Código 1: SELECT SINGLE * FROM SCUSTOM WHERE ID = ‘00003404’. Código 2: SELECT SINGLE * FROM SCUSTOM INTO SCUSTOM WHERE ID = ‘00003404’. O código 1 só pode ser usado se houver a declaração TABLES. Se você não usar a declaração TABLES, é necessário 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:

Page 63: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

63

Confirme a criação 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.

Page 64: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

64

ENDFORM. " ATUALIZA_EMAIL

Ative todos os seus objetos (páginas 54). Use a transação ZALT_EMAIL para testar o seu programa. Na tela da transação ZALT_EMAIL:

Informe o código do cliente (ou use o search-help do campo) e tecle o botão PESQUISAR ( );

Se o cliente existir, o nome e e-mail devem aparecer na tela. Caso contrário todos os campos da tela serão apagados, inclusive o código digitado;

Altere o e-mail e clique no botão Salvar ( ). Saia da transação e entre novamente, selecionando o mesmo cliente. Clique no botão Buscar: o novo e-mail deve aparecer na tela;

Deixe o campo código em branco e tecle o botão Voltar ( ). O que aconteceu? Module de saída – AT EXIT-COMMAND Na montagem do layout da tela, marcamos o campo código como obrigatório (vide página 44). Se ele não for informado, não conseguimos abandonar a tela usando o botão VOLTAR, pois o SAP emitirá a mensagem “Preencher todos os campos obrigatórios”. A opção AT EXIT-COMMAND em um module do PAI indica que, mesmo com campos obrigatórios, o module será executado ANTES de qualquer verificação de tela. Desta forma conseguimos colocar código de saída da tela. Atenção: um module com a opção AT EXIT-COMMAND será executado somente se o botão tiver com o tipo E (vide página 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:

Page 65: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

65

Coloque o comando de saída no module. Aproveite para ativar o programa:

A partir de agora o clique no botão Voltar ( ) acionará o module SAIDA_DA_TELA antes de qualquer outro module do PAI. O comando LEAVE PROGRAM no module USER_COMMAND_9100 não é mais necessário. Edite o module USER_COMMAND_9100 e retire este código, conforme mostrado abaixo:

Após ativar todo o programa faça o teste: entre na transação, deixe o campo código em branco e tecle o botão Voltar. Esta ação deverá mostrar a tela inicial do SAP.

Page 66: Curso ABAP 1 de 2

Camilo Veloso – Workshop Abap [email protected] / [email protected]

66

CONSIDERAÇÕES FINAIS

O exemplo citado neste roteiro altera diretamente uma tabela standard, a SCUSTOM. Lembre que alterações diretas em tabelas standard são procedimentos raros em programação abap;

Os erros mais comuns para iniciantes no desenvolvimento de programas on-line são: o Esquecer de ativar algum elemento do programa (include, tela, status gui); o Omitir o campo OKCODE na lista de elementos da tela; o Não declarar no programa as variáveis de tela. Se você fizer isto, a compilação não apresenta

erro, pois as variáveis de tela e de programa existem de forma independente; o Declarar variável no programa com nome diferente da variável de tela; o Não codificar os modules ou nomeá-los de forma diferente daquela que consta na lógica de

processamento. A compilação não apresenta erro se você escrever MODULE na lógica de processamento e não existir código para ele;

Uma boa ferramenta de aprendizado para programas on-line (e outros também...) é o debug. Use-o antes de acionar um comando de tela (com o /H) e inspecione os valores das variáveis no PBO e PAI, principalmente o OKCODE. Logo você descobrirá a necessidade de limpá-la no PBO, pois se não definimos um código de função para a tecla Enter, o OKCODE mantém o último código de função selecionado;

Coloque agora no seu programa uma validação no campo de e-mail. Por exemplo, emita uma mensagem de erro caso o endereço de e-mail digitado não contenha um “@”. Para isto você precisará do comando FIELD no PAI;

Crie um novo botão Detalhe (código de função DETALHE) para exibir em uma outra tela (9200, por exemplo) os outros dados do cliente: endereço, cidade, telefone, forma de tratamento. Use o comando CALL SCREEN ou SET SCREEN/LEAVE SCREEN para chamar a tela 9200.