ABAP 101

Dando seus primeiros passos no mundo ABAP.

ABAP 101 header image 1

Validação de Números e Letras

July 3rd, 2008 · No Comments

Problema

Criar um programa ABAP que receba o valor da placa do veículo e imprima na tela qual o dia do rodízio na cidade de São Paulo. Se a placa não for no formato AAANNNN, deverá ser impresso uma mensagem de erro.

[Read more →]

→ No CommentsTags: Receita ABAP · Tecnica de Programação

Questão sobre Classes Globais

May 20th, 2008 · No Comments

Questão de certificação:

Identify the statement about Global Classes that is NOT true:

  1. A method to be transported is identified in transport organiser as LIMU METH
  2. Access to a global class is done as a reference variable using TYPE REF TO
  3. Global classes are stored in TADIR with key R3TR CLAS
  4. Programs that are available to Global Classes must be associated in Class Builder
  5. Class Builder can be used to test global classes

Comentários

A questão quer saber se você sabe alguns aspectos sobre Classes Globais:

1. A method to be transported is identified in transport organiser as LIMU METH

Correta. Um método de uma classe global é identificado como LIMU e METH no sistema de transporte do SAP. É uma questão fácil, quando você tem alguma experiência em ABAP. Para quem não têm nenhuma experiência, vai precisar ser um pouco mais astuto.

Vamos pensar nos dois tipos de classes, globais e locais. As classes locais estão em um programa ou include, ou seja, quando alteramos um método, o objeto que será transportado será o programa ou o inclulde, não o método em questão.

Já para as classes globais, quando alteramos um método, o próprio método é tratado com um objeto específico. Dica: na tela de edição da implementação do método, temos o botão de ativação, que atua somente no método. Isso é o indicativo que o método é tratado como um objeto SAP independente.

2. Access to a global class is done as a reference variable using TYPE REF TO

Correto. Os objetos criados de classes globais são acessados usando vairáveis de referência criadas com TYPE REF TO, como qualquer outro objeto.

3. Global classes are stored in TADIR with key R3TR CLAS

Correto. TADIR é uma tabela transparente que armazena a identificação de todos os objetos transportáveis do sistema (Directory of Repository Objects). Se você olhar o conteúdo dessa tabela (SE16), você verá que as classes são armazenadas como R3TR CLAS.

4. Programs that are available to Global Classes must be associated in Class Builder

Errado. Classes globais não precisam de nenhuma referência prévia para usá-la.

5. Class Builder can be used to test global classes

Correto. É uma funcionalidade do Class Builder (SE24). É possível criar uma instância, carregar os seus atributos e rodar os métodos.

Resposta correta: 4

→ No CommentsTags: Questão Comentada

What is the Effect of not Typing Formal parameters in a Form?

May 14th, 2008 · 2 Comments

Questão de Certificação:

What is the Effect of not Typing Formal parameters in a Form?

  1. Forms are less flexible and are guaranteed no chance of a run time error
  2. Conversion never occurs
  3. No effect
  4. Conversion always occurs
  5. Forms are more flexible but prone to a short dump if conversion does not work

Vamos analisar todas as alternativas:

1. Forms are less flexible and are guaranteed no chance of a run time error

Errado. Os forms são MAIS flexíveis do que outras chamadas, como de módulo de função e método. Cuidado, mesmo assim eles não garantem que não tenhamos erros em tempo de execução.

2. Conversion never occurs

3. Conversion always occurs

Errado. Algumas conversões de tipos são aceitas, mas nem todas.

3. No effect

5. Forms are more flexible but prone to a short dump if conversion does not work

A vantagem de se especificar o tipo do parâmetro no form é a verificação de compatibilidade de tipos no momento da verificação de sintaxe.

Se você não especificar nenhum parâmetro, essa verificação será feita em tempo de execução. Novamente cuidade, eles não garantem que evitaremos erros em tempo de execução por causa de conversão de tipos.

