Arquivo da categoria ‘Abap’

Trabalhe como um desenvolvedor

Publicado: 23 de fevereiro de 2014 em Abap, C#, C/C++, Java, Python

can-stock-photo_csp11667034Em computação, um programador, desenvolvedor, coder ou engenheiro de software refere-se a alguém que faz programação de computadores e escreve software.

Um programador pode ser alguém que desenvolve ou faz manutenção de softwares em um grande sistema ou alguém que desenvolve software para uso em computadores pessoais.

Os desenvolvedores profissionais gastam menos de 10 por cento do seu tempo de trabalho escrevendo código, consomem cerca de 60 por cento do tempo de trabalho em um projeto,  na análise de problemas, concebendo soluções, documentando as decisões, depurando, mantendo ou melhorando o  código fonte.

Os 30 por cento restantes do tempo de um desenvolvedor é tomado por reuniões ou simplesmente desperdiçado (Às vezes, não há nenhuma diferença entre reuniões e tempo perdido.)

Se você estiver escrevendo um programa que é maior do que algumas linhas, então não é o bastante apenas sentar e começar a codificação. Você precisa dar três passos para tornar o seu programa o melhor possível.

Os 3 Ds –  Documentação, Design e Depuração

  1. Documentação: Certificar-se de que outras pessoas podem ler o seu programa.
  2. Design: Ter certeza que seu programa resolve o problema certo e está organizado para que seja eficiente e potencialmente reutilizável.
  3. Depuração: Certificar-se de que seu programa não tenha nenhum erro e que ele responda adequadamente quanto a entrada de dados errados.

Documentação

Documentação torna possível ler, usar e manter um programa:

  • Na programação, a documentação é toda a escrita associada ao seu programa que não seja um código.
  • Em uma linguagem de programação, legibilidade é uma virtude nobre.
  • Isso significa que seu código é parte da documentação também.
  • Escolher bons nomes faz parte da documentação!
  • LEMBRE-SE, programação, começa e termina com a documentação.
  • Comece por escrever o problema que o seu programa se destina a resolver.
  • Antes mesmo de começar a escrever o seu programa, é uma boa ideia escrever notas sobre o objetivo do programa.
  • Finja que você precisa explicá-lo para outra pessoa, e se você tem alguém para ler a notas, melhor.
  • Termine, certificando-se de que a documentação ainda corresponde ao programa.

Se você não escrever a documentação, você vai achar que é difícil usar ou manter o seu programa depois de passado seis meses (mesmo se você é a única pessoa que usa o programa).

Design

Projetar é realmente um atalho para duas partes interligadas de programação: análise e design.

O que você realmente quer?

Análise é o processo de determinar o problema que você está tentando resolver. É semelhante ao processo que um arquiteto faz você passar para remodelar a sua cozinha: “O que você realmente quer?”. Por exemplo, você pode querer escrever um programa para automatizar seus dados de backup. Essa é uma descrição geral, mas você precisa de uma lista mais específica das tarefas que você deseja que o programa realize, como:

  • Quantas vezes você quer fazer os backups?
  • Você quer fazer backup de todos os dados ou apenas dados alterados desde o último backup?
  • Quanto tempo você quer manter os backups?

Se você está remodelando sua cozinha, então este é o ponto onde o arquiteto elabora um projeto. O projeto não é a própria cozinha; é o plano que deve ser seguido para a construção da nova cozinha. se você está escrevendo um programa, você começa a construir o contorno do programa, que é semelhante a uma planta. Na verdade, as pessoas que se concentram na análise e concepção de programas são frequentemente chamados de arquitetos de software.

A Pseudo codificação de seus pensamentos

Uma maneira de projetar seu programa é criando um esboço do tipo, usando o que é chamado de pseudo-código. Você escreve um esboço do que o seu programa vai fazer, utilizando as estruturas que você vai precisar usar quando você escrever o programa (como definições de classe e função, as declarações), mas você não deve se preocupar com os detalhes de sintaxe necessárias para escrever código de trabalho.

Pseudo-código tende a assemelhar-se a programas reais, por isso leva menos esforço para converter pseudo-código em código funcionando. quando o processo de pseudo-codificação é concluída, os detalhes são fáceis de escrever.

Depuração

Um bug é um erro em um pedaço do software que faz com que ele funcione de forma inadequada ou retorne resultados incorretos.

Ensine a Velhos Bugs  Novos Truques:

O uso da palavra bug (pau em português) já era comum antes do software ser inventado, por exemplo, Thomas Edison usou em 1878 para descrever problemas com suas invenções. Algumas pessoas vão dizer-lhe, porém, que o termo deriva de um incidente no qual foi encontrado um inseto real que estava causando falhas dentro de um computador no início de 1947.

Embora um bug seja mais velho do que escrever programas, depuração tem sido uma parte inerente da escrita de programas desde que as pessoas começaram a escrever softwares. Um dos primeiros cientistas da computação, Maurice Wilkes, é conhecido por ter dito: “Eu me lembro do momento exato em que eu percebi que uma grande parte da minha vida a partir de então ia ser passar a encontrar erros em meus próprios programas.”.

