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.

Message – Abap

Publicado: 19 de fevereiro de 2014 em Abap

Usado para eviar menssagens ao usuario do programa.

Sintaxe:

MESSAGE ‘menssagem de texto’ TYPE ‘[tipo]’.

Tipos de Menssagem

  • I – informação Exibir mensagem. Programa continua depois do usuário descartar a mensagem. Caixa de diálogo Modal
  • S – mensagem de Sucesso Exibir mensagem. Programa continua sem interrupção. Barra de status ou caixa de diálogo modal. *
  • W – aviso Exibir mensagem. Comportamento depende do contexto. Barra de status ou caixa de diálogo modal. *
  • – erro Exibir mensagem. Comportamento depende do contexto. Barra de status ou caixa de diálogo modal. *
  • A – terminação. Programa rescindido. Caixa de diálogo Modal.
  • X – curto despejo. Erro de tempo desencadeada com despejo Dump para a tela.

* Depende das configurações do SAP GUI.

Mais informações: http://help.sap.com/saphelp_46c/helpdata/en/85/daf6d14bac11d1890e0000e8322f96/content.htm

Exemplo:

Neste exemplo apenas imprimimos na tela algumas mensagens ao usuário.

Abap

*&---------------------------------------------------------------------*

*& Report  ZMENSSAGEM

*&

*&---------------------------------------------------------------------*

*& Desenvolvimento Aberto

*& Menssagens

*&---------------------------------------------------------------------*

REPORT  ZMENSSAGEM.

MESSAGE 'Menssagem de Sucesso' TYPE 'S'.

MESSAGE 'Menssagem de tipo Informação' TYPE 'I'.

MESSAGE 'Menssagem de tipo de termino do programa' TYPE 'A'.

Form e Perform – Abap

Publicado: 18 de fevereiro de 2014 em Abap

Similar às funções em outras linguagens de programação. Fornece encapsulamento de funcionalidade. Permite a passagem de parâmetro usando métodos diferentes.

A declaração FORM define uma sub-rotina e sua interface. Convenções de nomenclatura se aplicam ao nome da sub-rotina. As funções da sub-rotina são implementadas entre as declarações FORM e ENDFORM. As adições definem os parâmetros formais da sub-rotina e declaram a propagação das exceções de classe até a instrução que a invocou.

Você pode usar o comando PERFORM para chamar uma sub-rotina ABAP (FORM) a partir de qualquer programa, sujeito à verificação normal de autorização ABAP em tempo de execução. Você pode usar essas chamadas a sub-rotinas para a realização de cálculos, para a obtenção de dados a partir do banco de dados, formatação de dados, e assim por diante.

Métodos de Parâmetros

Apesar de uma sub-rotina poder operar em dados globais, este é um design pobre e nunca deve ser feito. O risco de erros de manutenção é muito maior.

Escolha o método mais conservador de passagem de parâmetros com base em objetivos de design:

  • Chamada por valor tem a vantagem de proporcionar segurança do objeto de dados. Mudanças na variável na sub-rotina não afetará o principal objeto de dados.
  • Chamada por valor e chamada por valor e resultado têm a desvantagem de sobrecarga associada ao fazer cópias de objetos de dados. Evite para grandes objetos de dados.

Sintaxe:

Escreve uma sub-rotina basica:

FORM minhasubrotina.

[instruções]

ENDFORM.

Chama uma sub-rotina basica:

PERFORM minhasubrotina.

Mais informações sobre sub rotinas: http://help.sap.com/abapdocu_702/en/abapform.htm

Exemplo:

Neste exemplo criamos três sub-rotinas, a primeira com uma sintaxe básica, a segunda enviando parâmetros e a terceira usando uma troca de valores dentro da sub-rotina.

Abap

*&---------------------------------------------------------------------*
*& Report  ZSUBROTINA *&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Sub Rotinas
*&---------------------------------------------------------------------*

REPORT  ZSUBROTINA.

* Declara variavel
DATA :  menssagem TYPE c LENGTH 100,
        num1      TYPE i,
        num2      TYPE i,
        resultado TYPE i.

* Alimenta variáveis
 menssagem = 'Enviando Menssagem Com Parametro'.
 num1 = 10.
 num2 = 2.
 resultado = 0.

* Chama Sub Rotina

PERFORM basico.
PERFORM msg USING menssagem.

* Troca valores depois da execução da Sub Rotina
PERFORM multiplica USING num1 num2 CHANGING resultado.
 WRITE : / 'Depois da Sub Rotina',
         / 'Reultado =' UNDER 'Resultado =', resultado.

* Cria Sub Rotina

* Sub Rotina Comum
FORM basico.
   WRITE : / 'Menssagem de uma Sub Rotina Basica'.
ENDFORM.

* Utiliza Parametros
FORM msg  USING messagem TYPE any.
   WRITE : / menssagem.
ENDFORM.

FORM multiplica USING    VALUE(x1) TYPE any
                          VALUE(x2) TYPE any
            CHANGING      VALUE(x)  TYPE any.
   x = x1 * x2.
   WRITE : / 'Multiplica X pelos parametros e troca pelo resultado',
           / ' Dentro da Sub Rotina :',
           / ' X = ', x , ' Resultado = ', resultado.
ENDFORM.