Conclusão:

A resposta correta: 5.

Segue abaixo um comentário extraído do Help da SAP:

If you have specified the type of the formal parameters, the system checks that the corresponding actual parameters are compatible when the subroutine is called. For internal subroutines, the system checks this in the syntax check. For external subroutines, the check cannot occur until runtime.

By specifying the type, you ensure that a subroutine always works with the correct data type. Generic formal parameters allow a large degree of freedom when you call subroutines, since you can pass data of any type. This restricts accordingly the options for processing data in the subroutine, since the operations must be valid for all data types. For example, assigning one data object to another may not even be possible for all data types. If you specify the types of subroutine parameters, you can perform a much wider range of operations, since only the data appropriate to those operations can be passed in the call. If you want to process structured data objects component by component in a subroutine, you must specify the type of the parameter.

Referências:

SAP Help - The Parameter Interface

→ 2 CommentsTags: Questão Comentada

O que um ERP faz? - Parte 2

April 28th, 2008 · 1 Comment

Continuando a nossa discussão sobre ERP, vamos explorar mais sobre os processos dentro de uma empresa.

Aquela empresa do Zé da Esquina, ela precisa vender seus produtos para seus clientes, então pensando nisso, temos as possíveis funcionalidades necessárias:

  • Disponibilizar os produtos, seja por site, catálogo, mercado ou loja.
  • Ter um processo simples de fechamento de compra.
  • Emitir um recibo ou nota fiscal.
  • Entregar o produto.

Estas são funcionalidades obvias, mas você sabe o que está por trás disso? É ai que você entra, caro Abapeiro! Seus programas fazem parte de um sistema integrado que vai controlar e garantir que a empresa irá disponibilizar, faturar e entregar seus produtos aos seus clientes. Ou seja, é coisa séria e deve ser tratado como tal.

Então, por trás desse processo de vendas temos o seguinte:

  • Controle de estoque, planejamento de demanda, para poder dizer ao cliente quando ele terá o produto disponível.
  • Processo de precificação (ou pricing), que levará em conta acordos comerciais complexos e impostos mais complexos ainda.
  • Controle de produção, apontamento de produção, controle de insumos, o que, quando e quanto produzir de um determinado produto.
  • Produto fabricado e vendido, precisa ser entregue no prazo, com qualidade e levando em conta a forma de carregamento. Entregar 10 toneladas de chapas de aço é uma coisa bem diferente do entregar sorvete (principalmente em uma cidade como São Paulo).
  • Não acaba por ai, produto entregue, temos o chamado pós-venda. Atendimento ao cliente, como captação de feedback, reclamação, devolução, troca etc.
  • Fazendo tudo isso temos funcionários, que precisam ser pagos. Nesse pagamento, é necessário levar em consideração benefícios, impostos, bônus, férias etc.
  • Também temos todo o maquinário que precisa ser administrado (controle de ativos, contabilização de depreciação).
  • Tudos esses processos custam muito a empresa. Nenhuma empresa sobrevive sem um controle financeiro robusto. Esse controle precisa incluir tesouraria, contabilidade, controladoria, controle de ativos, classificação de custos etc.
  • Além de tudo isso, a empresa precisa desenvolver novos produtos com novos projetos internos, que também precisam de todo o controle descritos acima.

Isso foi apenas uma amostra extremamente simplista. Para cada item podemos ter módulos inteiros do SAP controlando cada parte da empresa. O segredo de tudo isso está na palavra “integração”, ou seja, tudo que listei acima, tem que estar interligado, ou seja, uma simples compra de material pode desencadear uma outra série de processos:

  • Cotação de preços.
  • Solicitação de Compra (ordem de compra).
  • Entrada e movimentação de mercadoria.
  • Contabilização de financeira da entrada de mercadoria.
  • Pagamento e contabilização do fornecedor.