Escrever um programa complexo é algo como a concepção de um edifício. O arquiteto restringe inclusão do tempo, dinheiro, bom gosto, e os limites estruturais dos materiais. Programação também requer um equilíbrio entre necessidades múltiplas, muitas vezes incluindo o tempo, o dinheiro, a solicitações de recursos de vários grupos de pessoas, e da disponibilidade de quantidades suficientes de cafeína.

Um exemplo de um bom trabalho é com bom humor, o pythonista Tim Peters contribuiu com  19 diretrizes para um bom código Python. Considerado a melhor destilação da filosofia da programação Python:

Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o suficiente para quebrar as regras.
Embora praticidade vença a pureza.
Erros nunca devem passar em silêncio.
A menos que explicitamente silenciados.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deve haver um – e preferencialmente só um – modo óbvio para fazer isso.
Apesar de que o caminho pode não ser óbvio à primeira vista, a menos que você seja holandês.
Agora é melhor do que nunca.
Embora nunca é muitas vezes melhor do que agora.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Namespaces são uma grande ideia – vamos fazer mais desses!

-Tim Peters

Versão original: http://www.python.org/doc/humor/#zen

Open SQL – Select , Insert, Update e Delete – Abap

Publicado: 20 de fevereiro de 2014 em Abap

Open SQL consiste em um conjunto de instruções ABAP que executam operações no banco de dados do sistema central do R/3. Os resultados das operações e as mensagens de erro são independentes do sistema de base de dados em uso. O Open SQL fornece, assim, uma sintaxe e semântica uniforme para todos os sistemas de banco de dados suportados pela SAP. Programas ABAP que utilizam apenas instruções Open SQL funcionará em qualquer sistema R/3, independentemente do sistema de banco de dados em uso. Instruções Open SQL só podem trabalhar com tabelas de banco de dados que foram criados no Dicionário ABAP.

Open SQL: Definição

Insert

A instrução Open SQL serve para inserir dados em uma tabela de banco de dados. Ela permite que você insira uma ou mais linhas na tabela do banco de dados alvo. Você pode especificar o destino da tabela de banco de dados estática ou dinamicamente.

Mais informações: Insert

Select

É uma instrução Open SQL para leitura de dados a partir de uma ou várias tabelas de banco de dados em objetos de dados. A instrução SELECT lê um conjunto de resultados a partir das tabelas do banco de dados especificados na fonte, e atribui os dados do conjunto de resultados para os objetos de dados especificados no alvo. Você pode restringir o conjunto de resultados usando a adição WHERE.

Mais informações: Select

UPDATE

A instrução UPDATE permite a atualização dos valores das colunas selecionadas de linhas de uma tabela de banco de dados.

Mais informações: Update

DELETE FROM

Para excluir linhas de qualquer tabela use a instrução DELETE FROM. Você pode usar a chave da tabela para encontrar e apagar uma única linha, eliminar um conjunto de linhas que atendam a uma condição, ou encontrar e apagar entradas duplicadas. Se a tabela tem uma chave não-exclusiva e há entradas duplicadas, a primeira entrada é eliminada.

Mais informações: Delete

Exemplos:

Neste exemplo usamos duas tabelas do FLIGHT MODEL e inserimos e selecionamos dados aleatórios nas tabelas SCURX, SBUSPART, ressaltando que ainda não precisamos respeitar nenhuma chave estrangeira nas tabelas standards, mais tarde usaremos BAPIs para atualizar consistentemente estas tabelas.

Abap

*&---------------------------------------------------------------------*
*& Report  ZMOEDA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Flight Model - Moeda - Select e Insert
*&---------------------------------------------------------------------*

REPORT  ZMOEDA.

* Define a Tabela

TABLES SCURX.
TABLES SBUSPART.

* Cria as Arrays para os campos

DATA matriz  TYPE SCURX.
DATA matriz2 TYPE SBUSPART.

* Insere dados na tabela

matriz-currkey = 1.
matriz-currdec = 2.
INSERT INTO SCURX VALUES matriz.

matriz-currkey = 2.
matriz-currdec = 2.
INSERT INTO SCURX VALUES matriz.

matriz-currkey = 3.
matriz-currdec = 2.
INSERT INTO SCURX VALUES matriz.

* Seleciona dados da Tabela.

WRITE : / 'Tabela de Moedas', / .

SELECT * INTO matriz FROM SCURX.
  WRITE : / 'Chave da Moeda:', matriz-currkey, 'Decimais: ', matriz-currdec, /.
ENDSELECT.

* Insere dados na tabela SBUSPART

matriz2-mandant = '001'.
matriz2-buspartnum = 1.
matriz2-contact = 'Desenvolvimento Aberto'.
matriz2-contphono = '55 5555-55-55'.
matriz2-buspatyp = '01'.
INSERT INTO SBUSPART VALUES matriz2.

