Guia de introdução
Aplicação de técnicas básicas e conceitos
Trabalhar com classes locais
Ler dados do banco de dados
Trabalhar com objetos de dados estruturados
Trabalhar com tabelas internas complexas
Implementar atualizações do banco de dados utilizando business objects
Descrição do modelo de programação de aplicativos ABAP RESTful

Dados de processamento

Objectives

After completing this lesson, you will be able to:
  • Executar cálculos aritméticos.
  • Aplicar processamento de cadeia.

Cálculos aritméticos

As expressões aritméticas são expressões ABAP com uma combinação de valores, operadores e funções que o sistema de tempo de execução processa para calcular um resultado. Para expressões aritméticas, o tipo de resultado depende do tipo dos operandos utilizados como entrada para a expressão.

Você pode utilizar uma expressão aritmética em qualquer posição de operando de leitura, por exemplo, no lado direito de uma avaliação.

O vídeo a seguir ilustra os fundamentos das expressões aritméticas.

Experimente: cálculos aritméticos

  1. Como no primeiro exercício deste curso, crie uma nova classe global que implemente a interface IF_OO_ADT_CLASSRUN.
  2. Copie o seguinte snippet de código para a parte de implementação do método if_oo_adt_classrun~main( ):
    Code Snippet
    12345678910111213141516171819202122232425262728293031
    * Declarations ********************************************************************** " comment/uncomment these line for different result types TYPES t_result TYPE p LENGTH 8 DECIMALS 2. * TYPES t_result TYPE p LENGTH 8 DECIMALS 0. * TYPES t_result TYPE i. DATA result TYPE t_result. * Calculations ********************************************************************** " comment/uncomment these lines for different calculations result = 2 + 3. * result = 2 - 3. * result = 2 * 3. * result = 2 / 3. * * result = sqrt( 2 ). * result = ipow( base = 2 exp = 3 ). * * result = ( 8 * 7 - 6 ) / ( 5 + 4 ). * result = 8 * 7 - 6 / 5 + 4. * Output ********************************************************************** out->write( result ).
  3. Pressione CTRL + F3 para ativar a classe e F9 para executá-la como um aplicativo de console.
  4. Jogue com o código-fonte para se familiarizar com os conceitos.
    • Anule o comentário de diferentes cálculos e definições de tipo.
    • Implemente seus próprios cálculos.

Processamento de cadeia

Os modelos de cadeia são expressões ABAP do tipo de resultado Cadeia. Você pode utilizar modelos de cadeia em qualquer posição de operando de leitura, por exemplo, no lado direito de uma avaliação.

Um modelo de string começa e termina com um símbolo de barra vertical ( | ). O modelo de cadeia mais simples possível contém nada além de texto literal. Neste formulário, um modelo de cadeia de caracteres não é realmente diferente de um literal de cadeia.

O que distingue um modelo de cadeia de caracteres de um literal de cadeia é a capacidade de incorporar expressões. Uma expressão integrada é uma expressão ABAP cercada por um par de chaves ( { e } ). No momento da execução, o ABAP avalia a expressão incorporada e converte o resultado em uma cadeia. No resultado final, essa string substitui a expressão incorporada (junto com as chaves circundantes).

Nota

A sintaxe ABAP requer pelo menos um espaço em branco após o parêntese de abertura e pelo menos um espaço em branco antes do parêntese de fechamento.

É claro que um modelo de cadeia pode conter mais de uma expressão incorporada.

Dentro das chaves, você pode colocar qualquer tipo de expressão ABAP: expressões aritméticas, como no exemplo acima, mas variáveis individuais ou mesmo literais podem servir como expressões incorporadas.

Um caso de utilização importante para modelos de cadeia é a formatação controlada de dados para saída.