Ou seja, numa simples compra de mercadoria, temos vários módulos (MM, FI e PP) interagindo e garantindo um sistema coeso e único.

Então, pense bem antes de começar o seu programinha ABAP. Tente entender onde, no processo produtivo da empresa, ele está inserido. Para que serve, o que ele vai melhorar o trabalho do usuário final, como será usado. Com certeza isso fará você desenvolver programas muito melhores, além de você entender mais sobre a empresa que você está servindo.

Onde você encontra esse tipo de informação? Com os consultores funcionais. Na minha vida como desenvolvedor ABAP, eu encontrei todo tipo de funcional, mas a grande maioria gosta de emplicar detalhes do processo para o “cara de ABAP”. Perguntando, o funcional vê que você não é um programadorzinho, mas um desenvolvedor de solução, interessado em ajudá-lo a resolver um problema do usuário.

Pergunte sempre. A curiosidade DEVE ser uma característica de todo BOM desenvolvedor.

→ 1 CommentTags: Processo de Negócio

O que um ERP faz? - Parte 1

April 23rd, 2008 · No Comments

Uma das maiores dificuldades para os ABAPeiros inexperiêntes (e até mesmo experientes) é ter um conhecimento geral dos processos que eles estão trabalhando.

Cansei de ver programadores trabalharem horas a fio sem saber exatamente qual a utilidade do seu programa. Não estou dizendo o que ele faz, mas em qual processo no dia-a-dia do usuário ele está inserido.

Trabalhamos com um sistema integrado, chamado de Enteprise Resouce Planning, ou mais conhecido como ERP. Sabemos o que a sigla significa, mas sabemos o realmente o que um ERP faz? Pois bem, vou explicar para que serve um ERP.

O principal objetivo de qualquer empresa é gerar lucros para seus donos (acionistas, sócios etc.). Quando uma empresa pára de ser lucrativa e passa a ser deficitária, ela vai a falência, pois ela não consegue honrar com seus compromissos financeiros com funcionários, fornecedores e credores, e não consegue mais fornecer seus produtos a seus clientes.

Ou seja, pense em uma empresa como descrito abaixo:

Processo Geral de Uma Empresa

Ou seja, uma empresa processa recursos, como matéria-prima, máquinas, energia elétrica, pessoal etc., executa alguma transformação e entrega um produto do outro lado para o cliente. Esse processo pode ser simples, mas pode ser muito complicado e grande, como a cadeia produtiva de automóveis e produtos alimentícios.

Para cada passo, temos controles financeiros, logisticos, produtivos, pessoal etc.

Quando tempos uma empresa pequena, essa cadeia de processos é muito simples, muitas vezes executada e controlada por uma pessoa apenas, como por exemplo, consultores, médicos, autonomos, etc. Mas o “bicho pega” quando esses processos começam a ficar complexos, havendo a necessidade de colocar um pouco de controle a esse caos. Nesse ponto entra o software ERP, ou seja, um software feito para planejar e controlar os recursos da empresa.

Na segunda parte do artigo, vamos conversar mais sobre para que serve um ERP e explorar um pouco mais o que está dentro da caixa “Empresa do Zé da Esquina”.

→ No CommentsTags: Processo de Negócio

O Que São Dispacher e Workprocess?

April 19th, 2008 · 3 Comments

Dispacher e Workprocess (WP) são componentes do SAP Web Application Server (WAS).

Workprocess e Dispacher

Figura 1 - Dispacher e Workprocess.

Os WPs são responsáveis por executar as diversas tarefas dentro do sistema. Então temos o dispacher que recebe todas as requisições (seja por ação do usuário, ou por execução do batch job, ou algum updade de banco de dados, ou qualquer outra ação dentro do sistema). O dispacher designa o WP responsável por responder aquela requisição.

Temos diversos tipos de WP, dependendo da tarefa a ser realizada. Entre na transação SE53, e você visualizará os WP usados na instalação atual de onde você está logado.