matriz2-mandant = '001'.
matriz2-buspartnum = 2.
matriz2-contact = 'GNU - Open Source'.
matriz2-contphono = '55 9999-99-99'.
matriz2-buspatyp = '01'.
INSERT INTO SBUSPART VALUES matriz2.

matriz2-mandant = '001'.
matriz2-buspartnum = 3.
matriz2-contact = 'SAP AG - Airlines'.
matriz2-contphono = '55 6666-66-66'.
matriz2-buspatyp = '01'.
INSERT INTO SBUSPART VALUES matriz2.
* Seleciona dados da tabela SBUSPART

WRITE : / 'Tabela de Linhas Aereas', / .

SELECT * INTO matriz2  FROM SBUSPART.
  WRITE : / 'Mandante:', matriz2-mandant ,
          / 'Numero do Parceiro:', matriz2-buspartnum,
          / 'Contato:', matriz2-contact,
          / 'Telefone:', matriz2-contphono, 'Parceiro de negocio:', matriz2-buspatyp, /.
ENDSELECT.

* Altera dados nas tabelas

UPDATE SBUSPART SET contact = 'Sem Contato cadasrado' WHERE buspartnum = 3.

WRITE : / 'Tabela de Linhas Aereas ALTERADA', / .

SELECT * INTO matriz2  FROM SBUSPART.
  WRITE : / 'Mandante:', matriz2-mandant ,
          / 'Numero do Parceiro:', matriz2-buspartnum,
          / 'Contato:', matriz2-contact,
          / 'Telefone:', matriz2-contphono, 'Parceiro de negocio:', matriz2-buspatyp, /.
ENDSELECT.

* Deleta dados da tabela

DELETE FROM SBUSPART WHERE buspartnum = 3.

WRITE : / 'Tabela de Linhas Aereas Deletada', / .

SELECT * INTO matriz2  FROM SBUSPART.
  WRITE : / 'Mandante:', matriz2-mandant ,
          / 'Numero do Parceiro:', matriz2-buspartnum,
          / 'Contato:', matriz2-contact,
          / 'Telefone:', matriz2-contphono, 'Parceiro de negocio:', matriz2-buspatyp, /.
ENDSELECT.

O FLIGHT MODEL (modelo de vôo) é a base de exemplos da documentação do NetWeaver  7- ABAP.

O modelo de vôo é baseado no modelo de dados BC_TRAVEL, que você pode visualizar em seu sistema usando o Modelador de Dados.

Para quem já tem uma certa intimidade com banco de dados irá notar de primeira que o Data Modeler é uma ferramenta DER de fazer inveja aos usuários  que utilizam as ferramentas default de diagrama do ORACLE e MSSQL Databases.

O DATA MODELER (Modelador de Dados) é uma ferramenta gráfica e parte da gama de ferramentas do Web Dynpro. Usado para modelar dados e fornecer suporte eficiente para uma série de tarefas de desenvolvimento centrais.

datamodeler

Atualmente não há nenhuma interface de usuário para testar os cenários da aplicação de dados de vôo, usaremos as tabelas do FLIGHT MODEL em nossos exemplos para aprender como funciona a interação com o banco de dados, seus comandos, funções,  BAPIs e outras funcionalidades.

Dados do Flight Model

O NetWeaver 7 proporciona um ambiente de desenvolvimento para aplicações SAP, e por padrão existem 3 mandantes criados automaticamente em um sistema SAP. Todas as configurações inicias e dados contidos nas tabelas de exemplos estão dentro do mandante 000, entretanto você precisa criar um mandante adequado para desenvolvimento, e você pode criar uma copia do mandante 001 que também é um mandante padrão. A SAP aconselha criar os mandantes 200 e 210 para os ambientes de desenvolvimento.

Você encontra instruções de como utilizar clientes nos links abaixo:

Entendendo os Mandantes.

Criando Clientes de Desenvolvimento.

Importar dados do Flight Model.

 

Modelo de Voo

A partir do modelo de dados do voo SAP, as tabelas a seguir são de interesse para esta aplicação: Scarr (companhias aéreas), SPFLI (horários de vôos), SFLIGHT (vôos), SBOOK (reservas de voos), SCUSTOM (clientes voo), SFLCONN (conexões de vôo) , SFLCONNPOS (segmentos de rota de conexões de vôo), SFLTRIP (viagens de vôo), SFLTRIPPOS (passageiros viagem voo) e SFLTRIPBOK (números de reserva para viagens de voo).

Existe uma tabela no Dicionário ABAP contendo os dados das entidades correspondentes (versões do tipo de entidade) para cada tipo de entidade.