No primeiro exemplo, a variável the_date é do tipo d e contém uma data no formato interno (bruto) AAAAMMDD (onde AAAA representa o ano, MM para o mês de dois dígitos e DD para a data de dois dígitos). Quando você usa a variável the_date como expressão incorporada em um modelo de cadeia, o resultado será o mesmo que o formato interno. Mas quando você adiciona a opção de formato DATE = <date_format> entre chaves, o sistema formatará o valor como uma data. Se você adicionar DATE = ISO, a saída estará no formato ISO. Com DATE = USER, o formato de saída depende das configurações do usuário atual.

O segundo exemplo ilustra algumas das opções que você pode usar para formatar números. Utilizando NUMBER, você controla a formatação geral de números, por exemplo, se é usado um ponto decimal ou uma vírgula decimal. Utilizando SIGN, você controla a posição do sinal e se um sinal positivo (+) é exibido ou não. Usando STYLE você pode escolher entre vários estilos predefinidos, como um estilo científico ou um estilo de engenharia.

Você pode unir campos usando o operador de concatenação &&. Você pode unir qualquer combinação de objetos de dados e expressões de string.

As partes integrantes da expressão são unidas sem espaço ou outro separador entre elas. Se precisar de espaços ou outro caractere separador, precisará lembrar de inseri-los você mesmo como parte da expressão, conforme mostrado no segundo exemplo.

Testar: processamento de cadeia

  1. Como no primeiro exercício deste curso, crie uma nova classe global que implemente a interface IF_OO_ADT_CLASSRUN.
  2. Copie o seguinte snippet de código para a parte de implementação do método if_oo_adt_classrun~main( ):
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
    METHOD if_oo_adt_classrun~main. * Declarations ********************************************************************** TYPES t_amount TYPE p LENGTH 8 DECIMALS 2. DATA amount TYPE t_amount VALUE '3.30'. DATA amount1 TYPE t_amount VALUE '1.20'. DATA amount2 TYPE t_amount VALUE '2.10'. DATA the_date TYPE d VALUE '19891109'. DATA my_number TYPE p LENGTH 3 DECIMALS 2 VALUE '-273.15'. DATA part1 TYPE string VALUE `Hello`. DATA part2 TYPE string VALUE `World`. * String Templates ********************************************************************** " comment/uncomment the following lines for different examples DATA(text) = |Hello World|. * DATA(text) = |Total: { amount } EUR|. * DATA(text) = |Total: { amount1 + amount2 } EUR|. * Format Options ********************************************************************** "Date * DATA(text) = |Raw Date: { the_date }|. * DATA(text) = |ISO Date: { the_date Date = ISO }|. * DATA(text) = |USER Date:{ the_date Date = USER }|. "Number * DATA(text) = |Raw Number { my_number }|. * DATA(text) = |User Format{ my_number NUMBER = USER }|. * DATA(text) = |Sign Right { my_number SIGN = RIGHT }|. * DATA(text) = |Scientific { my_number STYLE = SCIENTIFIC }|. * String expression (concatenation Operator) ********************************************************************** * DATA(text) = part1 && part2. * DATA(text) = part1 && | | && part2. * DATA(text) = |{ amount1 } + { amount2 }| && * | = | && * |{ amount1 + amount2 }|. * Output ********************************************************************** out->write( text ).
  3. Pressione CTRL + F3 para ativar a classe e F9 para executá-la como um aplicativo de console.
  4. Jogue com o código-fonte para se familiarizar com os conceitos.
    • Anule o comentário de diferentes atribuições de valor para o texto de variável declarado inline para ver um resultado diferente.
    • Tente suas próprias atribuições.

Declarar variáveis e dados do processo

Neste exercício, você cria um programa que efetua um cálculo com base em dois números e, em seguida, formata e emite o resultado.

Modelo:

  • nenhum

Solução:

  • /LRN/CL_S4D400_BTS_COMPUTE (classe global)

Tarefa 1: Declaração de variável

Em seu próprio pacote, crie uma nova classe global e defina variáveis numéricas para a entrada.