SE53 - Process overview

Figura 2 - SM50 - Process overview.

Os tipos de WP são para atender uma necessidade de especialização, ou seja, as tarefas necessárias para responder uma requisição do usuário são diferentes das requisições de execução de programa em backgound e que são diferentes das requisições de update em banco de dados e assim por diante.

Basis (nome geralmente dado para equipe que cuida da infra-estrutura do SAP) designa mais WP de Dialog (DIA), pois esse tipo de requisição são as mais usadas, seguido do tipo BGD.

→ 3 CommentsTags: Conceitos · Configuração e Ambiente

Regras de Ouro do Acesso ao Banco de Dados.

April 16th, 2008 · 2 Comments

Em programação ABAP ou em qualquer outra linguagem, devemos ter grandes preocupações com a performance, ou seja, no tempo que o programa leva para retornar algum resultado ao usuário.

Na maioria dos casos de problemas de performance em ABAP, o grande vilão é o acesso ao banco de dados. Um programa com acessoo ao banco feito de maneira não performática, não atentando para regras básicas, pode causar muita dor de cabeça quando chegar em produção.

É muito comum, um programa rodar perfeitamente bem em ambientes de desenvolvimento e chegar na produção, termos muita demora e até short dump por time out. Isso porque em desenvolvimento a quantidade de dados não é significativa. Ou seja, um relatório que retorna 100 linhas em desenvolvimento, pode retornar 500.000 em produção.

Uma série de técnicas são adotadas na hora de fazer seus acessos ao banco de dados. Para resumir, temos as 5 Regras de Ouro do Acesso ao Banco de Dados:

1 - Mantenha o número de linhas baixo.

2 - Mantenha a quantidade de dados transferido do banco de dados baixo.

3 - Mantenha o número de acessos ao banco de dados baixo.

4 - Mantenha o esforço de busca baixo.

5 - Mantenha a carga do banco de dados baixa.

Com essas 5 regrinhas na cabeça, fica fácil de identificar quando estamos fazendo um SELECT que será uma verdadeira bomba em produção.

Em posts futuros em vou detalhar os 5 itens, com exemplos e ferramentas que o R/3 nos fornece para analisar programas e identificar problemas de performance.

→ 2 CommentsTags: Conceitos · Performance · Tecnica de Programação

Aula Inaugural ABAP Objects

April 14th, 2008 · No Comments

O que qualquer pessoa que começa o curso ABAP Workbench do SAP Professionals precisa saber antes de começar o curso? Alguma literatura, paper, artigo, site etc?

São dúvidas comuns a quase todos os alunos inscritos no curso. Nesse post vou colocar algumas informações úteis sobre a linguagem, algumas características e o quais os pontos em que os alunos têm mais problemas de entendimento.

O ABAP Objects é uma linguagem proprietária, executada em um sistema proprietário e não pode ser aplicada em nenhum outro ambiente. Foi escrita originalmente para desenvolver relatórios, logo foi extendida para desenvolver aplicativos de negócio. O que ela faz muito bem.

ABAP Objects é interpretada e hoje todas as aplicações no R/3 são escritas em ABAP Objects. Somente a parte do kernel (gerenciamento de memória, acesso a disco etc.) é feito em C/C++.

O ABAP Objects é uma extensão do ABAP/4 para incluir as funcionalidades de orientação a objeto.

Não é necessário nenhuma outra biblioteca externa de código para funcionar. Graças ao repositório, tudo o que você precisa (programas, classes, funções etc.) já está disponível globalmente no sistema. Umas das coisas mais legais do Workbench (ambiente de desenvolvimento) é a capacidade de navegar pelos diversos objetos com apenas um duplo clique. Ou seja, se você tem uma variável e deseja ver com ela foi declarada, é só dar um duplo clique e o editor ABAP coloca o cursos na declaração da mesma. Isso é fantástico! Isso deixa o pessoal de Eclipse e .Net babando ;-)