As Tabelas mais importantes do modelo de vôo são:

  •  T000:Tabela Cliente
  •  SCURX: Moedas (chave: chave da moeda)
  •  SBUSPART: parceiro de negócios (chave: cliente, número de sócio)
  •  STRAVELAG: Agências de viagens (chave: cliente, número de viagens agência)
  •  SCUSTOM: Clientes (chave: cliente, número de cliente)
  •  Scarr: Carriers (chave: cliente, identificação do operador)
  •  SCOUNTER: balcões de vendas (chave: cliente, transportadora ID, número de balcão de vendas)
  •  SPFLI: Programação de vôo (chave: cliente, transportadora ID, número de conexão)
  • SFLIGHT: Voos (chave: cliente, transportadora ID, número de conexão, data do vôo)
  • SBOOK: reservas de voo (chave: cliente, transportadora ID, número de conexão, data de vôo, reserva de número, número de cliente)

Para Acessar o Data Modeler

  • Digite a transação SD11.
  • Em Modeling object, digite: BC_TRAVEL.
  • Clique no botão Display .
  • Quando exibido o modelo de dados, na barra de ferramentas clique em Graphics.

Para Acessar as Estruras das Tabelas

  • Digite a transação SE11.
  • Em Database Table, digite o nome de uma das tabelas do modelo, exemplo: SCUSTOM.
  • Clique no botão Display.

Para Acessar os Dados das Tabelas

  • Digite a transação SE16
  • Em Table Name, digite o nome de uma das tabelas do modelo, exemplo: SCUSTOM.
  • Na barra de ferramentas, clique no ícone Table Contents ou pressione F7.
  • Na tela de seleção escolha a pesquisa mais adequada e clique no ícone Execute ou pressione F8.

Relacionamento entre as Tabelas

Tabela SBUSPART contém todos os parceiros de negócios de uma transportadora. Um parceiro de negócios é identificado pelo seu número na tabela. Os dados da pessoa de contato para o parceiro de negócios também é armazenado.

Um parceiro de negócios pode ser uma agência de viagens ou um cliente (por exemplo, empresa que freqüentemente marca vôos diretamente com a operadora).

Dados diferentes são necessários para estes dois tipos de parceiros de negócios. Os dados de uma agência de viagens é armazenado em STRAVELAG e os dados para um cliente na tabela SCUSTOM . Existe , portanto, uma entrada com a mesma chave em qualquer STRAVELAG ou SCUSTOM para cada entrada na tabela SBUSPART .

Tabela Scarr contém os IDs e nomes dos portadores. Cada transportador tem um número de ligações . Essas conexões de vôo são armazenados na tabela SPFLI . Tabela SFLIGHT contém os dados do voo concretos para cada conexão. As reservas podem ser feitas para cada voo na tabela SFLIGHT. As reservas feitas para cada voo são inseridos na tabela SBOOK.

As operadoras têm balcões de venda em aeroportos. Estes balcões de venda são inseridos na tabela SCOUNTER.

O número de cliente ou o número de agência para a qual foi feita a reserva é armazenada na tabela SBOOK para cada reserva. Se o cliente marcar seu vôo diretamente no balcão , o número do contador também é inserido nos dados de reserva na tabela SBOOK.

Exercício:

Analise e entenda o  o modelo de dados no diagrama de dados (DATA MODELER), Analise e entenda a estrutura das tabelas e seus campos no Dicionário ABAP, o mandante 001 não contem dados inseridos nas tabelas.

Internal Tables – Abap

Publicado: 20 de fevereiro de 2014 em Abap

Citando a documentação oficial da SAP, “…tabelas internas cumprem a função de Arrays…”, porem possuem um certo upgrade na funcionalidade as tornando diferentes das tradicionais Arrays e Vetores de outras linguagens de programação, possuem uma interação com a sintaxe de comandos SQL,  onde podemos usar a tradicional clausula WHERE,  e também comandos SQL inteiros em sua tradicional sintaxe, exceto pelo comando UPDATE que não funciona com tabelas internas

Semelhante ao conceito de tabela nos bancos de dados, mas armazenadas na memória. Número de registros de acesso restrito somente pela capacidade do sistema. Útil para armazenar temporariamente os dados do banco de dados para processamento, preparação de dados para a saída, ou preparar dados para outro uso.

As tabelas internas fornecem um meio selecionar dados a partir de uma estrutura fixa e armazená-la na memória de trabalho em ABAP. Os dados são armazenados linha por linha na memória, e cada linha possui a mesma estrutura. Em ABAP, tabelas internas cumprem a função de matrizes. Uma vez que eles são objetos de dados dinâmicos, elas economizam do programador a tarefa de gerenciamento de memória dinâmica em seus programas. Você deve usar tabelas internas, sempre que você quiser processar um conjunto de dados com uma estrutura fixa dentro de um programa. Uma utilização particularmente importante para as tabelas internas é o armazenamento e formatação de dados a partir de uma tabela de base de dados dentro de um programa. Elas também são uma boa maneira de incluir estruturas de dados muito complicadas em um programa ABAP.

Os dados em uma tabela interna pode ser acessado através de pesquisa na tabela baseada em valores de coluna chave ou índices (números de linha).

As chaves podem ser exclusivas ou não-exclusivas. Buscando uma tabela interna com chaves não-exclusivas pode resultar em mais de 1 registro retornado por pesquisa.