Etapas

  1. Crie uma nova classe global que implemente a interface IF_OO_ADT_CLASSRUN (nome sugerido: ZCL_##_COMPUTE, onde ## representa seu número de grupo).

    1. Selecione ArquivoNovaclasse ABAP.

    2. Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_COMPUTE, onde ## representa seu número de grupo.

    3. Insira uma descrição.

    4. No quadro de grupo Interfaces, selecione Adicionar.

    5. Insira IF_OO_ADT_CLASSRUN. Quando a interface aparecer na lista de ocorrências, clique duas vezes nela para adicioná-la à definição de classe.

    6. Selecione Avançar.

    7. Selecione sua ordem de transporte e, em seguida, Concluir.

  2. No método IF_OO_ADT_CLASSRUN~MAIN, declare duas variáveis para valores inteiros (nomes propostos: number1 e number2).

    1. Adicione o seguinte código:

      Code Snippet
      1234
      DATA number1 TYPE i. DATA number2 TYPE i.
  3. Implemente uma avaliação para cada uma das duas variáveis numéricas. Atribua um valor negativo à primeira variável e um valor positivo à segunda variável.

    1. Adicione o seguinte código:

      Code Snippet
      1234
      number1 = -8. number2 = 3.

Tarefa 2: Processamento de dados

Calcule uma proporção e escreva o resultado no console.

Etapas

  1. Implemente uma expressão aritmética que calcule a proporção dos dois números. Armazene o resultado em uma variável que você declara usando uma declaração inline (nome sugerido: result).

    1. Adicione o seguinte código:

      Code Snippet
      123
      DATA(result) = number1 / number2.
  2. Implemente um modelo de cadeia de caracteres que agrupe um texto como este:"6 / 3 = 2", com os valores reais das variáveis em vez de 6, 3 e 2. Armazene o resultado em uma variável que você declara usando uma declaração inline (nome sugerido: output).

    1. Adicione o seguinte código:

      Code Snippet
      123
      DATA(output) = |{ number1 } / { number2 } = { result }|.
  3. Chame o método out->write( … ) para gravar o texto no console.

    1. Proceda como você fez no exercício anterior.

Tarefa 3: Ativar e testar

Ative e teste o aplicativo do console.

Etapas

  1. Ative a classe.

    1. Pressione Ctrl + F3 para ativar a classe.

  2. Execute o app de console.

    1. Pressione F9 para executar o aplicativo do console.

  3. Teste o app com diferentes valores de entrada.

    1. Processe as avaliações e, em seguida, ative e execute como anteriormente.

Tarefa 4: Controlar a precisão do resultado

Certifique-se de que o resultado é arredondado para um valor com 2 casas decimais e não para um valor inteiro.

Etapas

  1. Em vez de uma declaração inline, utilize uma declaração explícita de resultado variável. Use um tipo numérico que permita especificar o número de casas decimais.

    1. No início do método if_oo_adt_classrun~main, adicione o seguinte código:

      Code Snippet
      123
      DATA result TYPE p LENGTH 8 DECIMALS 2.
    2. Na linha de código com a declaração inline, substitua DATA(result) por result.

  2. Ative a classe e teste novamente.

    1. Proceda como você fez anteriormente.

    2. Compare seu código com o seguinte extrato da solução modelo:

      Code Snippet
      12345678910111213141516171819202122232425262728293031323334
      METHOD if_oo_adt_classrun~main. * Declarations ************************** DATA number1 TYPE i. DATA number2 TYPE i. DATA result TYPE p LENGTH 8 DECIMALS 2. * Input Values ************************** number1 = -8. number2 = 3. * Calculation ************************** * DATA(result) = number1 / number2. "with inline declaration result = number1 / number2. DATA(output) = |{ number1 } / { number2 } = { result }|. * Output ************************** out->write( output ). ENDMETHOD.