É muito fácil depurar (ou “debugar) um programa. É possível debugar qualquer programa, seja standard ou em produção. É possível visualizar qualquer código de programa, mesmo código standard SAP.

O ABAP possui um ótimo suporte a acesso a banco de dados usando o Open SQL. O interpretador traduz as instruções Open SQL para o SQL nativo (Oracle, DB2, SQL Server etc.). Isso garante 100% de portabilidade dos programas. É 100% garantido que qualquer comando Open SQL irá funcionar em qualquer ambiente SAP, sem necessidade de ajuste no comando. Outra coisa espetacular!

String de conecção de banco de dados? Comandos do tipo DB.open.dataset(”banco qualquer”).comando_complicado? Esqueça. Apenas SELECT * FROM sflight INTO TABLE t_sflight. Pronto, seu SELECT já está feito!

A maior parte dos programas ABAP Objects seguem o fluxo:

  • Tela de Seleção
  • Validação da tela de seleção
  • Seleção dos dados no banco de dados
  • Processamento dos dados selecionados
  • Apresentação de um relatório

Programa com Tela de seleção, processamento e apresentação de relatório, você encontra no exemplo de calculadora em ABAP.

Lógico que não existe somente programas do tipo report (como descrito acima), existem outros, como Module Pool, Function Modules, Exits etc. Todos eles escritos em ABAP.

O curso é exetenso e cansativo. Demanda dedical total por parte do aluno e é muito puxado. Mas quantidade de material é muito extensa e fornece TODA a base para programar em ABAP.

O público das aulas é muito heterogênio, variando de pessoas vindas do mundo mainframe, web, PL/SLQ, Microsiga etc. Cada um desses públicos têm dificuldades em pontos diferentes, mas que no final todos acabam aprendendo bastante.

Para maiores informações acessem: KA Solutions.

→ No CommentsTags: Anotação de Aula

Alterando Dados nas Tabelas Transparentes

April 10th, 2008 · 1 Comment

Problema

Inserir, modificar e alterar dados em tabelas transparentes.

Solução

Os comandos Open SQL para modificar dados em tabelas transparentes são INSERT, UPDATE, MODIFY e DELETE.

Todos os comandos incluem formas de atualizar linhas individuais e várias linhas de uma vez.

INSERT INTO spfli VALUES wa_spfli

ou

INSERT spfli FROM wa_spfli.

Os dois comandos acima tem o mesmo resultado, insere o conteúdo da work area wa_spfli na tabela spfli. Esta operação somente é possível se a chave ainda não existe na tabela. Caso contrário, o sy-subrc será 4.

INSERT spfli FROM TABLE it_spfli.

Este comando insere todas as linhas da tabela interna it_spfli na tabela spfli. Se alguma chave já existir, o programa será terminado com short dump. Para evitar isso adicione … ACCEPTING DUPLICATE KEYS. Dessa maneira as linhas da internal table que já existirem, simplesmente não serão incluidas e o sy-subrc será 4. O número de linhas adicionadas pode ser consultado pelo sy-dbcnt.

UPDATE sflight
SET plante type = …
price = …
WHERE …

Com esse comando, a tabela sflight terá todas as linhas seleciondas pela cláusula WHERE, de acordo com a cláusula SET. Sem a cláusula WHERE todas as linhas da tabela serão alteradas.

UPDATE sflight FROM wa_sflight.

ou

UPDATE sflight FROM TABLE it_sflight.

Nesse caso, o comando UPDATE atualiza a tabela sflight com os dados da work area wa_sflight ou com as linhas da tabela interna it_sflight.

MODIFY spfli FROM wa_sflight.

ou

MODIFY spfli FROM TABLE it_sflight.

Se você não estiver seguro se a chave na wa_sflight ou it_sflight já existir, você pode usar o comando MODIFY. Esse comando verifica se a chave a ser atualizada já existe, se sim, o registro será modificado, caso contrário a linha será inserida.