mais informações: http://help.sap.com/SAPHELP_470/Helpdata/PT/fc/eb35de358411d1829f0000e829fbfe/content.htm

Tipos de tabelas internas:

  • Standard – Semelhante à tabela de DB (linha e chave de acesso)
  • Sorted – Dados ordenados sempre ordenados por chaves (linha e chave de acesso)
  • Hashed – Chaves deve ser exclusivas (somente chave de acesso)

Uma tabela Standard só pode ter chaves não únicas, tabelas hash só pode ter chaves únicas, e Sorted pode ter qualquer um.

Comandos:

Append:

Adiciona um objeto de dados no fim da tabela.

Informações adicionais: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb36c8358411d1829f0000e829fbfe/content.htm

Insert:

Na tabela Standard, mesmo que Append. Na tabela Sorted, insere com base na ordem de classificação. Na tabela hash, insere baseado no algoritmo de hash.

Informações adicionais: http://help.sap.com/saphelp_nw04s/helpdata/en/fc/eb3a6d358411d1829f0000e829fbfe/content.htm

Modify:

Muda uma linha da tabela.

Informações adicionais: http://help.sap.com/saphelp_45b/helpdata/en/34/8e72f96df74873e10000009b38f9b8/content.htm

Delete:

Exclui linha (s) com a condição correspondênte.

Informações adicionais: https://help.sap.com/saphelp_45b/helpdata/en/34/8e72fb6df74873e10000009b38f9b8/content.htm

Exemplos:

Neste exemplo herdamos uma tabela Standard do sistema, criamos uma matriz para manipular as linhas de dados (rows), e usamos os comandos básicos de manipulação de dados.

Abap

*&---------------------------------------------------------------------*
*& Report  ZTABELAINTERNA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Tabelas Internas
*&---------------------------------------------------------------------*

REPORT  ZTABELAINTERNA.

* Tabela Scarr é uma tabela de informações de linhas aéreas
* Utilize SE11 para visualizar a tabela e tipo de dados no ABAP Dictionary.
* Criar uma tabela interna do mesmo tipo que Scarr:

DATA i_minhatabela TYPE STANDARD TABLE OF scarr.

* Criar uma estrutura que corresponda às colunas contidas na tabela interna
* Abap usa a variavel matriz como uma ARRAY:

DATA matriz LIKE LINE OF i_minhatabela.

* INSERT - Insere valores aos campos da tabela interna.

matriz-mandt        = '001'.
matriz-carrid       = '2002'.
matriz-carrname     = 'Dev. Aberto AirLine.'.
matriz-currcode     = 'Euro'.
matriz-url          = 'https://desenvolvimentoaberto.wordpress.com/'.
INSERT matriz INTO TABLE i_minhatabela.

* APPEND - adiciona valores aos campos da tabela interna.

APPEND INITIAL LINE TO i_minhatabela.
matriz-mandt        = '001'.
matriz-carrid       = '122'.
matriz-carrname     = 'Aviação DA airlines S/A.'.
matriz-currcode     = 'Real'.
matriz-url          = 'https://desenvolvimentoaberto.wordpress.com/'.
APPEND matriz TO i_minhatabela.

* Deleta matriz em branco, comente a linha abaixo para ver o espaço em branco

DELETE i_minhatabela WHERE mandt =''.

* MODIFY - modifica dados nas tabelas.

matriz-currcode = 'Euro'.
MODIFY i_minhatabela FROM matriz TRANSPORTING currcode  WHERE currcode = 'Real'.

* Escrever o conteúdo da tabela interna para a tela como uma lista
LOOP AT i_minhatabela INTO matriz.
    WRITE: / 'Mandante', matriz-mandt, / 'Id:', matriz-carrid, / 'Empresa Aerea:', matriz-carrname,
           / 'Código da moeda:', matriz-currcode, / 'Url da empresa:', matriz-url, / .
ENDLOOP.

SAP – Tipos Complexos – Structures – Abap

Publicado: 20 de fevereiro de 2014 em Abap

Tipos de dados complexos podem ser definidos para criar variáveis ​​estruturadas (também chamados de estruturas). Declarações TYPES com as adições dos comandos BEGIN OF e  END OF, criam tipos de variáveis estruturadas. Componentes de uma estrutura são referenciados usando um hífen, as estruturas podem ser aninhadas e podem ser copiadas da estrutura da variável A para a estrutura da variável B.

Sintaxe:

TYPES:
BEGIN OF nome_da_estrutura,
nome do campo TYPE type,
nome do campo TYPE type, […]
END OF nome_da_estrutura.

Exemplo:

Neste exemplo criamos uma simples estrutura de endereço:

Abap

*&---------------------------------------------------------------------*
*& Report  ZESTRUTURAS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Estruturas
*&---------------------------------------------------------------------*

REPORT  ZESTRUTURAS.

* Declarando uma estrutura

TYPES:
BEGIN OF endereco_struct,
         endereco1 TYPE c LENGTH 60,
         endereco2 TYPE c LENGTH 60,
         bairro    TYPE c LENGTH 50,
         cidade    TYPE c LENGTH 60,
         estado    TYPE c LENGTH 2,
         cep       TYPE n LENGTH 9,
END OF   endereco_struct.

* Declarando variaveis para a estrutura
DATA postal TYPE endereco_struct.

postal-endereco1 = 'Avenida São João, 500'.
postal-endereco2 = 'Avenida Ipiranga, 458'.
postal-bairro    = 'Centro'.
postal-cidade    = 'São Paulo.'.
postal-estado    = 'SP'.
postal-cep       = 01035100.

WRITE : /  postal-endereco1, / postal-endereco2, / postal-bairro, / postal-cep,
        /  postal-cidade, / postal-estado.

Data, Hora, Timestamp – Abap

Publicado: 19 de fevereiro de 2014 em Abap

Sistemas de processamento de transações online (OLTP), tais como os que compõem o SAP Business Suite mantem os dados sensíveis ao tempo, por isso é importante você entender como trabalhar com os tipos de data e hora embutido fornecidos em ABAP.

O ABAP fornece dois tipos built-in para trabalhar com datas e horários:

  • d – data – formato AAAAMMDD.
  • t – tempo formato   HHMMSS.

Em adição a estes tipos embutido, o ABAP Dictionary possui os tipos TIMESTAMP e TIMESTAMPL e compatível  com o formato UTC.

TIMESTAMP é uma sequência de caracteres ou informação codificada para identificar quando um determinado evento ocorreu, geralmente dando data e hora do dia, às vezes a precisão de uma pequena fração de segundo.

Timestamps são normalmente utilizados para eventos de registro de log ou uma sequência de eventos (SOE), caso em que cada evento no log ou SOE é marcado com um timestamp. Em sistemas de arquivos, timestamp pode significar a data / hora armazenada de criação ou modificação de um arquivo.

Abap possui campos do sistema uteis para manipulação de data e hora.

Campos do Sistema:

  • sy-datlo –  Data no fuso horário do usuário atual.
  • sy-datum  – Data local do sistema de ABAP. Indicador.
  • sy-dayst –  para horário de verão. Durante o Verão, “X”, caso contrário “”.
  • sy-fdayw – calendário Fábrica dia da semana. “1” para segunda-feira, …, “5” para sexta-feira.
  • sy-timlo – Tempo no fuso horário do usuário atual.
  • sy-tzone – Diferença de tempo a partir do momento de referência UTC em segundos, ignorando o verão.
  • sy-uzeit – Hora local do sistema de ABAP.
  • sy-zonlo – fuso horário do usuário.

Exemplo:

Neste exemplo trabalhamos com os campos built-in do sistema , com timestamp e seus diferencias, como manipular o horário de verão, dia da semana e outros.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDATAEHORA
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Data, Hora e Timestamp
*&---------------------------------------------------------------------*

REPORT  ZDATAEHORA.

DATA : datasistema  TYPE d,
       horasistema  TYPE t,
       datausuario  TYPE d,
       horausuario  TYPE t,
       datastamp    TYPE timestamp,
       datastampL   TYPE timestampl,
       horarioverao TYPE abap_bool,
       diasemana    TYPE d.

* Trabalhando com Data e Hora

datasistema = sy-datum.
horasistema = sy-uzeit.

datausuario = sy-datlo.
horausuario = sy-timlo.

diasemana = sy-fdayw.

PERFORM diaextenso.

Write : / 'Data de sistema:', datasistema DD/MM/YYYY,
        / 'Hora do sistema:', horasistema USING EDIT MASK '__:__',
        / ,
        / 'Data do usuario:', datausuario DD/MM/YYYY,
        / 'Hora do usuario:', horausuario USING EDIT MASK '__:__', /.

* Trabalhando com TimeStamp

GET TIME STAMP FIELD datastamp.
GET TIME STAMP FIELD datastampL.

WRITE: / 'Time Stamp      :', datastamp TIME ZONE sy-zonlo,
       / 'Time Stamp Longo:', datastampL TIME ZONE sy-zonlo, /.

* Convertendo TIMESTAMP

CONVERT TIME STAMP datastamp TIME ZONE sy-zonlo
INTO DATE datausuario TIME horausuario
DAYLIGHT SAVING TIME horarioverao.

WRITE: / 'Data de hoje: ', datausuario DD/MM/YYYY,
       /(60) horausuario USING EDIT MASK 'A hora atual é: __:__:__', /.

IF horarioverao EQ abap_true.
   WRITE : / 'Estamos em horario de verão'.
ELSE.
   WRITE : / 'Não estamos em horario de verão'.
ENDIF.