DELETE FROM spfli WHERE …

Este comando elimina todas as linhas da tabela spfli de acordo com o cláusula WHERE.

DELETE spfli FROM wa_spfli.

ou

DELETE spfli FROM TABLE it_spfli.

Como nos outros casos, esse comando elimina todas as linhas da spfli de acordo com a chave contidas na wa_spfli ou it_spfli.

Discussão

Quando você utiliza qualquer um dos métodos acima, nenhuma consistência de dados ou verificação de autorização é realizada. Por esse motivo, esses métodos não são aconselháveis para atualizar tabelas transparentes standard. Em algumas empresas, essa prática é até proibida.

Nesses casos é comum usarmos batch input ou BAPIs para efetuarmos atualizações em tabelas standards de maneira segura, garantindo todas as consitências dados e ou autorizações.

→ 1 CommentTags: Conceitos · Receita ABAP · Tecnica de Programação

Questão Comentada - Check

April 8th, 2008 · 2 Comments

ABAP101 finalmente de casa nova e agora é casa própria! Como toda mudança ainda estou com algumas caixas para desenbalar, armários para arrumar e pequenos ajustes para fazer. Mas agora ABAP101 tem seu próprio teto!

Para estrear, vou começar com um nova categoria, “questões comentadas”. Essa semana eu recebi uma pergunta de um aluno da minha última turma da academia ABAP sobre uma questão de certificação. No momento que estava respondendo a dúvida eu tive a idéia de criar essa nova categoria.

A idéia aqui é comentar a resposta das questões mais sacanas ou pegadinhas das provas de certificação. Então se você tiver alguma questão, mande para furlan_arroba_abap101.com.

Então, vamos a nossa primeira questão:

Qual é a lógica dessa questão?

What is the result of the following code. Assume there are 5 records in itab.

Loop at itab.
ctr = ctr + 1
write: sy-tabix.
check ctr = 3.
delete itab
endloop.

Resposta correta: 1 2 3 3 4

Como estamos dentro de um LOOP, o sy-tabix retorna o index atual da tabela, ou seja, qual a linha que o LOOP está na tabela. Assumindo que a variável ctr = 0 no início do LOOP, a chave da questão está no comando check ctr = 3 e delete itab.

O comando CHECK somente deixa o processamento do LOOP continuar se a expressão for verdadeira.

Assim, o código abaixo ficaria:

Loop at itab.
ctr = ctr + 1
write: sy-tabix.

if ctr = 3.
delete itab.
else.
continue.
endif.
endloop.

Ou seja, se a variável for ctr = 3, ele elimina a linha da tabela interna (no index 3) e continua o processamento até o ENDLOOP, caso contrário, pára o processamento e vai para a próxima iteração do LOOP.

Então, imagine isso no debug, no momento de cada iteração do LOOP, na linha do CHECK:

Iteração do LOOP 1: ctr = 1, sy-tabix = 1, Write = “1″, não passa pelo delete itab.
Iteração do LOOP 2: ctr = 2, sy-tabix = 2, Write = “1 2″, não passa pelo delete itab.
Iteração do LOOP 3: ctr = 3, sy-tabix = 3, Write = “1 2 3″, passa pelo delete itab.
Iteração do LOOP 4: ctr = 4, sy-tabix = 3, Write = “1 2 3 3″, não passa pelo delete itab. O 3 repete pq eliminamos uma linha da tabela interna itab no delete o “LOOP 3″
Iteração do LOOP 5: ctr = 5, sy-tabix = 4, Write = “1 2 3 3 4″, não passa pelo delete itab.

O pulo do gato está no CHECK ctr = 3, deletamos uma linha da itab e ai o sy-tabix fica no 3 em duas iterações do LOOP.

Consegui entender? Tente simular isso em um programa e acompanhe debugando o sy-tabix.

→ 2 CommentsTags: Questão Comentada