FORM diaextenso.
  CASE sy-fdayw.
    WHEN  1.
      WRITE : / 'Segunda-feira'.
    WHEN  2.
      WRITE : / 'Terça-feira'.
    WHEN  3.
      WRITE : / 'Quarta-feira'.
    WHEN  4.
      WRITE : / 'Quinta-feira'.
    WHEN  5.
      WRITE : / 'Sexta-feira'.
    WHEN  6.
      WRITE : / 'Sabado'.
    WHEN  7.
      WRITE : / 'Domingo'.
  ENDCASE.
ENDFORM.

Tipo Booleano – abap_bool – Abap

Publicado: 19 de fevereiro de 2014 em Abap

abap_bool  é um tipo de dado primitivo que possui dois valores, que podem ser considerados como  verdadeiro ou falso. Não existe realmente um tipo boolean em ABAP, mas existe um workaround no sistema R/3 que simula campos booleanos. O que acontece é que no dicionário ABAP existe uma constante para abap_true com o valor do caractere char “X’ e para abap_false um valor nulo, deste modo o compilador ABAP consegue simular tipos booleanos.

Definição:

O tipo abap_bool é definido como:
types: abap_bool type c length 1.

Você pode confirmar a constante abap_true no dicionário ABAP (SE11) como:

Constants: abap_true type abap_bool value ‘X’

Exemplo:

Neste exemplo mostramos o conteúdo do campo abap_bool e todos os seu valores e o utilizamos como campos booleanos:

Abap

*&---------------------------------------------------------------------*
*& Report  ZBOOLEAN
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Campos Booleanos
*&---------------------------------------------------------------------*

REPORT  ZBOOLEAN.

DATA valida TYPE abap_bool.

WRITE : / 'Valor Boolean default:', valida.

valida = abap_false.

WRITE : / 'Valor Boolean falso: ', valida.

valida = abap_true.

WRITE : / 'Valor Boolean verdadeiro: ', valida.

IF valida EQ abap_true.
  WRITE: / 'Estou validando um campo boolean verdadeiro'.
ENDIF.

valida = abap_false.

IF valida EQ abap_false.
  WRITE : / 'Estou validando um campo boolean falso'.
ENDIF.

A declaração TRANSLATE converte caracteres em maiúsculas ou minúsculas, ou usa regras de substituição para converter todas as ocorrências de um caractere para outro  caractere.

Sintaxe:

TRANSLATE <c> TO UPPER CASE.
TRANSLATE <c> TO LOWER CASE.
TRANSLATE <c> USING <r>.

O comando PACK serve para retirar os 0 (zeros) a esquerda de uma variável, trocando por espaços em branco.

Sintaxe: PACK variável TO variável.

A declaração CONDENSE exclui espaços redundantes de uma string.

Sintaxe: CONDENSE variável.

STRLEN retorna o comprimento de uma string até o último caractere que não é um espaço.

Sintaxe: COMPUTE  n  = STRLEN( c ).

SUBSTRING é um instrução usada em varias linguagens de programação, o método extrai os caracteres de uma cadeia, entre dois índices especificados, e retorna o novo sub string. Em ABAP a palavra chave SUBSTRING não é necessária, usa se direto a variável literal.

Sintaxe: LITERAL+posição_inicial(posição_final).

Exemplo:

Neste exemplo usamos vários métodos para a manipulação de strings:

Abap

*&---------------------------------------------------------------------*
*& Report  ZTRADUCAO
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Manipulação de Strin
*& Translate, Pack, Condense, Compute Strlen, Substring
*&---------------------------------------------------------------------*

REPORT  ZTRADUCAO.

DATA : variavel TYPE c LENGTH 50,
       numeros  TYPE c LENGTH 30 VALUE '0000446577',
       tamanho  TYPE i.

variavel = 'desenvolvimento aberto'.

TRANSLATE variavel TO UPPER CASE.
WRITE : / 'Caixa Alta: ',variavel.

TRANSLATE variavel TO LOWER CASE.
WRITE : / 'Caixa Baixa:',variavel.

variavel = 'Abab-BaAa X bababa Y bdba Z bAbaB'.
WRITE : / , / 'Troca: ', variavel.

* troca B-A, b-a, A-b, a-b
TRANSLATE variavel USING 'BAbaABab'.
WRITE : / 'Troca: ', variavel.

* Retira os zeros de uma variavel
WRITE : / , / 'Numeros: ', numeros.
PACK numeros TO numeros.

* Retira os espaços em branco que ficou no lugar do zeros
CONDENSE numeros.
COMPUTE tamanho =  STRLEN( numeros ).
WRITE : / 'Numeros: ', numeros, 'Contém:',tamanho,'caracteres'.

* Recorta pedaço de uma variavel
*AbertoDesenvolvimento
*012345678901234567890 = 21 caracteres
variavel = 'AbertoDesenvolvimento'.

WRITE : / , / 'Substring de ', variavel, ':'.
WRITE:  /  variavel+6(15) , variavel+0(6).

Manipulando Strings – Find e Replace – Abap

Publicado: 19 de fevereiro de 2014 em Abap

A declaração FIND é usada para encontrar ocorrências de um padrão dentro de uma string. Ela também pode ser usado para localizar o padrão de sequência dentro de uma tabela interna.

A declaração REPLACE substitui uma string por uma outra e possui os mesmos parâmetros da declaração FIND, apenas acrescentando o comando WITH.

Sintaxe:

REPLACE s1 WITH s2 INTO c [LENGTH l].

e

FIND s1 IN s2.

FIND [FIRST OCCURRENCE OF ou ALL OCCURENCES OF] s1 IN s2.

FIND s1 IN s2 [IGNORING CASE ou RESPECTING CASE].

Resultado da operação de localização são armazenados na constante sy-SUBRC:

  • sy-SUBRC definido como 0, se for encontrado.
  • sy-SUBRC definido para 4 se não for encontrado.

Exemplo:

Neste exemplo procuramos a palavra “Amora” dentro de outro campo string, contamos o numero de ocorrências e usamos parâmetros de caso sensitivo e insensitivo.

*&---------------------------------------------------------------------*
*& Report  ZENCONTRAR
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Encontrar Strings
*&---------------------------------------------------------------------*

REPORT  ZENCONTRAR.

DATA : desc   TYPE c LENGTH 30,
       campo1 TYPE c LENGTH 50,
       campo2 TYPE c LENGTH 50,
       campo3 TYPE c LENGTH 100,
       x      TYPE i.

campo1 = 'Amora'.
campo2 = 'amora'.
campo3 = 'Você deve encontrar a string Amora dentro deste campo Amora, Amora, Amora'.

WRITE : / campo3.

desc = 'Valor default da constante:'.
WRITE : / 'A Constante sy-subrc determina o resultado do comando Find encontrou=0 não encontrou =4',
        / desc, 'sy-subrc = ', sy-subrc.

desc = 'Primeira ocorrencia '.
FIND FIRST OCCURRENCE OF campo1 IN campo3 MATCH COUNT x.
PERFORM resultadoFind USING campo1 x.

desc = 'Todas as ocorrencias'.
FIND ALL OCCURRENCES OF  campo1 IN campo3 MATCH COUNT x.
PERFORM resultadoFind USING campo1 x.

desc = 'Ignora Case'.
FIND campo2 IN campo3 IGNORING CASE MATCH COUNT x.
PERFORM resultadoFind USING campo2 x.

desc = 'Respeita Case'.
FIND campo2 IN campo3 RESPECTING CASE MATCH COUNT x.
PERFORM resultadoFind USING campo2 x.

REPLACE ALL OCCURRENCES OF campo1 IN campo3 With 'Banana'.
WRITE : / 'O campo3 foi modificado para:',
        / campo3.

FORM resultadoFind USING VALUE(X1) VALUE(X2).
   IF sy-subrc EQ 0.
      WRITE : / sy-subrc, X1, desc, ' encontrou', X2, 'strings'.
   ELSE.
      WRITE : / sy-subrc, X1, desc, ' não encontrou', X2, 'strings'.
   ENDIF.
ENDFORM.

Manipulando Strings – Concatenate e Split – Abap

Publicado: 19 de fevereiro de 2014 em Abap

A declaração CONCATENATE combina duas ou mais strings separadas em uma unica string. Esta declaração concatena dois ou mais campos de caracteres e atribui o resultado a um unico campo. O sistema ignora espaços no final das strings individuais. A instrução SEPARATED BY permite que você especifique um campo de caracteres, que é colocado entre os campos individuais.

A instrução SPLIT dividi uma cadeia de caracteres em duas ou mais strings menores.

Sintaxe:

CONCATENATE campo1 … campo(n) INTO campoX SEPARATED BY campoY

e

SPLIT campo AT [variável de separação] INTO campo2 campo3 [campo4 …].

Mais informações: http://help.sap.com/saphelp_nw04s/helpdata/en/9f/db998835c111d1829f0000e829fbfe/content.htm

Exemplo:

Neste exemplo concatenamos duas mensagens em uma única mensagem separado por uma campo string.

Abap

*&---------------------------------------------------------------------*
*& Report  ZMANIPULACAOSTRING
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Manipulação de Strings
*&---------------------------------------------------------------------*
REPORT  ZMANIPULACAOSTRING.

Data : parte1 TYPE c LENGTH 50,
       parte2 TYPE c LENGTH 50,
       juncao TYPE c LENGTH 100, " deve ter tamanho suficiente para concatenar as strings
       separa TYPE c LENGTH 14.

parte1 = 'Primeiro pedaço da menssagem'.
parte2 = 'Segundo pedaço da menssagem'.
separa = ' <separador> '.

CONCATENATE parte1 parte2 INTO juncao SEPARATED BY separa.

WRITE: / 'A variavel contém as seguintes menssagens concatenadas pelo separador :', separa,
       / juncao.

parte1 = ''.
parte2 = ''.

SPLIT juncao AT separa INTO parte1 parte2.

WRITE : / 'A variavel foi separada novamente pela string separadora',
        / parte1,
        / parte2.