SAP ABAP - Guia rápido

ABAP significa Advanced Business Application Programming, uma linguagem 4GL (4ª geração). Atualmente está posicionado, junto com o Java, como a principal linguagem de programação de servidores de aplicativos SAP.

Vamos começar com a arquitetura de alto nível do sistema SAP. A arquitetura cliente / servidor de 3 camadas de um sistema SAP típico é descrita a seguir.

o Presentation layerconsiste em qualquer dispositivo de entrada que pode ser usado para controlar o sistema SAP. Pode ser um navegador da web, um dispositivo móvel e assim por diante. Todo o processamento central ocorre emApplication server. O servidor de aplicativos não é apenas um sistema em si, mas pode ser várias instâncias do sistema de processamento. O servidor se comunica com oDatabase layerque geralmente é mantido em um servidor separado, principalmente por motivos de desempenho e também por segurança. A comunicação acontece entre cada camada do sistema, desde a camada de Apresentação até o Banco de Dados e, em seguida, o backup da cadeia.

Note- Os programas ABAP são executados no nível do servidor de aplicativos. A distribuição técnica do software é independente de sua localização física. Isso significa que basicamente todos os três níveis podem ser instalados um em cima do outro em um computador ou cada nível pode ser instalado em um computador ou servidor diferente.

Os programas ABAP residem no banco de dados SAP. Eles são executados sob o controle do sistema de tempo de execução que faz parte do kernel SAP. O sistema de tempo de execução processa todas as instruções ABAP, controlando a lógica do fluxo e respondendo aos eventos do usuário.

Portanto, ao contrário de C ++ e Java, os programas ABAP não são armazenados em arquivos externos separados. Dentro do banco de dados, o código ABAP existe em duas formas -

  • Source código que pode ser visualizado e editado com as ferramentas de workbench ABAP.

  • Generated code, que é uma representação binária. Se você estiver familiarizado com Java, este código gerado é um pouco comparável ao código de bytes Java.

O sistema de tempo de execução pode ser considerado uma máquina virtual, semelhante à máquina virtual Java. Um componente chave do sistema de tempo de execução ABAP é a interface do banco de dados que transforma as instruções independentes do banco de dados (Open SQL) em instruções compreendidas pelo banco de dados subjacente (SQL nativo). O SAP pode trabalhar com uma ampla variedade de bancos de dados e o mesmo programa ABAP pode ser executado em todos eles.

Os relatórios são um bom ponto de partida para se familiarizar com os princípios e ferramentas ABAP gerais. Os relatórios ABAP são usados ​​em muitas áreas. Neste capítulo, veremos como é fácil escrever um relatório ABAP simples.

Olá ABAP

Vamos começar com o exemplo comum "Hello World".

Cada instrução ABAP começa com uma palavra-chave ABAP e termina com um ponto. As palavras-chave devem ser separadas por pelo menos um espaço. Não importa se você usa ou não uma ou várias linhas para uma instrução ABAP.

Você precisa inserir seu código usando o Editor ABAP que faz parte das Ferramentas ABAP fornecidas com o SAP NetWeaver Application Server ABAP (também conhecido como 'AS ABAP').

'AS ABAP' é um servidor de aplicativos com seu próprio banco de dados, ambiente de tempo de execução ABAP e ferramentas de desenvolvimento ABAP como o Editor ABAP. O AS ABAP oferece uma plataforma de desenvolvimento independente de hardware, sistema operacional e banco de dados.

Usando o Editor ABAP

Step 1- Inicie a transação SE38 para navegar até o Editor ABAP (discutido no próximo capítulo). Vamos começar criando um relatório que é um dos muitos objetos ABAP.

Step 2- Na tela inicial do editor, especifique o nome do seu relatório no campo de entrada PROGRAMA. Você pode especificar o nome como ZHELLO1. O Z anterior é importante para o nome. Z garante que o seu relatório reside no namespace do cliente.

O namespace do cliente inclui todos os objetos com o prefixo Y ou Z. É sempre usado quando clientes ou parceiros criam objetos (como um relatório) para diferenciar esses objetos dos objetos do SAP e para evitar conflitos de nomes com objetos.

Step 3- Você pode digitar o nome do relatório em letras minúsculas, mas o editor irá alterá-lo para maiúsculas. Portanto, os nomes dos objetos ABAP são 'Não' com distinção entre maiúsculas e minúsculas.

Step 4- Após especificar o nome do relatório, clique no botão CRIAR. Uma janela pop-up ABAP: ATRIBUTOS DO PROGRAMA aparecerá e você fornecerá mais informações sobre o seu relatório.

Step 5- Escolha "Programa executável" como o tipo de relatório, insira o título "Meu primeiro relatório ABAP" e selecione SALVAR para continuar. A janela CREATE OBJECT DIRECTORY ENTRY aparecerá em seguida. Selecione o botão LOCAL OBJECT e o pop-up será fechado.

Você pode completar seu primeiro relatório inserindo a declaração WRITE abaixo da declaração REPORT, de modo que o relatório completo contenha apenas duas linhas, como segue -

REPORT ZHELLO1. 
WRITE 'Hello World'.

Iniciando o Relatório

Podemos usar o teclado (Ctrl + S) ou o ícone de salvar (lado direito ao lado do campo de comando) para salvar o relatório. O desenvolvimento ABAP ocorre em AS ABAP.

Iniciar o relatório é tão simples quanto salvá-lo. Clique no botão ATIVAÇÃO (lado esquerdo próximo ao ícone iniciar) e inicie o relatório usando o ícone PROCESSAMENTO DIRETO ou a tecla de função F8. O título "Meu primeiro relatório ABAP" junto com a saída "Hello World" também é exibido. Aqui está o resultado -

My First ABAP Report 
Hello World

Contanto que você não ative um novo relatório ou uma mudança em um relatório existente, isso não é relevante para seus usuários. Isso é importante em um ambiente de desenvolvimento central, onde você pode trabalhar em objetos que outros desenvolvedores usam em seus projetos.

Visualizando o Código Existente

Se você olhar o campo Programa e clicar duas vezes no valor ZHELLO1, o editor ABAP exibirá o código do seu relatório. Isso é chamado de navegação para frente. Clicar duas vezes no nome de um objeto abre esse objeto na ferramenta apropriada.

Para entender SAP ABAP, você precisa ter conhecimentos básicos de telas como Login, Editor ABAP, Logout e assim por diante. Este capítulo enfoca a navegação na tela e a funcionalidade padrão da barra de ferramentas.

Tela de login

Depois de fazer logon no servidor SAP, a tela de logon SAP solicitará a ID do usuário e a senha. Você precisa fornecer um ID de usuário e senha válidos e pressionar Enter (o ID do usuário e a senha são fornecidos pelo administrador do sistema). A seguir está a tela de login.

Ícone da barra de ferramentas

A seguir está a barra de ferramentas da tela SAP.

Menu Bar - A barra de menus é a linha superior da janela de diálogo.

Standard Toolbar - A maioria das funções padrão como Topo da página, Fim da página, Página acima, Página abaixo e Salvar estão disponíveis nesta barra de ferramentas.

Title Bar - Barra de título exibe o nome do aplicativo / processo de negócios em que você está atualmente.

Application Toolbar - Opções de menu específicas do aplicativo estão disponíveis aqui.

Command Field- Podemos iniciar um aplicativo sem navegar pelas transações do menu e alguns códigos lógicos são atribuídos aos processos de negócios. Os códigos de transação são inseridos no campo de comando para iniciar diretamente o aplicativo.

Editor ABAP

Você pode simplesmente iniciar a transação SE38 (insira SE38 no Campo de Comando) para navegar até o Editor ABAP.

Teclas e ícones padrão

Exit keyssão usados ​​para sair do programa / módulo ou para fazer logoff. Eles também são usados ​​para voltar à última tela acessada.

A seguir estão as chaves de saída padrão usadas no SAP, conforme mostrado na imagem.

A seguir estão as opções para verificar, ativar e processar os relatórios.

Sair

É sempre uma boa prática sair do editor ABAP ou / e fazer logoff do sistema SAP após terminar o trabalho.

Afirmações

O programa fonte ABAP consiste em comentários e declarações ABAP. Cada instrução em ABAP começa com uma palavra-chave e termina com um ponto, e ABAP 'Não' faz distinção entre maiúsculas e minúsculas.

A primeira linha sem comentários em um programa começa com a palavra RELATÓRIO. O Relatório será sempre a primeira linha de qualquer programa executável criado. A declaração é seguida pelo nome do programa que foi criado anteriormente. A linha é então encerrada com um ponto final.

A sintaxe é -

REPORT [Program_Name]. 
 
[Statements…].

Isso permite que a instrução ocupe quantas linhas no editor forem necessárias. Por exemplo, o RELATÓRIO pode ter a seguinte aparência -

REPORT Z_Test123_01.

As instruções consistem em um comando e quaisquer variáveis ​​e opções, terminando com um ponto. Contanto que o ponto final apareça no final da declaração, nenhum problema surgirá. É esse período que marca onde termina a afirmação.

Vamos escrever o código.

Na linha abaixo da instrução REPORT, basta digitar esta instrução: Escreva 'Tutorial ABAP'.

REPORT Z_Test123_01.

Write 'This is ABAP Tutorial'.

Four things to consider while writing statements -

  • A instrução write grava tudo o que está entre aspas na janela de saída.

  • O editor ABAP converte todo o texto em maiúsculas, exceto as sequências de texto, que são colocadas entre aspas simples.

  • Ao contrário de algumas linguagens de programação mais antigas, o ABAP não se importa onde uma instrução começa em uma linha. Você pode tirar vantagem disso e melhorar a legibilidade do seu programa usando indentação para indicar blocos de código.

  • ABAP não tem restrições quanto ao layout das declarações. Ou seja, várias instruções podem ser colocadas em uma única linha, ou uma única instrução pode se estender por várias linhas.

Notação de dois pontos

Declarações consecutivas podem ser encadeadas se o início de cada declaração for idêntico. Isso é feito com o operador de dois pontos (:) e vírgulas, que são usados ​​para encerrar as instruções individuais, da mesma forma que os pontos encerram as instruções normais.

A seguir está um exemplo de um programa que poderia economizar alguns toques de tecla -

WRITE 'Hello'. 
WRITE 'ABAP'. 
WRITE 'World'.

Usando a notação de dois pontos, ele poderia ser reescrito desta forma -

WRITE: 'Hello', 
       'ABAP', 
       'World'.

Como qualquer outra instrução ABAP, o layout não importa. Esta é uma afirmação igualmente correta -

WRITE: 'Hello', 'ABAP', 'World'.

Comentários

Comentários embutidos podem ser declarados em qualquer lugar em um programa por um dos dois métodos -

  • Comentários de linha inteira são indicados colocando um asterisco (*) na primeira posição da linha, caso em que toda a linha é considerada pelo sistema como um comentário. Os comentários não precisam ser encerrados por um ponto, porque eles não podem se estender por mais de uma linha -

* This is the comment line
  • Os comentários de linha parcial são indicados inserindo-se uma aspa dupla (") após uma declaração. Todo o texto após a aspa dupla é considerado pelo sistema como um comentário. Você não precisa encerrar os comentários de linha parcial por um ponto, porque eles não podem se estender mais de uma linha -

WRITE 'Hello'. "Here is the partial comment

Note - O código comentado não é capitalizado pelo editor ABAP.

Suprimindo espaços em branco

O comando NO-ZERO segue a instrução DATA. Ele suprime todos os zeros à esquerda de um campo de número que contém espaços em branco. A saída geralmente é mais fácil para os usuários lerem.

Exemplo

REPORT Z_Test123_01. 

DATA: W_NUR(10) TYPE N.
      MOVE 50 TO W_NUR.
      WRITE W_NUR NO-ZERO.

O código acima produz a seguinte saída -

50

Note - Sem o comando NO-ZERO, a saída é: 0000000050

Linhas em Branco

O comando SKIP ajuda a inserir linhas em branco na página.

Exemplo

O comando da mensagem é o seguinte -

WRITE 'This is the 1st line'. 
SKIP. 
WRITE 'This is the 2nd line'.

O comando de mensagem acima produz a seguinte saída -

This is the 1st line 
This is the 2nd line

Podemos usar o comando SKIP para inserir várias linhas em branco.

SKIP number_of_lines.

A saída seria várias linhas em branco definidas pelo número de linhas. O comando SKIP também pode posicionar o cursor em uma linha desejada na página.

SKIP TO LINE line_number.

Este comando é usado para mover dinamicamente o cursor para cima e para baixo na página. Normalmente, uma instrução WRITE ocorre após este comando para colocar a saída na linha desejada.

Inserindo Linhas

O comando ULINE insere automaticamente uma linha horizontal na saída. Também é possível controlar a posição e o comprimento da linha. A sintaxe é muito simples -

ULINE.

Exemplo

O comando da mensagem é o seguinte -

WRITE 'This is Underlined'.
ULINE.

O código acima produz a seguinte saída -

This is Underlined (and a horizontal line below this).

Mensagens

O comando MESSAGE exibe mensagens definidas por um ID de mensagem especificado na instrução REPORT no início do programa. O ID da mensagem é um código de 2 caracteres que define qual conjunto de 1.000 mensagens o programa acessará quando o comando MESSAGE for usado.

As mensagens são numeradas de 000 a 999. Associado a cada número está um texto de mensagem com no máximo 80 caracteres. Quando o número da mensagem é chamado, o texto correspondente é exibido.

A seguir estão os caracteres para uso com o comando Message -

mensagem Tipo Consequências
E Erro A mensagem aparece e o aplicativo é interrompido em seu ponto atual. Se o programa estiver sendo executado em segundo plano, o trabalho será cancelado e a mensagem será gravada no registro do trabalho.
W Atenção A mensagem é exibida e o usuário deve pressionar Enter para que o aplicativo continue. No modo de segundo plano, a mensagem é gravada no registro do trabalho.
Eu Em formação Uma janela pop-up é aberta com o texto da mensagem e o usuário deve pressionar Enter para continuar. No modo de segundo plano, a mensagem é gravada no registro do trabalho.
UMA Abend Esta classe de mensagem cancela a transação que o usuário está usando atualmente.
S Sucesso Isso fornece uma mensagem informativa na parte inferior da tela. As informações exibidas são de natureza positiva e servem apenas para feedback do usuário. A mensagem não impede o programa de forma alguma.
X Abortar Esta mensagem aborta o programa e gera um short dump ABAP.

As mensagens de erro normalmente são usadas para impedir que os usuários façam coisas que não deveriam. As mensagens de advertência geralmente são usadas para lembrar os usuários das consequências de suas ações. As mensagens de informação fornecem aos usuários informações úteis.

Exemplo

Quando criamos uma mensagem para a mensagem de ID AB, o comando MESSAGE - MESSAGE E011 dá a seguinte saída -

EAB011 This report does not support sub-number summarization.

Ao programar em ABAP, precisamos usar uma variedade de variáveis ​​para armazenar várias informações. As variáveis ​​nada mais são do que locais de memória reservados para armazenar valores. Isso significa que, ao criar uma variável, você reserva algum espaço na memória. Você pode querer armazenar informações de vários tipos de dados, como caracteres, inteiros, pontos flutuantes, etc. Com base no tipo de dados de uma variável, o sistema operacional aloca memória e decide o que pode ser armazenado na memória reservada.

Tipos de dados elementares

O ABAP oferece ao programador uma ampla variedade de tipos de dados de comprimento fixo e variável. A tabela a seguir lista os tipos de dados elementares ABAP -

Tipo Palavra-chave
Campo de byte X
Campo de texto C
Inteiro Eu
Ponto flutuante F
Número embalado P
String de texto CORDA

Alguns dos campos e números podem ser modificados usando um ou mais nomes, como a seguir -

  • byte
  • numeric
  • character-like

A tabela a seguir mostra o tipo de dado, quanta memória é necessária para armazenar o valor na memória e os valores mínimo e máximo que podem ser armazenados em tal tipo de variáveis.

Tipo Comprimento Típico Alcance Típico
X 1 byte Qualquer valor de byte (00 a FF)
C 1 personagem 1 a 65535
N (preenchido com texto numérico) 1 personagem 1 a 65535
D (data semelhante a um caractere) 8 caracteres 8 caracteres
T (tempo semelhante ao caractere) 6 caracteres 6 caracteres
Eu 4 bytes -2147483648 a 2147483647
F 8 bytes 2.2250738585072014E-308 a 1.7976931348623157E + 308 positivo ou negativo
P 8 bytes [-10 ^ (2len -1) +1] a [+ 10 ^ (2len -1) 1] (onde len = comprimento fixo)
CORDA Variável Quaisquer caracteres alfanuméricos
XSTRING (string de byte) Variável Qualquer valor de byte (00 a FF)

Exemplo

REPORT YR_SEP_12. 
DATA text_line TYPE C LENGTH 40. 
text_line = 'A Chapter on Data Types'. 
Write text_line. 

DATA text_string TYPE STRING. 
text_string = 'A Program in ABAP'. 
Write / text_string. 

DATA d_date TYPE D. 
d_date = SY-DATUM. 
Write / d_date.

Neste exemplo, temos uma sequência de caracteres do tipo C com comprimento predefinido 40. STRING é um tipo de dados que pode ser usado para qualquer sequência de caracteres de comprimento variável (sequências de texto). Objetos de dados do tipo STRING geralmente devem ser usados ​​para conteúdo semelhante a caracteres em que o comprimento fixo não é importante.

O código acima produz a seguinte saída -

A Chapter on Data Types 
A Program in ABAP 
12092015

O tipo DATE é usado para o armazenamento de informações de data e pode armazenar oito dígitos, conforme mostrado acima.

Tipos complexos e de referência

Os tipos complexos são classificados em Structure types e Table types. Nos tipos de estrutura, tipos e estruturas elementares (isto é, estrutura embutida em uma estrutura) são agrupados. Você pode considerar apenas o agrupamento de tipos elementares. Mas você deve estar ciente da disponibilidade de aninhamento de estruturas.

Quando os tipos elementares são agrupados, o item de dados pode ser acessado como um item de dados agrupado ou os itens de dados de tipo elementar individuais (campos de estrutura) podem ser acessados. Os tipos de tabela são mais conhecidos como matrizes em outras linguagens de programação.Arrayspodem ser arrays simples ou de estrutura. No ABAP, os arrays são chamados de tabelas internas e podem ser declarados e operados de várias maneiras quando comparados a outras linguagens de programação. A tabela a seguir mostra os parâmetros de acordo com os quais as tabelas internas são caracterizadas.

S.No. Parâmetro e Descrição
1

Line or row type

A linha de uma tabela interna pode ser do tipo elementar, complexo ou de referência.

2

Key

Especifica um campo ou grupo de campos como uma chave de uma tabela interna que identifica as linhas da tabela. Uma chave contém os campos de tipos elementares.

3

Access method

Descreve como os programas ABAP acessam entradas de tabela individuais.

Os tipos de referência são usados ​​para se referir a instâncias de classes, interfaces e itens de dados de tempo de execução. Os serviços de tipo de tempo de execução ABAP OOP (RTTS) permitem a declaração de itens de dados em tempo de execução.

Variáveis ​​são objetos de dados nomeados usados ​​para armazenar valores dentro da área de memória alocada de um programa. Como o nome sugere, os usuários podem alterar o conteúdo das variáveis ​​com a ajuda de instruções ABAP. Cada variável no ABAP possui um tipo específico, que determina o tamanho e o layout da memória da variável; a faixa de valores que podem ser armazenados nessa memória; e o conjunto de operações que podem ser aplicadas à variável.

Você deve declarar todas as variáveis ​​antes que elas possam ser usadas. A forma básica de uma declaração de variável é -

DATA <f> TYPE <type> VALUE <val>.

Aqui <f> especifica o nome de uma variável. O nome da variável pode ter até 30 caracteres. <tipo> especifica o tipo de variável. Qualquer tipo de dados com atributos técnicos totalmente especificados é conhecido como <tipo>. O <val> especifica o valor inicial da variável de <f>. Caso você defina uma variável elementar de comprimento fixo, a instrução DATA preenche automaticamente o valor da variável com o valor inicial específico do tipo. Outros valores possíveis para <val> podem ser uma cláusula literal, constante ou explícita, como Is INITIAL.

A seguir estão exemplos válidos de declarações de variáveis.

DATA d1(2) TYPE C.  
DATA d2 LIKE d1.  
DATA minimum_value TYPE I VALUE 10.

No trecho de código acima, d1 é uma variável do tipo C, d2 é uma variável do tipo d1 e minimum_value é uma variável do tipo inteiro ABAP I.

Este capítulo irá explicar vários tipos de variáveis ​​disponíveis no ABAP. Existem três tipos de variáveis ​​em ABAP -

  • Variáveis ​​Estáticas
  • Variáveis ​​de Referência
  • Variáveis ​​do sistema

Variáveis ​​Estáticas

  • Variáveis ​​estáticas são declaradas em sub-rotinas, módulos de função e métodos estáticos.

  • O tempo de vida está vinculado ao contexto da declaração.

  • Com a instrução 'CLASS-DATA', você pode declarar variáveis ​​dentro das classes.

  • A instrução 'PARAMETERS' pode ser usada para declarar os objetos de dados elementares que estão vinculados aos campos de entrada em uma tela de seleção.

  • Você também pode declarar as tabelas internas que estão vinculadas aos campos de entrada em uma tela de seleção usando a instrução 'SELECT-OPTIONS'.

A seguir estão as convenções usadas ao nomear uma variável -

  • Você não pode usar caracteres especiais como "t" e "," para nomear variáveis.

  • O nome dos objetos de dados predefinidos não pode ser alterado.

  • O nome da variável não pode ser igual a qualquer palavra-chave ou cláusula ABAP.

  • O nome das variáveis ​​deve transmitir o significado da variável sem a necessidade de comentários adicionais.

  • Os hífens são reservados para representar os componentes das estruturas. Portanto, você deve evitar hifens em nomes de variáveis.

  • O caractere de sublinhado pode ser usado para separar palavras compostas.

Este programa mostra como declarar uma variável usando a instrução PARAMETERS -

REPORT ZTest123_01. 
PARAMETERS: NAME(10) TYPE C, 
CLASS TYPE I, 
SCORE TYPE P DECIMALS 2, 
CONNECT TYPE MARA-MATNR.

Aqui, NAME representa um parâmetro de 10 caracteres, CLASS especifica um parâmetro do tipo inteiro com o tamanho padrão em bytes, SCORE representa um parâmetro de tipo compactado com valores de até duas casas decimais e CONNECT refere-se ao tipo MARA-MATNF do dicionário ABAP .

O código acima produz a seguinte saída -

Variáveis ​​de Referência

A sintaxe para declarar variáveis ​​de referência é -

DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.
  • A adição REF TO declara uma variável de referência ref.

  • A especificação após REF TO especifica o tipo estático da variável de referência.

  • O tipo estático restringe o conjunto de objetos aos quais <ref> pode se referir.

  • O tipo dinâmico de variável de referência é o tipo de dados ou classe a que se refere atualmente.

  • O tipo estático é sempre mais geral ou igual ao tipo dinâmico.

  • A adição TYPE é usada para criar um tipo de referência de limite e como um valor inicial, e apenas IS INITIAL pode ser especificado após a adição de VALUE.

Exemplo

CLASS C1 DEFINITION. 
PUBLIC SECTION. 
DATA Bl TYPE I VALUE 1. 
ENDCLASS. DATA: Oref TYPE REF TO C1 , 
Dref1 LIKE REF TO Oref, 
Dref2 TYPE REF TO I . 
CREATE OBJECT Oref. 
GET REFERENCE OF Oref INTO Dref1. 
CREATE DATA Dref2. 
Dref2→* = Dref1→*→Bl.
  • No fragmento de código acima, uma referência de objeto Oref e duas variáveis ​​de referência de dados Dref1 e Dref2 são declaradas.

  • Ambas as variáveis ​​de referência de dados são totalmente digitadas e podem ser desreferenciadas usando o operador de desreferenciação → * nas posições do operando.

Variáveis ​​do sistema

  • As variáveis ​​do sistema ABAP são acessíveis a partir de todos os programas ABAP.

  • Na verdade, esses campos são preenchidos pelo ambiente de tempo de execução.

  • Os valores nesses campos indicam o estado do sistema em qualquer ponto do tempo.

  • Você pode encontrar a lista completa de variáveis ​​do sistema na tabela SYST do SAP.

  • Os campos individuais da estrutura SYST podem ser acessados ​​usando “SYST-” ou “SY-”.

Exemplo

REPORT Z_Test123_01. 

WRITE:/'SY-ABCDE', SY-ABCDE,       
      /'SY-DATUM', SY-DATUM, 
      /'SY-DBSYS', SY-DBSYS, 
      /'SY-HOST ', SY-HOST, 
      /'SY-LANGU', SY-LANGU,
      /'SY-MANDT', SY-MANDT,
      /'SY-OPSYS', SY-OPSYS,
      /'SY-SAPRL', SY-SAPRL,
      /'SY-SYSID', SY-SYSID,
      /'SY-TCODE', SY-TCODE,
      /'SY-UNAME', SY-UNAME,
      /'SY-UZEIT', SY-UZEIT.

O código acima produz a seguinte saída -

SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ  
SY-DATUM 12.09.2015 
SY-DBSYS ORACLE                   
SY-HOST sapserver 
SY-LANGU EN 
SY-MANDT 800 
SY-OPSYS Windows NT 
SY-SAPRL 700 
SY-SYSID DMO 
SY-TCODE SE38 
SY-UNAME SAPUSER 
SY-UZEIT 14:25:48

Literais são objetos de dados não nomeados que você cria no código-fonte de um programa. Eles são totalmente definidos por seu valor. Você não pode alterar o valor de um literal. Constantes são objetos de dados nomeados criados estaticamente usando instruções declarativas. Uma constante é declarada atribuindo-se um valor a ela que é armazenado na área de memória do programa. O valor atribuído a uma constante não pode ser alterado durante a execução do programa. Esses valores fixos também podem ser considerados literais. Existem dois tipos de literais - numérico e caractere.

Literais Numéricos

Literais de número são sequências de dígitos que podem ter um sinal prefixado. Em literais de número, não há separadores decimais e nenhuma notação com mantissa e expoente.

A seguir estão alguns exemplos de literais numéricos -

183. 
-97. 
+326.

Literais de caracteres

Literais de caracteres são sequências de caracteres alfanuméricos no código-fonte de um programa ABAP entre aspas simples. Literais de caracteres entre aspas têm o tipo C ABAP predefinido e são descritos como literais de campo de texto. Literais entre “aspas invertidas” têm o tipo ABAP STRING e são descritos como literais de string. O comprimento do campo é definido pelo número de caracteres.

Note - Em literais de campo de texto, os espaços em branco finais são ignorados, mas em literais de string eles são levados em consideração.

A seguir estão alguns exemplos de literais de caracteres.

Literais de campo de texto

REPORT YR_SEP_12. 
Write 'Tutorials Point'. 
Write / 'ABAP Tutorial'.

Literais de campo de string

REPORT YR_SEP_12. 
Write `Tutorials Point `. 
Write / `ABAP Tutorial `.

O resultado é o mesmo em ambos os casos acima -

Tutorials Point  
ABAP Tutorial

Note- Quando tentamos alterar o valor da constante, pode ocorrer uma sintaxe ou erro em tempo de execução. As constantes que você declara na parte da declaração de uma classe ou interface pertencem aos atributos estáticos dessa classe ou interface.

Declaração CONSTANTS

Podemos declarar os objetos de dados nomeados com a ajuda da instrução CONSTANTS.

A seguir está a sintaxe -

CONSTANTS <f> TYPE <type> VALUE <val>.

A instrução CONSTANTS é semelhante à instrução DATA.

<f> especifica um nome para a constante. TYPE <type> representa uma constante chamada <f>, que herda os mesmos atributos técnicos do tipo de dados existente <type>. VALUE <val> atribui um valor inicial ao nome da constante declarada <f>.

Note- Devemos usar a cláusula VALUE na instrução CONSTANTS. A cláusula 'VALUE' é usada para atribuir um valor inicial à constante durante sua declaração.

Temos 3 tipos de constantes, como elementares, complexos e constantes de referência. A instrução a seguir mostra como definir constantes usando a instrução CONSTANTS -

REPORT YR_SEP_12. 
CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'. 
Write: / 'The value of PQR is:', PQR.

O resultado é -

The value of PQR is: 1.2356

Aqui, ele se refere ao tipo de dados elementar e é conhecido como constante elementar.

A seguir está um exemplo para constantes complexas -

BEGIN OF EMPLOYEE,  
Name(25) TYPE C VALUE 'Management Team',  
Organization(40) TYPE C VALUE 'Tutorials Point Ltd',  
Place(10) TYPE C VALUE 'India',  
END OF EMPLOYEE.

No trecho de código acima, EMPLOYEE é uma constante complexa composta pelos campos Nome, Organização e Local.

A seguinte declaração declara uma referência constante -

CONSTANTS null_pointer TYPE REF TO object VALUE IS INITIAL.

Podemos usar a referência constante em comparações ou podemos passá-la para procedimentos.

ABAP fornece um rico conjunto de operadores para manipular variáveis. Todos os operadores ABAP são classificados em quatro categorias -

  • Operadores aritméticos
  • Operadores de comparação
  • Operadores bit a bit
  • Operadores de string de caracteres

Operadores aritméticos

Operadores aritméticos são usados ​​em expressões matemáticas da mesma forma que são usados ​​em álgebra. A lista a seguir descreve os operadores aritméticos. Suponha que a variável inteira A tenha 20 e a variável B 40.

S.No. Operador aritmético e descrição
1

+ (Addition)

Adiciona valores em qualquer lado do operador. Exemplo: A + B resultará em 60.

2

− (Subtraction)

Subtrai o operando direito do operando esquerdo. Exemplo: A - B dará -20.

3

* (Multiplication)

Multiplica os valores em cada lado do operador. Exemplo: A * B dará 800.

4

/ (Division)

Divide o operando esquerdo pelo operando direito. Exemplo: B / A dará 2.

5

MOD (Modulus)

Divide o operando à esquerda pelo operando à direita e retorna o restante. Exemplo: B MOD A dará 0.

Exemplo

REPORT YS_SEP_08. 
DATA: A TYPE I VALUE 150, 
B TYPE I VALUE 50, 
Result TYPE I. 
Result =  A / B. 
WRITE / Result.

O código acima produz a seguinte saída -

3

Operadores de comparação

Vamos discutir os vários tipos de operadores de comparação para diferentes operandos.

S.No. Operador de comparação e descrição
1

= (equality test). Alternate form is EQ.

Verifica se os valores dos dois operandos são iguais ou não, se sim a condição torna-se verdadeira. O exemplo (A = B) não é verdadeiro.

2

<> (Inequality test). Alternate form is NE.

Verifica se os valores de dois operandos são iguais ou não. Se os valores não forem iguais, a condição se torna verdadeira. O exemplo (A <> B) é verdadeiro.

3

> (Greater than test). Alternate form is GT.

Verifica se o valor do operando esquerdo é maior que o valor do operando direito. Se sim, a condição torna-se verdadeira. O exemplo (A> B) não é verdadeiro.

4

< (Less than test). Alternate form is LT.

Verifica se o valor do operando esquerdo é menor que o valor do operando direito. Se sim, a condição se torna verdadeira. Exemplo (A <B) é verdadeiro.

5

>= (Greater than or equals) Alternate form is GE.

Verifica se o valor do operando esquerdo é maior ou igual ao valor do operando direito. Se sim, a condição se torna verdadeira. O exemplo (A> = B) não é verdadeiro.

6

<= (Less than or equals test). Alternate form is LE.

Verifica se o valor do operando esquerdo é menor ou igual ao valor do operando direito. Se sim, a condição se torna verdadeira. Exemplo (A <= B) é verdadeiro.

7

a1 BETWEEN a2 AND a3 (Interval test)

Verifica se a1 está entre a2 e a3 (inclusive). Se sim, então a condição se torna verdadeira. O exemplo (A BETWEEN B AND C) é verdadeiro.

8

IS INITIAL

A condição torna-se verdadeira se o conteúdo da variável não foi alterado e foi atribuído automaticamente seu valor inicial. Exemplo (A IS INITIAL) não é verdadeiro

9

IS NOT INITIAL

A condição torna-se verdadeira se o conteúdo da variável mudou. Exemplo (A NÃO É INICIAL) é verdadeiro.

Note- Se o tipo de dados ou comprimento das variáveis ​​não corresponderem, a conversão automática será realizada. O ajuste automático de tipo é executado para um ou ambos os valores ao comparar dois valores de diferentes tipos de dados. O tipo de conversão é decidido pelo tipo de dados e a ordem de preferência do tipo de dados.

A seguir está a ordem de preferência -

  • Se um campo for do tipo I, o outro será convertido para o tipo I.

  • Se um campo for do tipo P, o outro será convertido para o tipo P.

  • Se um campo for do tipo D, o outro será convertido para o tipo D. Mas os tipos C e N não são convertidos e são comparados diretamente. Semelhante é o caso do tipo T.

  • Se um campo for do tipo N e o outro for do tipo C ou X, ambos os campos serão convertidos para o tipo P.

  • Se um campo for do tipo C e o outro for do tipo X, o tipo X será convertido para o tipo C.

Exemplo 1

REPORT YS_SEP_08. 

DATA: A TYPE I VALUE 115,
      B TYPE I VALUE 119.
      IF A LT B.
      WRITE: / 'A is less than B'.
      ENDIF

O código acima produz a seguinte saída -

A is less than B

Exemplo 2

REPORT YS_SEP_08. 

DATA: A TYPE I.
      IF A IS INITIAL.
      WRITE: / 'A is assigned'.
      ENDIF.

O código acima produz a seguinte saída -

A is assigned.

Operadores bit a bit

ABAP também fornece uma série de operadores lógicos bit a bit que podem ser usados ​​para construir expressões algébricas booleanas. Os operadores bit a bit podem ser combinados em expressões complexas usando parênteses e assim por diante.

S.No. Operador bit a bit e descrição
1

BIT-NOT

Operador unário que inverte todos os bits em um número hexadecimal para o valor oposto. Por exemplo, aplicar este operador a um número hexadecimal com o valor de nível de bit 10101010 (por exemplo, 'AA') resultaria em 01010101.

2

BIT-AND

Este operador binário compara cada campo bit a bit usando o operador booleano AND.

3

BIT-XOR

Operador binário que compara cada campo bit a bit usando o operador Boolean XOR (OR exclusivo).

4

BIT-OR

Operador binário que compara cada campo bit a bit usando o operador booleano OR.

Por exemplo, a seguir está a tabela verdade que mostra os valores gerados ao aplicar os operadores booleanos AND, OR ou XOR contra os valores de dois bits contidos no campo A e no campo B.

Campo A Campo B E OU XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Operadores de string de caracteres

A seguir está uma lista de operadores de string de caracteres -

S.No. Operador de string de caracteres e descrição
1

CO (Contains Only)

Verifica se A é composto exclusivamente pelos caracteres de B.

2

CN (Not Contains ONLY)

Verifica se A contém caracteres que não estão em B.

3

CA (Contains ANY)

Verifica se A contém pelo menos um caractere de B.

4

NA (NOT Contains Any)

Verifica se A não contém nenhum caractere de B.

5

CS (Contains a String)

Verifica se A contém a cadeia de caracteres B.

6

NS (NOT Contains a String)

Verifica se A não contém a cadeia de caracteres B.

7

CP (Contains a Pattern)

Ele verifica se A contém o padrão em B.

8

NP (NOT Contains a Pattern)

Ele verifica se A não contém o padrão em B.

Exemplo

REPORT YS_SEP_08. 
DATA: P(10) TYPE C VALUE 'APPLE',
      Q(10) TYPE C VALUE 'CHAIR'.
      IF P CA Q.
	
      WRITE: / 'P contains at least one character of Q'.
      ENDIF.

O código acima produz a seguinte saída -

P contains at least one character of Q.

Pode haver uma situação em que você precise executar um bloco de código várias vezes. Em geral, as instruções são executadas sequencialmente: a primeira instrução em uma função é executada primeiro, seguida pela segunda e assim por diante.

As linguagens de programação fornecem várias estruturas de controle que permitem caminhos de execução mais complicados. UMAloop statement nos permite executar uma instrução ou grupo de instruções várias vezes e a seguir está a forma geral de uma instrução de loop na maioria das linguagens de programação.

A linguagem de programação ABAP fornece os seguintes tipos de loop para lidar com os requisitos de loop.

S.No. Tipo de Loop e Descrição
1 Loop WHILE

Repete uma declaração ou grupo de declarações quando uma determinada condição é verdadeira. Ele testa a condição antes de executar o corpo do loop.

2 Fazer loop

A instrução DO é útil para repetir uma tarefa específica um número específico de vezes.

3 Loop aninhado

Você pode usar um ou mais loops dentro de qualquer outro loop WHILE ou DO.

Declarações de controle de loop

As instruções de controle de loop alteram a execução de sua sequência normal. ABAP inclui instruções de controle que permitem que os loops sejam encerrados prematuramente. Suporta as seguintes instruções de controle.

S.No. Declaração de controle e descrição
1 CONTINUAR

Faz com que o loop ignore o restante de seu corpo e inicie a próxima passagem de loop.

2 VERIFICA

Se a condição for falsa, as instruções restantes após o CHECK serão simplesmente ignoradas e o sistema iniciará a próxima passagem do loop.

3 SAÍDA

Encerra o loop totalmente e transfere a execução para a instrução imediatamente após o loop.

As estruturas de tomada de decisão têm uma ou mais condições a serem avaliadas ou testadas pelo programa, juntamente com uma declaração ou declarações que devem ser executadas, se a condição for determinada como verdadeira, e, opcionalmente, outras declarações a serem executadas, se a condição está determinado a ser falso.

A seguir está a forma geral de uma estrutura típica de tomada de decisão encontrada na maioria das linguagens de programação -

A linguagem de programação ABAP fornece os seguintes tipos de declarações de tomada de decisão.

S.No. Declaração e descrição
1 Declaração IF

Uma declaração IF consiste em uma expressão lógica seguida por uma ou mais declarações.

2 IF .. Else Statement

Uma instrução IF pode ser seguida por uma instrução ELSE opcional que é executada quando a expressão é falsa.

3 Instrução IF aninhada

Você pode usar uma instrução IF ou ELSEIF dentro de outra instrução IF ou ELSEIF.

4 Declaração de controle CASE

A instrução CASE é usada quando precisamos comparar dois ou mais campos ou variáveis.

Strings, que são amplamente usados ​​na programação ABAP, são uma sequência de caracteres.

Usamos variáveis ​​do tipo C de dados para conter caracteres alfanuméricos, com um mínimo de 1 caractere e um máximo de 65.535 caracteres. Por padrão, eles são alinhados à esquerda.

Criando Strings

A seguinte declaração e inicialização cria uma string que consiste na palavra 'Hello'. O tamanho da string é exatamente o número de caracteres da palavra 'Hello'.

Data my_Char(5) VALUE 'Hello'.

O programa a seguir é um exemplo de criação de strings.

REPORT YT_SEP_15. 
DATA my_Char(5) VALUE 'Hello'. 
Write my_Char.

O código acima produz a seguinte saída -

Hello

Comprimento da corda

Para encontrar o comprimento das cadeias de caracteres, podemos usar STRLEN statement. A função STRLEN () retorna o número de caracteres contidos na string.

Exemplo

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials',
      length_1 TYPE I. 
	
length_1 = STRLEN( title_1 ). 
Write: / 'The Length of the Title is:', length_1.

O código acima produz a seguinte saída -

The Length of the Title is: 9

ABAP oferece suporte a uma ampla variedade de instruções que manipulam strings.

S.No. Declaração e propósito
1

CONCATENATE

Duas cordas são unidas para formar uma terceira corda.

2

CONDENSE

Esta declaração exclui os caracteres de espaço.

3

STRLEN

Usado para encontrar o comprimento de um campo.

4

REPLACE

Usado para fazer substituições de caracteres.

5

SEARCH

Para executar pesquisas em cadeias de caracteres.

6

SHIFT

Usado para mover o conteúdo de uma string para a esquerda ou direita.

7

SPLIT

Usado para dividir o conteúdo de um campo em dois ou mais campos.

O exemplo a seguir faz uso de algumas das declarações mencionadas acima -

Exemplo

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials', 
      title_2(10) VALUE 'Point',
      spaced_title(30) VALUE 'Tutorials  Point  Limited',
      sep,
      dest1(30),
      dest2(30).
	
CONCATENATE title_1 title_2 INTO dest1. 
Write: / 'Concatenation:', dest1. 

CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep. 
Write: / 'Concatenation with Space:', dest2. 

CONDENSE spaced_title.
Write: / 'Condense with Gaps:', spaced_title. 

CONDENSE spaced_title NO-GAPS. 
Write: / 'Condense with No Gaps:', spaced_title.

O código acima produz a seguinte saída -

Concatenation: TutorialsPoint 
Concatenation with Space: Tutorials Point 
Condense with Gaps: Tutorials Point Limited 
Condense with No Gaps: TutorialsPointLimited

Note -

  • No caso de Concatenação, o 'sep' insere um espaço entre os campos.

  • A instrução CONDENSE remove os espaços em branco entre os campos, mas deixando apenas o espaço de 1 caractere.

  • 'NO-GAPS' é uma adição opcional à instrução CONDENSE que remove todos os espaços.

ABAP referencia implicitamente o calendário gregoriano, válido na maior parte do mundo. Podemos converter a saída em calendários específicos de cada país. Uma data é uma hora especificada para um dia, semana ou mês preciso em relação a um calendário. Uma hora é especificada em segundos ou minutos precisos em relação a um dia. ABAP sempre economiza tempo no formato de 24 horas. A saída pode ter um formato específico do país. As datas e a hora são geralmente interpretadas como datas locais válidas no fuso horário atual.

ABAP fornece dois tipos integrados para trabalhar com datas e horas -

  • Tipo de dados D
  • Tipo de dados T

A seguir está o formato básico -

DATA: date TYPE D, 
      time TYPE T.  
	
DATA: year TYPE I, 
month TYPE I,  
day TYPE I, 
hour TYPE I,  
minute TYPE I, 
second TYPE I.

Ambos os tipos são tipos de caracteres de comprimento fixo que têm a forma AAAAMMDD e HHMMSS, respectivamente.

Timestamps

Além desses tipos integrados, os outros dois tipos TIMESTAMP e TIMESTAMPLestão sendo usados ​​em muitas tabelas de aplicativo padrão para armazenar um carimbo de data / hora no formato UTC. A tabela a seguir mostra os tipos básicos de data e hora disponíveis no ABAP.

S.No. Tipo de dados e descrição
1

D

Um tipo de data de comprimento fixo integrado no formato AAAAMMDD. Por exemplo, o valor 20100913 representa a data 13 de setembro de 2010.

2

T

Um tipo de tempo de comprimento fixo integrado da forma HHMMSS. Por exemplo, o valor 102305 representa a hora 10:23:05 AM.

3

TIMESTAMP (Tipo P - Comprimento 8 sem decimais)

Este tipo é usado para representar carimbos de data / hora curtos no formato AAAAMMDDhhmmss. Por exemplo, o valor 20100913102305 representa a data 13 de setembro de 2010 às 10:23:05.

4

TIMESTAMPL (Tipo P - Comprimento 11 Decimais 7)

TIMESTAMPL representa carimbos de data / hora longos no formato AAAAMMDDhhmmss, mmmuuun. Aqui, os dígitos adicionais 'mmmuuun' representam as frações de um segundo.

Data e hora atuais

Os fragmentos de código a seguir recuperam a data e hora do sistema atual.

REPORT YR_SEP_15. 
DATA: date_1 TYPE D. 

date_1 = SY-DATUM. 
Write: / 'Present Date is:', date_1 DD/MM/YYYY. 

date_1 = date_1 + 06. 
Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.

O código acima produz a seguinte saída -

Present Date is: 21.09.2015 
Date after 6 Days is: 27.09.2015

A variável date_1 é atribuída ao valor da data atual do sistema SY-DATUM. Em seguida, incrementamos o valor da data em 6. Em termos de um cálculo de data em ABAP, isso implica que estamos aumentando o componente de dia do objeto de data em 6 dias. O ambiente de tempo de execução ABAP é inteligente o suficiente para rolar o valor da data sempre que chega ao final do mês.

Os cálculos de tempo funcionam de maneira semelhante aos cálculos de data. O código a seguir incrementa a hora atual do sistema em 75 segundos usando aritmética básica de tempo.

REPORT YR_SEP_15. 
DATA: time_1 TYPE T. 
      time_1 = SY-UZEIT. 

Write /(60) time_1 USING EDIT MASK 
'Now the Time is: __:__:__'. 
time_1 = time_1 + 75. 

Write /(60) time_1 USING EDIT MASK 
'A Minute and a Quarter from Now, it is: __:__:__'.

O código acima produz a seguinte saída -

Now the Time is 11:45:05 
A Minute and a Quarter from Now, it is: 11:46:20

Trabalhando com Timestamps

Você pode recuperar a hora atual do sistema e armazená-la em uma variável de carimbo de data / hora usando GET TIME STAMPconforme mostrado no código a seguir. A instrução GET TIME STAMP armazena o carimbo de data / hora em formato extenso ou abreviado de acordo com o tipo de objeto de dados de carimbo de data / hora usado. O valor do carimbo de data / hora é codificado usando o padrão UTC.

REPORT YR_SEP_12. 
DATA: stamp_1 TYPE TIMESTAMP,
 
stamp_2 TYPE TIMESTAMPL. 
GET TIME STAMP FIELD stamp_1. 
Write: / 'The short time stamp is:', stamp_1 

TIME ZONE SY-ZONLO. 
GET TIME STAMP FIELD stamp_2. 
Write: / 'The long time stamp is:', stamp_2 
TIME ZONE SY-ZONLO.

O código acima produz a seguinte saída -

The short time stamp is: 18.09.2015 11:19:40 
The long time stamp is: 18.09.2015 11:19:40,9370000

No exemplo acima, estamos exibindo o carimbo de data / hora usando a adição de TIME ZONE da instrução WRITE. Essa adição formata a saída do carimbo de data / hora de acordo com as regras do fuso horário especificado. O campo do sistema SY-ZONLO é usado para exibir o fuso horário local configurado nas preferências do usuário.

ABAP oferece vários tipos de opções de formatação para formatar a saída de programas. Por exemplo, você pode criar uma lista que inclui vários itens em diferentes cores ou estilos de formatação.

A instrução WRITE é uma instrução de formatação usada para exibir dados em uma tela. Existem diferentes opções de formatação para a instrução WRITE. A sintaxe da instrução WRITE é -

WRITE <format> <f> <options>.

Nesta sintaxe, <formato> representa a especificação do formato de saída, que pode ser uma barra (/) que indica a exibição da saída a partir de uma nova linha. Além da barra, a especificação do formato inclui um número e comprimento de coluna. Por exemplo, a instrução WRITE / 04 (6) mostra que uma nova linha começa com a coluna 4 e o comprimento da coluna é 6, enquanto a instrução WRITE 20 mostra a linha atual com a coluna 20. O parâmetro <f> representa uma variável de dados ou texto numerado.

A tabela a seguir descreve várias cláusulas usadas para formatação -

S.No. Cláusula e descrição
1

LEFT-JUSTIFIED

Especifica que a saída é justificada à esquerda.

2

CENTERED

Indica que a saída está centralizada.

3

RIGHT-JUSTIFIED

Especifica que a saída é justificada à direita.

4

UNDER <g>

A saída começa diretamente no campo <g>.

5

NO-GAP

Especifica que o espaço em branco após o campo <f> é rejeitado.

6

USING EDIT MASK <m>

Denota a especificação do modelo de formato <m>. Usando nenhuma máscara de edição: especifica que o modelo de formato especificado no dicionário ABAP está desativado.

7

NO-ZERO

Se um campo contiver apenas zeros, eles serão substituídos por espaços em branco.

A seguir estão as opções de formatação para campos de Tipo Numérico -

S.No. Cláusula e descrição
1

NO-SIGN

Especifica que nenhum sinal à esquerda é exibido na tela.

2

EXPONENT <e>

Especifica que no tipo F (os campos de ponto flutuante), o expoente é definido em <e>.

3

ROUND <r>

Os campos do tipo P (tipos de dados numéricos compactados) são primeiro multiplicados por 10 ** (- r) e, em seguida, arredondados para um valor inteiro.

4

CURRENCY <c>

Indica que a formatação é feita de acordo com o valor da moeda <c> que está armazenado na tabela do banco de dados TCURX.

5

UNIT <u>

Especifica que o número de casas decimais é fixo de acordo com a unidade <u>, conforme especificado na tabela de banco de dados T006 para o tipo P.

6

DECIMALS <d>

Especifica que o número de dígitos <d> deve ser exibido após o ponto decimal.

Por exemplo, a tabela a seguir mostra diferentes opções de formatação para os campos de data -

Opção de Formatação Exemplo
DD / MM / AA 13/01/15
MM / DD / AA 13/01/15
DD / MM / AAAA 13/01/2015
MM / DD / AAAA 13/01/2015
DDMMAA 130115
MMDDAA 011315
AAMMDD 150113

Aqui, DD significa a data em dois dígitos, MM significa o mês em dois dígitos, YY significa o ano em dois dígitos e YYYY significa o ano em quatro dígitos.

Vamos dar uma olhada em um exemplo de código ABAP que implementa algumas das opções de formatação acima -

REPORT ZTest123_01.
 
DATA: n(9) TYPE C VALUE 'Tutorials', 
m(5) TYPE C VALUE 'Point'. 

WRITE: n, m. 
WRITE: / n, 
/ m UNDER n. 

WRITE: / n NO-GAP, m. 
DATA time TYPE T VALUE '112538'. 

WRITE: / time, 
/(8) time Using EDIT MASK '__:__:__'.

O código acima produz a seguinte saída -

Tutorials Point 
Tutorials  
Point 
TutorialsPoint 
112538 
11:25:38

A exceptioné um problema que surge durante a execução de um programa. Quando ocorre uma exceção, o fluxo normal do programa é interrompido e o aplicativo do programa é encerrado de forma anormal, o que não é recomendado, portanto, essas exceções devem ser tratadas.

As exceções fornecem uma maneira de transferir o controle de uma parte de um programa para outra. O tratamento de exceções ABAP é baseado em três palavras-chave - RAISE, TRY, CATCH e CLEANUP. Assumindo que um bloco levantará uma exceção, um método captura uma exceção usando uma combinação das palavras-chave TRY e CATCH. Um bloco TRY-CATCH é colocado ao redor do código que pode gerar uma exceção. A seguir está a sintaxe para usar TRY - CATCH -

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE- Exceções são levantadas para indicar que alguma situação excepcional ocorreu. Normalmente, um tratador de exceção tenta reparar o erro ou encontrar uma solução alternativa.

TRY- O bloco TRY contém a codificação do aplicativo cujas exceções devem ser tratadas. Este bloco de instruções é processado sequencialmente. Ele pode conter outras estruturas de controle e chamadas de procedimentos ou outros programas ABAP. Ele é seguido por um ou mais blocos catch.

CATCH- Um programa captura uma exceção com um manipulador de exceção no local de um programa onde você deseja manipular o problema. A palavra-chave CATCH indica a captura de uma exceção.

CLEANUP- As instruções do bloco CLEANUP são executadas sempre que ocorre uma exceção em um bloco TRY que não é capturada pelo manipulador da mesma construção TRY - ENDTRY. Dentro da cláusula CLEANUP, o sistema pode restaurar um objeto a um estado consistente ou liberar recursos externos. Ou seja, o trabalho de limpeza pode ser executado para o contexto do bloco TRY.

Levantando exceções

As exceções podem ser levantadas em qualquer ponto de um método, um módulo de função, uma sub-rotina e assim por diante. Existem duas maneiras de gerar uma exceção -

  • Exceções levantadas pelo sistema de tempo de execução ABAP.

    Por exemplo, Y = 1 / 0. Isso resultará em um erro de tempo de execução do tipo CX_SY_ZERODIVIDE.

  • Exceções levantadas pelo programador.

    Aumente e crie um objeto de exceção simultaneamente. Gerar uma exceção com um objeto de exceção que já existe no primeiro cenário. A sintaxe é: RAISE EXCEPTION exep.

Captura de exceções

Os manipuladores são usados ​​para capturar exceções.

Vamos dar uma olhada em um snippet de código -

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

No trecho de código acima, estamos tentando dividir Num1 por Num2 para obter o resultado em uma variável do tipo float.

Dois tipos de exceções podem ser gerados.

  • Erro de conversão de número.

  • Divida por exceção zero. Os manipuladores capturam a exceção CX_SY_CONVERSION_NO_NUMBER e também a exceção CX_SY_ZERODIVIDE. Aqui, o método GET_TEXT () da classe de exceção é usado para obter a descrição da exceção.

Atributos de exceções

Aqui estão os cinco atributos e métodos de exceções -

S.No. Atributo e descrição
1

Textid

Usado para definir diferentes textos para exceções e também afeta o resultado do método get_text.

2

Previous

Este atributo pode armazenar a exceção original que permite construir uma cadeia de exceções.

3

get_text

Isso retorna a representação textual como uma string de acordo com o idioma do sistema da exceção.

4

get_longtext

Isso retorna a variante longa da representação textual da exceção como uma string.

5

get_source_position

Fornece o nome do programa e o número da linha alcançada onde a exceção foi levantada.

Exemplo

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

Neste exemplo, se o número for maior que 150, a exceção CX_DEMO_ABS_TOO_LARGE é gerada. O código acima produz a seguinte saída para o número 160.

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00

Como você sabe, o SQL pode ser dividido em duas partes -

  • DML (linguagem de manipulação de dados)
  • DDL (linguagem de definição de dados)

A parte DML consiste em comandos de consulta e atualização, como SELECT, INSERT, UPDATE, DELETE, etc. e os programas ABAP lidam com a parte DML do SQL. A parte DDL consiste em comandos como CREATE TABLE, CREATE INDEX, DROP TABLE, ALTER TABLE, etc. e o ABAP Dictionary controla a parte DDL do SQL.

O dicionário ABAP pode ser visto como metadados (ou seja, dados sobre dados) que residem no banco de dados SAP junto com os metadados mantidos pelo banco de dados. O Dicionário é usado para criar e gerenciar definições de dados e para criar tabelas, elementos de dados, domínios, visualizações e tipos.

Tipos básicos no dicionário ABAP

Os tipos básicos no Dicionário ABAP são os seguintes -

  • Data elements descreva um tipo elementar definindo o tipo de dados, comprimento e possivelmente casas decimais.

  • Structures com componentes que podem ser de qualquer tipo.

  • Table types descreve a estrutura de uma tabela interna.

Vários objetos no ambiente do Dicionário podem ser referenciados em programas ABAP. O Dicionário é conhecido como área global. Os objetos no Dicionário são globais para todos os programas ABAP e os dados nos programas ABAP podem ser declarados por referência a esses objetos globais do Dicionário.

O Dicionário suporta a definição de tipos definidos pelo usuário e esses tipos são usados ​​em programas ABAP. Eles também definem a estrutura de objetos de banco de dados, como tabelas, visualizações e índices. Esses objetos são criados automaticamente no banco de dados subjacente em suas definições de Dicionário quando os objetos são ativados. O Dicionário também fornece ferramentas de edição como Pesquisar Ajuda e ferramentas de bloqueio como Bloquear Objetos.

Tarefas de Dicionário

O Dicionário ABAP alcança o seguinte -

  • Força a integridade dos dados.
  • Gerencia as definições de dados sem redundância.
  • Integra-se perfeitamente com o resto do ambiente de trabalho de desenvolvimento ABAP.

Exemplo

Qualquer tipo complexo definido pelo usuário pode ser criado a partir dos 3 tipos básicos do Dicionário. Os dados do cliente são armazenados em uma estrutura 'Cliente' com os componentes Nome, Endereço e Telefone conforme ilustrado na imagem a seguir. O nome também é uma estrutura com componentes, nome e sobrenome. Ambos os componentes são elementares porque seu tipo é definido por um elemento de dados.

O tipo de componente Endereço é definido por uma estrutura cujos componentes também são estruturas, e o componente Telefone é definido por um tipo de tabela porque um cliente pode ter mais de um número de telefone. Tipos são usados ​​em programas ABAP e também para definir os tipos de parâmetros de interface de módulos de função.

Os três objetos básicos para definir dados no dicionário ABAP são Domínios, Elementos de dados e Tabelas. O domínio é usado para a definição técnica de um campo da tabela, como tipo e comprimento do campo, e o elemento de dados é usado para a definição semântica (breve descrição). Um elemento de dados descreve o significado de um domínio em um determinado contexto de negócios. Ele contém principalmente a ajuda do campo e os rótulos dos campos na tela.

O domínio é atribuído ao elemento de dados, que por sua vez é atribuído aos campos da tabela ou aos campos da estrutura. Por exemplo, o domínio MATNR (número de material CHAR) é atribuído a elementos de dados como MATNR_N, MATNN e MATNR_D, e estes são atribuídos a muitos campos de tabela e campos de estrutura.

Criando Domínios

Antes de criar um novo domínio, verifique se algum domínio existente possui as mesmas especificações técnicas exigidas no campo da tabela. Nesse caso, devemos usar esse domínio existente. Vamos discutir o procedimento para criar o domínio.

Step 1 - Vá para a transação SE11.

Step 2- Selecione o botão de rádio para Domínio na tela inicial do Dicionário ABAP e insira o nome do domínio conforme mostrado na imagem a seguir. Clique no botão CRIAR. Você pode criar domínios nos namespaces do cliente, e o nome do objeto sempre começa com 'Z' ou 'Y'.

Step 3- Insira a descrição no campo de texto breve da tela de manutenção do domínio. Nesse caso, é “Domínio do cliente”.Note - Você não pode inserir nenhum outro atributo até que tenha inserido este atributo.

Step 4- Insira o tipo de dados, número de caracteres e casas decimais no bloco Formato da guia Definição. Pressione a tecla Output Length e ela propõe e exibe o comprimento da saída. Se você substituir o comprimento de saída proposto, poderá ver um aviso ao ativar o domínio. Você pode preencher o Convers. Campos de rotina, sinal e minúsculas, se necessário. Mas esses são sempre atributos opcionais.

Step 5- Selecione a guia Intervalo de valores. Se o domínio estiver restrito a ter apenas valores fixos, insira os valores fixos ou intervalos. Defina a tabela de valores caso o sistema deva propor esta tabela como uma tabela de verificação ao definir uma chave estrangeira para os campos referentes a este domínio. Mas todos esses são atributos opcionais.

Step 6- Salve suas alterações. O pop-up Criar entrada de diretório de objetos é exibido e solicita um pacote. Você pode inserir o nome do pacote no qual está trabalhando. Se você não tiver nenhum pacote, poderá criá-lo no Object Navigator ou salvar seu domínio usando o botão Local Object.

Step 7- Ative seu domínio. Clique no ícone Ativar (ícone de palito de fósforo) ou pressione CTRL + F3 para ativar o domínio. Uma janela pop-up aparece, listando os 2 objetos atualmente inativos, conforme mostrado no seguinte instantâneo -

Step 8- Neste ponto, a entrada superior rotulada 'DOMA' com o nome ZSEP_18 deve ser ativada. Quando estiver destacado, clique no botão de seleção verde. Esta janela desaparecerá e a barra de status exibirá a mensagem 'Objeto ativado'.

Se mensagens de erro ou avisos ocorreram quando você ativou o domínio, o log de ativação é exibido automaticamente. O log de ativação exibe informações sobre o fluxo de ativação. Você também pode chamar o registro de ativação com Utilitários (M) → Registro de ativação.

Os elementos de dados descrevem os campos individuais no dicionário de dados ABAP. Eles são as menores unidades indivisíveis dos tipos complexos e são usados ​​para definir o tipo de campo de tabela, componente de estrutura ou tipo de linha de uma tabela. Informações sobre o significado de um campo de tabela e também informações sobre como editar o campo de tela correspondente podem ser atribuídas a um elemento de dados. Essas informações ficam automaticamente disponíveis para todos os campos da tela que se referem ao elemento de dados. Os elementos de dados descrevem tipos elementares ou tipos de referência.

Criação de elementos de dados

Antes de criar um novo elemento de dados, você precisa verificar se algum elemento de dados existente tem as mesmas especificações semânticas exigidas no campo da tabela. Nesse caso, você pode usar esse elemento de dados existente. Você pode atribuir o elemento de dados com um tipo predefinido, domínio ou tipo de referência.

A seguir está o procedimento para criar o elemento de dados -

Step 1 - Vá para a transação SE11.

Step 2 - Selecione o botão de rádio para Tipo de dados na tela inicial do Dicionário ABAP e insira o nome do elemento de dados conforme mostrado abaixo.

Step 3- Clique no botão CRIAR. Você pode criar elementos de dados nos namespaces do cliente, e o nome do objeto sempre começa com 'Z' ou 'Y'.

Step 4 - Verifique o botão de opção Elemento de dados no pop-up CRIAR TIPO que aparece com três botões de opção.

Step 5- Clique no ícone da marca de seleção verde. Você é direcionado para a tela de manutenção do elemento de dados.

Step 6- Entrar a descrição no campo de texto breve da tela de atualização do elemento de dados. Nesse caso, é “Elemento de dados do cliente”.Note - Você não pode inserir nenhum outro atributo até que tenha inserido este atributo.

Step 7- Atribua o elemento de dados com o tipo. Você pode criar um elemento de dados elementares verificando o tipo elementar ou um elemento de dados de referência verificando o tipo de referência. Você pode atribuir um elemento de dados a um Domínio ou Tipo Predefinido no Tipo Elementar e com Nome do Tipo de Referência ou Referência ao Tipo Predefinido no Tipo de Referência.

Step 8- Insira os campos para texto curto, texto médio, texto longo e título na guia Rótulo do campo. Você pode pressionar Enter e o comprimento é gerado automaticamente para esses rótulos.

Step 9- Salve suas alterações. O pop-up Criar entrada de diretório de objetos é exibido e solicita um pacote. Você pode inserir o nome do pacote no qual está trabalhando. Se você não tiver nenhum pacote, poderá criá-lo no Object Navigator ou salvar seu elemento de dados usando o botão Local Object.

Step 10- Ative seu elemento de dados. Clique no ícone Ativar (ícone de palito de fósforo) ou pressione CTRL + F3 para ativar o elemento de dados. Uma janela pop-up aparece, listando os 2 objetos inativos no momento, conforme mostrado na captura de tela a seguir.

Step 11- Neste ponto, a entrada superior identificada como 'DTEL' com o nome Z_CUST deve ser ativada. Quando estiver destacado, clique no botão de seleção verde. Esta janela desaparecerá e a barra de status exibirá a mensagem 'Objeto ativado'.

Se mensagens de erro ou avisos ocorreram quando você ativou o elemento de dados, o registro de ativação é exibido automaticamente. O log de ativação exibe informações sobre o fluxo de ativação. Você também pode chamar o registro de ativação com Utilitários (M) → Registro de ativação.

As tabelas podem ser definidas independentemente do banco de dados no dicionário ABAP. Quando uma tabela é ativada no Dicionário ABAP, uma cópia semelhante de seus campos também é criada no banco de dados. As tabelas definidas no Dicionário ABAP são traduzidas automaticamente para o formato compatível com o banco de dados, pois a definição da tabela depende do banco de dados utilizado pelo sistema SAP.

Uma tabela pode conter um ou mais campos, cada um definido com seu tipo de dados e comprimento. A grande quantidade de dados armazenados em uma tabela é distribuída entre os diversos campos definidos na tabela.

Tipos de campos de tabela

Uma tabela consiste em muitos campos e cada campo contém muitos elementos. A tabela a seguir lista os diferentes elementos dos campos da tabela -

S.No. Elementos e descrição
1

Field name

Este é o nome dado a um campo que pode conter no máximo 16 caracteres. O nome do campo pode ser composto de dígitos, letras e sublinhados. Deve começar com uma carta.

2

Key flag

Determina se um campo pertence ou não a um campo-chave.

3

Field type

Atribui um tipo de dados a um campo.

4

Field length

O número de caracteres que podem ser inseridos em um campo.

5

Decimal places

Define o número de dígitos permitidos após a vírgula decimal. Este elemento é usado apenas para tipos de dados numéricos.

6

Short text

Descreve o significado do campo correspondente.

Criação de tabelas no dicionário ABAP

Step 1- Vá para a transação SE11, selecione o botão de rádio 'Tabela do banco de dados' e insira um nome para a tabela a ser criada. No nosso caso, inserimos o nome ZCUSTOMERS1. Clique no botão Criar. A tela Dicionário: Atualizar Tabela é exibida. Aqui, a guia 'Entrega e manutenção' é selecionada por padrão.

Step 2 - Insira um texto breve explicativo no campo Descrição resumida.

Step 3- Clique no ícone Pesquisar na Ajuda ao lado do campo Classe de entrega. Selecione a opção 'A [Tabela de aplicativos (dados mestre e de transação)]'.

Step 4- Selecione a opção 'Exibição / Manutenção Permitida' no menu suspenso 'Navegador de Dados / Visualização de Tabela Manutenção'. A tela Dicionário: Tabela de manutenção é exibida.

Step 5- Selecione a guia Campos. A tela contendo as opções relacionadas à guia Campos é exibida.

Step 6- Insira os nomes dos campos da tabela na coluna Campo. Um nome de campo pode conter letras, dígitos e sublinhados, mas deve sempre começar com uma letra e não deve ter mais de 16 caracteres.

Os campos que devem ser criados também devem ter elementos de dados porque eles pegam os atributos, como tipo de dados, comprimento, casas decimais e texto curto, do elemento de dados definido.

Step 7- Selecione a coluna Chave se quiser que o campo faça parte da chave da tabela. Vamos criar campos como CLIENTE, CLIENTE, NOME, TÍTULO e DOB.

Step 8- O primeiro campo é importante e identifica o cliente ao qual os registros estão associados. Insira 'Cliente' como o campo e 'MANDT' como o elemento de dados. O sistema preenche automaticamente o tipo de dados, comprimento, decimais e descrição curta. O campo 'Cliente' é transformado em campo chave marcando a caixa 'Chave'.

Step 9- O próximo campo é 'Cliente'. Marque a caixa para torná-lo um campo-chave e insira o novo elemento de dados 'ZCUSTNUM'. Clique no botão Salvar.

Step 10- Como o elemento de dados 'ZCUSTNUM' ainda não existe, ele deve ser criado. Clique duas vezes no novo elemento de dados e a janela 'Criar elemento de dados' aparecerá. Responda 'Sim' a isso e uma janela 'Manter elemento de dados' aparecerá.

Step 11- Insira 'Número do cliente' na área Descrição resumida. O tipo de dado Elementary denominado 'Domain' deve ser definido para o novo elemento Data. Então digite 'ZCUSTD1', clique duas vezes nele e concorde em salvar as alterações feitas. Escolha 'Sim' para criar o domínio e digite na caixa 'Descrição resumida' uma descrição do domínio.

A guia 'Definição' abre automaticamente. O primeiro campo é 'Tipo de dados'.

Step 12- Clique dentro da caixa e selecione o tipo 'NUMC' no menu suspenso. Digite o número 8 no campo 'No. de caracteres '(máximo de 8 caracteres) e digite 0 na área de' Casas decimais '. O comprimento de saída de 8 deve ser selecionado e, a seguir, pressione Enter. A descrição do campo 'NUMC' deve reaparecer, confirmando que esta é uma entrada válida.

Step 13 - Clique no botão Salvar e ative o objeto.

Step 14- Pressione F3 para retornar à tela 'Manter / Alterar Elemento de Dados'. Crie quatro rótulos de campo conforme mostrado no instantâneo a seguir. Depois disso, salve e ative o elemento.

Step 15- Pressione o botão Voltar para retornar à tela de manutenção da mesa. A coluna Cliente possui o tipo de dados, comprimento, decimais e descrição curta corretos. Isso indica a criação bem-sucedida de um elemento de dados e também do domínio utilizado.

Da mesma forma, precisamos criar três campos adicionais, como NOME, TÍTULO e DOB.

Step 16- Selecione 'Configurações técnicas' na barra de ferramentas. Escolha APPL0 para a 'Classe de dados' e a primeira categoria de tamanho 0 para o campo 'Tamanho' categoria '. No caso de opções de buffer, 'Buffer não permitido' deve ser selecionado.

Step 17- Clique em Salvar. Volte para a mesa e ative-a. A tela a seguir é exibida.

A tabela 'ZCUSTOMERS1' está ativada.

Structure é um objeto de dados que é feito de componentes de qualquer tipo de dados armazenados um após o outro na memória.

As estruturas são úteis para pintar campos de tela e para manipular dados que possuem um formato consistente definido por um número discreto de campos.

Uma estrutura pode ter apenas um único registro em tempo de execução, mas uma tabela pode ter muitos registros.

Criando uma Estrutura

Step 1 - Vá para a transação SE11.

Step 2- Clique na opção 'Tipo de dados' na tela. Digite o nome 'ZSTR_CUSTOMER1' e clique no botão Criar.

Step 3- Selecione a opção 'Estrutura' na próxima tela e pressione Enter. Você pode ver o assistente 'Manter / Alterar Estrutura'.

Step 4 - Insira a Descrição resumida conforme mostrado no instantâneo a seguir.

Step 5 - Insira o componente (nome do campo) e o tipo de componente (elemento de dados).

Note: Aqui, os nomes dos componentes começam com Z de acordo com a recomendação SAP. Vamos usar os elementos de dados que já criamos na tabela do banco de dados.

Step 6 - Você precisa salvar, verificar e ativar depois de fornecer todos os componentes e tipos de componentes.

A seguinte tela aparece -

Step 7- Quando este 'ZSTR_CUSTOMER1' estiver destacado, clique no botão de seleção verde. Esta janela desaparecerá e a barra de status exibirá a mensagem 'Ativo'.

A estrutura agora está ativada conforme mostrado no seguinte instantâneo -

Uma Visualização funciona apenas como uma tabela de banco de dados. Mas não ocupará espaço de armazenamento. Uma visão age de forma semelhante a uma mesa virtual - uma mesa que não tem existência física. Uma visualização é criada combinando os dados de uma ou mais tabelas contendo informações sobre um objeto de aplicativo. Usando visualizações, você pode representar um subconjunto dos dados contidos em uma tabela ou pode juntar várias tabelas em uma única tabela virtual.

Os dados relacionados a um objeto de aplicativo são distribuídos entre várias tabelas usando visualizações de banco de dados. Eles usam a condição de junção interna para juntar os dados de tabelas diferentes. Uma visualização de manutenção é usada para exibir e modificar os dados armazenados em um objeto de aplicativo. Cada visualização de manutenção possui um status de manutenção associado a ela.

Usamos a visualização de projeção para mascarar campos indesejados e exibir apenas os campos relevantes em uma tabela. As vistas de projeção devem ser definidas em uma única tabela transparente. Uma vista de projeção contém exatamente uma tabela. Não podemos definir as condições de seleção para vistas de projeção.

Criação de uma visão

Step 1- Selecione o botão de opção Exibir na tela inicial do Dicionário ABAP. Insira o nome da visualização a ser criada e clique no botão Criar. Inserimos o nome da visualização como ZVIEW_TEST.

Step 2- Selecione o botão de opção de visualização de projeção ao escolher o tipo de visualização e clique no botão Copiar. A tela 'Dicionário: Alterar visualização' é exibida.

Step 3 - Insira uma descrição resumida no campo Descrição resumida e o nome da tabela a ser usada no campo Tabela de base, conforme mostrado no instantâneo a seguir.

Step 4 - Clique no botão 'Campos da tabela' para incluir os campos da tabela ZCUSTOMERS1 na vista de projeção.

Step 5- A tela Seleção de Campo da Tabela ZCUSTOMERS1 aparece. Selecione os campos que deseja incluir na vista de projeção, conforme mostrado no instantâneo a seguir.

Step 6 - Depois de clicar no botão Copiar, todos os campos selecionados para a visualização de projeção são exibidos na tela 'Dicionário: Alterar Visualização'.

Step 7- Selecione a guia Maintenance Status para definir um método de acesso. Escolha o botão de rádio somente leitura e a opção 'Exibição / manutenção permitida com restrições' no menu suspenso de 'Navegador de dados / Manutenção de exibição de tabela'.

Step 8- Salvar e ativar. Na tela 'Dicionário: Alterar Visualização' selecione Utilitários (M)> Conteúdo para exibir a tela de seleção para ZVIEW_TEST.

Step 9- Clique no ícone Executar. A saída da vista de projeção aparece conforme mostrado na captura de tela a seguir.

A tabela ZCUSTOMERS1 consiste em 5 campos. Aqui, os campos exibidos são 3 (Cliente, Número do Cliente e Nome) com 4 entradas. Os números do cliente vão de 100001 a 100004 com nomes apropriados.

O Search Help, outro objeto do repositório do ABAP Dictionary, é usado para exibir todos os valores possíveis para um campo na forma de uma lista. Esta lista também é conhecida comohit list. Você pode selecionar os valores que devem ser inseridos nos campos dessa lista de resultados em vez de inserir o valor manualmente, o que é tedioso e sujeito a erros.

Criação de ajuda de pesquisa

Step 1- Vá para a transação SE11. Selecione o botão de opção para obter ajuda da Pesquisa. Digite o nome da ajuda de pesquisa a ser criada. Vamos inserir o nome ZSRCH1. Clique no botão Criar.

Step 2- O sistema solicitará o tipo de ajuda de pesquisa a ser criado. Selecione a ajuda de pesquisa elementar, que é o padrão. A tela para criar ajuda de pesquisa elementar, conforme mostrado na imagem a seguir, aparece.

Step 3- No método de seleção, precisamos indicar se nossa fonte de dados é uma tabela ou uma visão. No nosso caso, é uma mesa. A tabela é ZCUSTOMERS1. Ele é selecionado em uma lista de seleção.

Step 4- Depois que o método de seleção é inserido, o próximo campo é o tipo de diálogo. Isso controla a aparência da caixa de diálogo restritiva. Existe uma lista suspensa com três opções. Vamos selecionar a opção 'Exibir valores imediatamente'.

Step 5- A seguir está a área de parâmetros. Para cada parâmetro ou campo de ajuda da Pesquisa, esses campos de coluna devem ser inseridos de acordo com os requisitos.

  • Search help parameter- Este é um campo da fonte de dados. Os campos da tabela são listados na lista de seleção. Os campos que participam da ajuda de pesquisa seriam inseridos, um campo em cada linha. Vamos incluir os dois campos CUSTOMER e NAME. A forma como esses dois campos participam é indicada no restante das colunas.

  • Import- Este campo é uma caixa de seleção para indicar se um parâmetro de ajuda da Pesquisa é um parâmetro de importação. A exportação ou importação é feita com referência à ajuda de pesquisa.

  • Export- Este campo é uma caixa de seleção para indicar se um parâmetro de ajuda da Pesquisa é um parâmetro de exportação. A exportação será a transferência dos valores dos campos da lista de seleção para os campos da tela.

  • LPos- Seu valor controla a posição física do parâmetro de ajuda da Pesquisa ou campo na lista de seleção. Se você inserir o valor 1, o campo aparecerá na primeira posição na lista de seleção e assim por diante.

  • SPos- Controla a posição física do parâmetro ou campo da Ajuda de Pesquisa na caixa de diálogo restritiva. Se você inserir o valor 1, o campo aparecerá na primeira posição na caixa de diálogo restritiva e assim por diante.

  • Data element- Cada parâmetro ou campo da Ajuda de pesquisa, por padrão, recebe um elemento de dados que foi atribuído a ele na fonte de dados (Tabela ou Visualização). Este nome de elemento de dados aparece no modo de exibição.

Step 6- Execute uma verificação de consistência e ative a ajuda de pesquisa. Pressione F8 para executar. A tela 'Test Search Help ZSRCH1' aparece conforme mostrado na imagem a seguir.

Step 7- Vamos inserir o número 100004 no campo da tela 'Pronto para inp' do CLIENTE. Pressione Enter.

O número do cliente, 100004, e o nome 'STEPHEN' são exibidos.

Objeto de bloqueio é um recurso oferecido pelo Dicionário ABAP que é usado para sincronizar o acesso aos mesmos dados por mais de um programa. Os registros de dados são acessados ​​com a ajuda de programas específicos. Os objetos de bloqueio são usados ​​no SAP para evitar a inconsistência quando os dados são inseridos ou alterados no banco de dados. As tabelas cujos registros de dados devem ser bloqueados devem ser definidas em um Objeto de Bloqueio, junto com seus campos-chave.

Mecanismo de bloqueio

A seguir estão as duas funções principais realizadas com o mecanismo de bloqueio -

  • Um programa pode se comunicar com outros programas sobre registros de dados que está apenas lendo ou alterando.

  • Um programa pode evitar a leitura de dados que acabaram de ser alterados por outro programa.

UMA lock requesté gerado primeiro pelo programa. Em seguida, essa solicitação vai para o servidor Enqueue e o bloqueio é criado na tabela de bloqueio. O servidor Enqueue define o bloqueio e o programa está finalmente pronto para acessar os dados.

Criação de objetos de bloqueio

Step 1- Vá para a transação SE11. A tela a seguir é aberta.

Step 2- Clique no botão de opção 'Bloquear objeto'. Insira o nome do objeto de bloqueio começando com E e clique no botão Criar. Aqui usamos EZLOCK12.

Step 3 - Insira o campo de descrição resumida e clique na guia Tabelas.

Step 4 - Insira o nome da tabela no campo Nome e selecione o modo de bloqueio como Write Lock.

Step 5 - Clique na guia Bloquear parâmetro, a tela a seguir aparecerá.

Step 6- Salvar e ativar. Serão gerados 2 módulos de função automaticamente. Para verificar os módulos de função, podemos usar Ir para → Bloquear Módulos.

Step 7 - Clique em Bloquear Módulos e a tela a seguir será aberta.

O objeto de bloqueio foi criado com sucesso.

Os campos-chave de uma tabela incluída em um objeto de bloqueio são chamados de argumentos de bloqueio e são usados ​​como parâmetros de entrada em módulos de função. Esses argumentos são usados ​​para definir e remover os bloqueios gerados pela definição do objeto de bloqueio.

É uma boa prática manter seus programas o mais independentes e fáceis de ler possível. Apenas tente dividir tarefas grandes e complicadas em tarefas menores e mais simples, colocando cada tarefa em seu módulo individual, no qual o desenvolvedor pode se concentrar sem outras distrações.

No ambiente SAP ABAP, a modularização envolve a organização de programas em unidades modulares, também conhecidas como logical blocks. Ele reduz a redundância e aumenta a legibilidade do programa, mesmo enquanto você o está criando e, posteriormente, durante o ciclo de manutenção. A modularização também permite a reutilização do mesmo código novamente. O ABAP tornou necessário para os desenvolvedores modularizar, ou seja, organizar os programas relativamente mais, do que nas linguagens baseadas em OOPS que têm relativamente mais recursos modulares integrados. Depois que uma pequena seção modularizada do código é concluída, depurada e assim por diante, não é necessário retornar para ela posteriormente e os desenvolvedores podem prosseguir e se concentrar em outros problemas.

Os programas ABAP são constituídos por blocos de processamento conhecidos como blocos de processamento de modularização. Eles são -

  • Os blocos de processamento chamados de fora do programa e do ambiente de tempo de execução ABAP (ou seja, blocos de eventos e módulos de diálogo).

  • Processando blocos chamados de programas ABAP.

Além da modularização com blocos de processamento, módulos de código-fonte são usados ​​para modularizar seu código-fonte por meio de macros e incluir programas.

Modularização no nível do código-fonte -

  • Macros Locais
  • Programas globais de inclusão

Modularização através de blocos de processamento chamados de programas ABAP -

  • Subroutines
  • Módulos de função

Modularizar um código-fonte significa colocar uma sequência de instruções ABAP em um módulo. O código-fonte modularizado pode ser chamado em um programa de acordo com a exigência do usuário. Os módulos de código-fonte aumentam a legibilidade e a compreensão dos programas ABAP. Criar módulos de código-fonte individuais também evita que seja necessário escrever repetidamente as mesmas instruções, o que, por sua vez, torna o código mais fácil de entender para qualquer pessoa que o leia pela primeira vez.

Uma sub-rotina é uma seção reutilizável de código. É uma unidade de modularização dentro do programa onde uma função é encapsulada na forma de código-fonte. Você transfere uma parte de um programa para uma sub-rotina para obter uma visão geral melhor do programa principal e para usar a sequência correspondente de instruções muitas vezes, conforme ilustrado no diagrama a seguir.

Temos o programa X com 3 diferentes source code blocks. Cada bloco possui as mesmas instruções ABAP. Basicamente, eles são os mesmos blocos de código. Para tornar esse código mais fácil de manter, podemos encapsular o código em uma sub-rotina. Podemos chamar esta sub-rotina em nossos programas quantas vezes quisermos. Uma sub-rotina pode ser definida usando instruções Form e EndForm.

A seguir está a sintaxe geral de uma definição de sub-rotina.

FORM <subroutine_name>.
  
<statements> 
  
ENDFORM.

Podemos chamar uma sub-rotina usando a instrução PERFORM. O controle pula para a primeira instrução executável na sub-rotina <subroutine_name>. Quando ENDFORM é encontrado, o controle volta para a instrução seguinte à instrução PERFORM.

Exemplo

Step 1- Vá para a transação SE80. Abra o programa existente e clique com o botão direito do mouse no programa. Neste caso, é 'ZSUBTEST'.

Step 2- Selecione Criar e selecione Sub-rotina. Escreva o nome da sub-rotina no campo e clique no botão continuar. O nome da sub-rotina é 'Sub_Display' como mostrado na imagem a seguir.

Step 3- Escreva o código no bloco de instrução FORM e ENDFORM. A sub-rotina foi criada com sucesso.

Precisamos incluir a instrução PERFORM para chamar a sub-rotina. Vamos dar uma olhada no código -

REPORT ZSUBTEST. 
PERFORM Sub_Display.

* Form Sub_Display 
* -->  p1 text 
* <--  p2 text 
 
FORM Sub_Display. 
Write: 'This is Subroutine'. 
Write: / 'Subroutine created successfully'. 
ENDFORM.                    " Sub_Display

Step 4- Salvar, ativar e executar o programa. O código acima produz a seguinte saída -

Subroutine Test:
   
This is Subroutine
  
Subroutine created successfully

Portanto, o uso de sub-rotinas torna seu programa mais orientado a funções. Ele divide a tarefa do programa em subfunções, de forma que cada sub-rotina é responsável por uma subfunção. Seu programa se torna mais fácil de manter, pois as alterações nas funções geralmente só precisam ser implementadas na sub-rotina.

Se quisermos reutilizar o mesmo conjunto de instruções mais de uma vez em um programa, precisamos incluí-los em uma macro. Por exemplo, uma macro pode ser útil para cálculos longos ou para escrever instruções WRITE complexas. Só podemos usar uma macro dentro de um programa no qual ela está definida. A definição da macro deve ocorrer antes que a macro seja usada no programa.

As macros são projetadas com base em marcadores de posição. Placeholder funciona como ponteiros em linguagem C. Você pode definir uma macro na instrução DEFINE ... END-OF-DEFINITION.

A seguir está a sintaxe básica de uma definição de macro -

DEFINE <macro_name>. <statements> 
END-OF-DEFINITION. 
   ...... 
  
   <macro_name> [<param1> <param2>....].

É necessário definir uma macro antes de invocá-la. O <param1>…. substitui os espaços reservados & 1 ... nas instruções ABAP contidas na definição da macro.

O número máximo de marcadores de posição em uma definição de macro é nove. Ou seja, quando um programa é executado, o sistema SAP substitui a macro por instruções apropriadas e os espaços reservados & 1, & 2,…. & 9 são substituídos pelos parâmetros param1, param2, .... param9. Podemos invocar uma macro dentro de outra macro, mas não a mesma macro.

Exemplo

Vá para a transação SE38. Crie um novo programa ZMACRO_TEST junto com a descrição no campo de texto curto e também com os atributos apropriados, como Tipo e Status, conforme mostrado na imagem a seguir -

A seguir está o código -

REPORT ZMACRO_TEST. 
DEFINE mac_test. 
WRITE: 'This is Macro &1'. 
END-OF-DEFINITION. 

PARAMETERS: s1 type C as checkbox. 
PARAMETERS: s2 type C as checkbox. 
PARAMETERS: s3 type C as checkbox default 'X'. 

START-OF-SELECTION. 
IF s1 = 'X'. 
   mac_test 1. ENDIF. 
IF s2 = 'X'. 
   mac_test 2. 
ENDIF.
 
IF s3 = 'X'. 
   mac_test 3. 
ENDIF.

Temos 3 caixas de seleção. Durante a execução do programa, vamos marcar a caixa de seleção S2.

O código acima produz a seguinte saída -

A Macro Program 
 
This is Macro 2

Se todas as caixas de seleção forem selecionadas, o código produzirá a seguinte saída -

A Macro Program 
 
This is Macro 1 This is Macro 2 This is Macro 3

Os módulos de função constituem a maior parte de um sistema SAP, pois há anos o SAP modulariza o código usando módulos de função, permitindo a reutilização do código, por eles próprios, seus desenvolvedores e também por seus clientes.

Módulos de função são subprogramas que contêm um conjunto de instruções reutilizáveis ​​com parâmetros de importação e exportação. Ao contrário dos programas de inclusão, os módulos de função podem ser executados independentemente. O sistema SAP contém vários módulos de função predefinidos que podem ser chamados de qualquer programa ABAP. O grupo de funções atua como uma espécie de contêiner para vários módulos de função que logicamente pertenceriam um ao outro. Por exemplo, os módulos de função para um sistema de folha de pagamento de HR seriam reunidos em um grupo de funções.

Para ver como criar módulos de função, o construtor de função deve ser explorado. Você pode encontrar o construtor de função com o código de transação SE37. Basta digitar uma parte do nome de um módulo de função com um caractere curinga para demonstrar como os módulos de função podem ser pesquisados. Digite * quantidade * e pressione a tecla F4.

Os resultados da pesquisa serão exibidos em uma nova janela. Os módulos de função são exibidos nas linhas com fundo azul e seus grupos de funções em linhas rosa. Você pode examinar mais a fundo o grupo de funções ISOC usando a tela Object Navigator (Transaction SE80). Você pode ver uma lista de módulos de função e também outros objetos mantidos no grupo de funções. Vamos considerar o módulo de função SPELL_AMOUNT. Este módulo de função converte números numéricos em palavras.

Criação de um novo programa

Step 1 - Vá para a transação SE38 e crie um novo programa chamado Z_SPELLAMOUNT.

Step 2- Insira algum código para que um parâmetro possa ser configurado onde um valor pode ser inserido e passado para o módulo de função. O elemento de texto text-001 aqui diz 'Insira um valor'.

Step 3- Para escrever o código para isso, use CTRL + F6. Depois disso, aparece uma janela onde 'CALL FUNCTION' é a primeira opção em uma lista. Digite 'spell_amount' na caixa de texto e clique no botão continuar.

Step 4- Algum código é gerado automaticamente. Mas precisamos aprimorar a instrução IF para incluir um código para ESCREVER uma mensagem na tela para dizer "O módulo de função retornou um valor de: sy-subrc" e adicionar a instrução ELSE para escrever o resultado correto quando a função módulo foi bem-sucedido. Aqui, uma nova variável deve ser configurada para conter o valor retornado do módulo de função. Vamos chamar isso de 'resultado'.

A seguir está o código -

REPORT Z_SPELLAMOUNT. 
data result like SPELL. 

selection-screen begin of line. 
selection-screen comment 1(15) text-001. 

parameter num_1 Type I. 
selection-screen end of line. 
CALL FUNCTION 'SPELL_AMOUNT' 
EXPORTING 
AMOUNT = num_1 
IMPORTING 
IN_WORDS = result. 

IF SY-SUBRC <> 0. 
   Write: 'Value returned is:', SY-SUBRC. 
else. 
   Write: 'Amount in words is:', result-word. 
ENDIF.

Step 5- A variável que o módulo de função retorna é chamada IN_WORDS. Configure a variável correspondente no programa chamado 'resultado'. Defina IN_WORDS usando a instrução LIKE para se referir a uma estrutura chamada SPELL.

Step 6- Salvar, ativar e executar o programa. Insira um valor conforme mostrado na captura de tela a seguir e pressione F8.

O código acima produz a seguinte saída -

Spelling the Amount 
Amount in words is: 
FIVE THOUSAND SIX HUNDRED EIGHTY

Os programas de inclusão são objetos de repositório global usados ​​para modularizar o código-fonte. Eles permitem que você use o mesmo código-fonte em programas diferentes. Incluir programas também permite que você gerencie programas complexos de maneira ordenada. Para usar um programa de inclusão em outro programa, usamos a seguinte sintaxe -

INCLUDE <program_name>.

A instrução INCLUDE tem o mesmo efeito que copiar o código-fonte do programa de inclusão <nome_do_programa> para outro programa. Como o programa de inclusão não pode ser executado de forma independente, ele deve ser integrado a outros programas. Você também pode aninhar programas de inclusão.

A seguir estão algumas restrições ao escrever o código para programas de inclusão -

  • Os programas de inclusão não podem chamar a si mesmos.
  • Os programas de inclusão devem conter instruções completas.

A seguir estão as etapas para criar e usar um programa Incluir -

Step 1- Crie o programa (Z_TOBEINCLUDED) a ser incluído no Editor ABAP. O código a ser incluído no Editor ABAP é -

PROGRAM Z_TOBEINCLUDED.  
Write: / 'This program is started by:', SY-UNAME,
       / 'The Date is:', SY-DATUM,
       / 'Time is', SY-UZEIT.

Step 2 - Defina o tipo de programa para INCLUIR programa, conforme mostrado na imagem a seguir.

Step 3 - Clique no botão 'Salvar' e salve o programa em um pacote chamado ZINCL_PCKG.

Step 4- Crie outro programa onde o programa Z_TOBEINCLUDED deve ser usado. Aqui, criamos outro programa denominado Z_INCLUDINGTEST e atribuímos o tipo do programa como programa executável.

Step 5 - A codificação para o programa Z_INCLUDINGTEST inclui o programa Z_TOBEINCLUDED com a ajuda da instrução INCLUDE conforme mostrado no código a seguir.

REPORT Z_INCLUDINGTEST.  
INCLUDE Z_TOBEINCLUDED.

Step 6 - Salvar, ativar e executar o programa.

O código acima produz a seguinte saída -

This program is started by: SAPUSER 
The Date is: 06.10.2015 
Time is 13:25:11

Open SQL indica o subconjunto de instruções ABAP que permitem o acesso direto aos dados no banco de dados central do AS ABAP atual. As instruções Open SQL mapeiam a funcionalidade da Linguagem de Manipulação de Dados do SQL em ABAP que é suportada por todos os sistemas de banco de dados.

As instruções do Open SQL são convertidas em SQL específico do banco de dados na interface Open SQL da interface do banco de dados. Eles são então transferidos para o sistema de banco de dados e executados. As instruções Open SQL podem ser usadas para acessar as tabelas do banco de dados que são declaradas no dicionário ABAP. O banco de dados central do AS ABAP é acessado por padrão e também o acesso a outros bancos de dados é possível através de conexões de banco de dados secundário.

Sempre que qualquer uma dessas instruções for usada em um programa ABAP, é importante verificar se a ação executada foi bem-sucedida. Se se tenta inserir um registro em uma tabela do banco de dados e ele não é inserido corretamente, é muito importante saber para que a ação apropriada possa ser realizada no programa. Isso pode ser feito usando um campo do sistema que já foi usado, que é SY-SUBRC. Quando uma instrução é executada com sucesso, o campo SY-SUBRC conterá um valor 0, então isso pode ser verificado e pode-se continuar com o programa se ele aparecer.

A instrução DATA é usada para declarar uma área de trabalho. Vamos dar a isso o nome de 'wa_customers1'. Em vez de declarar um tipo de dados para isso, vários campos que compõem a tabela podem ser declarados. A maneira mais fácil de fazer isso é usando a instrução LIKE.

Instrução INSERT

A área de trabalho wa_customers1 é declarada aqui como a tabela ZCUSTOMERS1, assumindo a mesma estrutura sem se tornar uma tabela. Esta área de trabalho pode armazenar apenas um registro. Depois de declarada, a instrução INSERT pode ser usada para inserir a área de trabalho e o registro que ela contém na tabela. O código aqui será lido como 'INSERT ZCUSTOMERS1 FROM wa_customers1'.

A área de trabalho deve ser preenchida com alguns dados. Use os nomes dos campos da tabela ZCUSTOMERS1. Isso pode ser feito por navegação direta, clicando duas vezes no nome da tabela no código ou abrindo uma nova sessão e usando a transação SE11. Os campos da tabela podem ser copiados e colados no editor ABAP.

A seguir está o snippet de código -

DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100006'. 
wa_customers1-name = 'DAVE'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19931017'. 
INSERT ZCUSTOMERS1 FROM wa_customers1.

A instrução CHECK pode então ser usada da seguinte maneira. Isso significa que se o registro for inserido corretamente, o sistema informará isso. Caso contrário, o código SY-SUBRC que não será igual a zero será exibido. A seguir está o snippet de código -

IF SY-SUBRC = 0. 
   WRITE 'Record Inserted Successfully'.  
ELSE. 
   WRITE: 'The return code is ', SY-SUBRC. 
ENDIF.

Verifique o programa, salve, ative o código e teste-o. A janela de saída deve ser exibida como 'Registro inserido com sucesso'.

Declaração CLEAR

A instrução CLEAR permite que um campo ou variável seja limpo para a inserção de novos dados em seu lugar, permitindo sua reutilização. A instrução CLEAR é geralmente usada em programas e permite que campos existentes sejam usados ​​muitas vezes.

No fragmento de código anterior, a estrutura da área de trabalho foi preenchida com dados para criar um novo registro a ser inserido na tabela ZCUSTOMERS1 e, em seguida, uma verificação de validação é executada. Se quisermos inserir um novo registro, a instrução CLEAR deve ser usada para que ele possa ser preenchido novamente com os novos dados.

Declaração UPDATE

Se você deseja atualizar um ou mais registros existentes em uma tabela ao mesmo tempo, use a instrução UPDATE. Semelhante à instrução INSERT, uma área de trabalho é declarada, preenchida com os novos dados que são colocados no registro conforme o programa é executado. O registro criado anteriormente com a instrução INSERT será atualizado aqui. Basta editar o texto armazenado nos campos NAME e TITLE. Então, em uma nova linha, a mesma estrutura da instrução INSERT é usada, e desta vez usando a instrução UPDATE conforme mostrado no seguinte trecho de código -

DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100006'. 
wa_customers1-name = 'RICHARD'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19931017'. 
UPDATE ZCUSTOMERS1 FROM wa_customers1.

Conforme a instrução UPDATE é executada, você pode visualizar o navegador de dados no dicionário ABAP para ver se o registro foi atualizado com sucesso.

Instrução MODIFY

A instrução MODIFY pode ser considerada uma combinação das instruções INSERT e UPDATE. Ele pode ser usado para inserir um novo registro ou modificar um registro existente. Ele segue uma sintaxe semelhante às duas instruções anteriores ao modificar o registro dos dados inseridos em uma área de trabalho.

Quando esta instrução é executada, os campos-chave envolvidos serão comparados com os da tabela. Se já existir um registro com esses valores de campo-chave, ele será atualizado. Caso contrário, um novo registro será criado.

A seguir está o snippet de código para criar um novo registro -

CLEAR wa_customers1.
 
DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100007'. 
wa_customers1-name = 'RALPH'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19910921'. 
MODIFY ZCUSTOMERS1 FROM wa_customers1.

Neste exemplo, a instrução CLEAR é usada para que uma nova entrada possa ser colocada na área de trabalho e, em seguida, o cliente (número) 100007 seja adicionado. Como este é um valor de campo-chave novo e exclusivo, um novo registro será inserido e outra verificação de validação será executada.

Quando isso é executado e os dados são visualizados no Navegador de Dados, um novo registro terá sido criado para o cliente número 100007 (RALPH).

O código acima produz a seguinte saída (conteúdo da tabela) -

O termo 'SQL nativo' refere-se a todas as instruções que podem ser transferidas estaticamente para a interface SQL nativa da interface do banco de dados. As instruções SQL nativas não se enquadram no escopo de linguagem do ABAP e não seguem a sintaxe ABAP. ABAP contém apenas instruções para isolar seções do programa nas quais instruções SQL nativas podem ser listadas.

No SQL nativo, principalmente instruções SQL específicas do banco de dados podem ser usadas. Eles são transferidos inalterados da interface SQL nativa para um sistema de banco de dados e executados. O escopo completo da linguagem SQL do banco de dados relevante pode ser usado e as tabelas de banco de dados endereçadas não precisam ser declaradas no dicionário ABAP. Há também um pequeno conjunto de instruções SQL nativas específicas do SAP que são tratadas de maneira específica pela interface SQL nativa.

Para usar uma instrução SQL nativa, você deve precedê-la com a instrução EXEC SQL e terminar com a instrução ENDEXEC.

A seguir está a sintaxe -

EXEC SQL PERFORMING <form>.  
   <Native SQL statement> 
ENDEXEC.

Essas instruções definem uma área em um programa ABAP onde uma ou mais instruções SQL nativas podem ser listadas. As instruções inseridas são passadas para a interface SQL nativa e, em seguida, processadas da seguinte forma -

  • Todas as instruções SQL válidas para a interface de programa do sistema de banco de dados endereçado podem ser listadas entre EXEC e ENDEXEC, em particular as instruções DDL (linguagem de definição de dados).

  • Essas instruções SQL são passadas da interface SQL nativa para o sistema de banco de dados praticamente inalterado. As regras de sintaxe são especificadas pelo sistema de banco de dados, especialmente as regras de distinção entre maiúsculas e minúsculas para objetos de banco de dados.

  • Se a sintaxe permitir um separador entre as instruções individuais, você pode incluir muitas instruções SQL nativas entre EXEC e ENDEXEC.

  • Os elementos de linguagem Native SQL específicos do SAP podem ser especificados entre EXEC e ENDEXEC. Essas instruções não são passadas diretamente da interface SQL nativa para o banco de dados, mas são transformadas de maneira adequada.

Exemplo

SPFLI é uma tabela SAP padrão usada para armazenar informações de programação de voos. Isso está disponível nos sistemas R / 3 SAP, dependendo da versão e do nível de liberação. Você pode visualizar essas informações ao inserir o nome da tabela SPFLI na transação SAP relevante, como SE11 ou SE80. Você também pode visualizar os dados contidos nesta tabela de banco de dados usando essas duas transações.

REPORT ZDEMONATIVE_SQL. 
DATA: BEGIN OF wa,  
      connid  TYPE SPFLI-connid,
      cityfrom TYPE SPFLI-cityfrom,
      cityto  TYPE SPFLI-cityto,  
      END OF wa. 
	
DATA c1 TYPE SPFLI-carrid VALUE 'LH'. 
EXEC SQL PERFORMING loop_output.
   SELECT connid, cityfrom, cityto  
   INTO :wa  
   FROM SPFLI  
   WHERE carrid = :c1 
ENDEXEC. 

FORM loop_output.  
   WRITE: / wa-connid, wa-cityfrom, wa-cityto. 
ENDFORM.

O código acima produz a seguinte saída -

0400  FRANKFURT  NEW YORK 
2402  FRANKFURT  BERLIN 
0402  FRANKFURT  NEW YORK

A tabela interna é na verdade uma tabela temporária, que contém os registros de um programa ABAP que está sendo executado. Uma tabela interna existe apenas durante o tempo de execução de um programa SAP. Eles são usados ​​para processar grandes volumes de dados usando a linguagem ABAP. Precisamos declarar uma tabela interna em um programa ABAP quando você precisar recuperar dados de tabelas de banco de dados.

Os dados em uma tabela interna são armazenados em linhas e colunas. Cada linha é chamada deline e cada coluna é chamada de field. Em uma tabela interna, todos os registros possuem a mesma estrutura e chave. Os registros individuais de uma tabela interna são acessados ​​com um índice ou uma chave. Como a tabela interna existe até que o programa associado seja executado, os registros da tabela interna são descartados quando a execução do programa é finalizada. Portanto, as tabelas internas podem ser usadas como áreas de armazenamento temporário ou buffers temporários onde os dados podem ser modificados conforme necessário. Essas tabelas ocupam memória apenas em tempo de execução e não no momento de sua declaração.

As tabelas internas existem apenas quando um programa está em execução, portanto, quando o código é escrito, a tabela interna deve ser estruturada de forma que o programa possa fazer uso dela. Você verá que as tabelas internas funcionam da mesma maneira que as estruturas. A principal diferença é que as estruturas têm apenas uma linha, enquanto uma tabela interna pode ter quantas linhas forem necessárias.

Uma tabela interna pode ser composta por vários campos, correspondentes às colunas de uma tabela, da mesma forma que no dicionário ABAP uma tabela foi criada usando vários campos. Os campos-chave também podem ser usados ​​com tabelas internas e, ao criar essas tabelas internas, oferecem um pouco mais de flexibilidade. Com tabelas internas, pode-se especificar uma chave não exclusiva, permitindo que qualquer número de registros não exclusivos sejam armazenados e permitindo que registros duplicados sejam armazenados, se necessário.

O tamanho de uma tabela interna ou o número de linhas que ela contém não é fixo. O tamanho de uma tabela interna muda de acordo com os requisitos do programa associado à tabela interna. Mas é recomendável manter as tabelas internas o mais pequenas possível. Isso evita que o sistema funcione lentamente enquanto se esforça para processar enormes quantidades de dados.

As tabelas internas são usadas para muitos propósitos -

  • Eles podem ser usados ​​para armazenar resultados de cálculos que podem ser usados ​​posteriormente no programa.

  • Uma tabela interna também pode conter registros e dados para que possam ser acessados ​​rapidamente, em vez de ter que acessar esses dados de tabelas de banco de dados.

  • Eles são extremamente versáteis. Eles podem ser definidos usando qualquer número de outras estruturas definidas.

Exemplo

Suponha que um usuário deseja criar uma lista de números de contato de vários clientes de uma ou várias tabelas grandes. O usuário primeiro cria uma tabela interna, seleciona os dados relevantes das tabelas do cliente e, em seguida, coloca os dados na tabela interna. Outros usuários podem acessar e usar essa tabela interna diretamente para recuperar as informações desejadas, em vez de escrever consultas de banco de dados para realizar cada operação durante o tempo de execução do programa.

A instrução DATA é usada para declarar uma tabela interna. O programa deve ser informado onde a mesa começa e termina. Portanto, use a instrução BEGIN OF e declare o nome da tabela. Depois disso, a adição OCCURS é usada, seguida por um número, aqui 0. OCCURS informa ao SAP que uma tabela interna está sendo criada e o 0 indica que não conterá nenhum registro inicialmente. Ele se expandirá à medida que for preenchido com dados.

A seguir está a sintaxe -

DATA: BEGIN OF <internal_tab> Occurs 0,

Vamos criar os campos em uma nova linha. Por exemplo, crie 'nome' que é declarado como LIKE ZCUSTOMERS1-name. Crie outro campo chamado 'dob', LIKE ZCUSTOMERS1-dob. É útil inicialmente dar aos nomes de campo em tabelas internas os mesmos nomes de outros campos que foram criados em outro lugar. Finalmente, declare o fim da tabela interna com “END OF <internal_tab>.” conforme mostrado no código a seguir -

DATA: BEGIN OF itab01 Occurs 0,
   name LIKE ZCUSTOMERS1-name,
   dob LIKE ZCUSTOMERS1-dob, 
END OF itab01.

Aqui, 'itab01' é uma abreviação comumente usada ao criar tabelas temporárias no SAP. A cláusula OCCURS é usada para definir o corpo de uma tabela interna, declarando os campos da tabela. Quando a cláusula OCCURS é usada, você pode especificar uma constante numérica 'n' para determinar a memória padrão adicional, se necessário. O tamanho padrão da memória usado pela cláusula OCCUR 0 é de 8 KB. A estrutura da tabela interna agora está criada e o código pode ser escrito para preenchê-la com registros.

Uma tabela interna pode ser criada com ou sem o uso de uma linha de cabeçalho. Para criar uma tabela interna com uma linha de cabeçalho, use a cláusula BEGIN OF antes da cláusula OCCURS ou a cláusula WITH HEADER LINE após a cláusula OCCURS na definição da tabela interna. Para criar uma tabela interna sem uma linha de cabeçalho, use a cláusula OCCURS sem a cláusula BEGIN OF.

Você também pode criar uma tabela interna como um tipo de dados local (um tipo de dados usado apenas no contexto do programa atual) usando a instrução TYPES. Esta instrução usa a cláusula TYPE ou LIKE para se referir a uma tabela existente.

A sintaxe para criar uma tabela interna como um tipo de dados local é -

TYPES <internal_tab> TYPE|LIKE <internal_tab_type> OF 
   <line_type_itab> WITH <key> INITIAL SIZE <size_number>.

Aqui, o <internal_tab_type> especifica um tipo de tabela para uma tabela interna <internal_tab> e <line_type_itab> especifica o tipo de uma linha de uma tabela interna. Na instrução TYPES, você pode usar a cláusula TYPE para especificar o tipo de linha de uma tabela interna como um tipo de dados e a cláusula LIKE para especificar o tipo de linha como um objeto de dados. Especificar uma chave para uma tabela interna é opcional e se o usuário não especificar uma chave, o sistema SAP define um tipo de tabela com uma chave arbitrária.

INITIAL SIZE <size_number> cria um objeto de tabela interna alocando uma quantidade inicial de memória para ele. Na sintaxe anterior, a cláusula INITIAL SIZE reserva um espaço de memória para as linhas da tabela size_number. Sempre que um objeto de tabela interna é declarado, o tamanho da tabela não pertence ao tipo de dados da tabela.

Note - Muito menos memória é consumida quando uma tabela interna é preenchida pela primeira vez.

Exemplo

Step 1- Abra o Editor ABAP executando o código de transação SE38. A tela inicial do Editor ABAP é exibida.

Step 2 - Na tela inicial, digite um nome para o programa, selecione o botão de rádio Código fonte e clique no botão Criar para criar um novo programa.

Step 3- Na caixa de diálogo 'ABAP: Atributos do programa', insira uma breve descrição para o programa no campo Título, selecione a opção 'Programa executável' no menu suspenso Tipo na caixa de grupo Atributos. Clique no botão Salvar.

Step 4 - Escreva o seguinte código no editor ABAP.

REPORT ZINTERNAL_DEMO. 
TYPES: BEGIN OF CustomerLine, 
Cust_ID TYPE C, 
Cust_Name(20) TYPE C, 
END OF CustomerLine. 
 
TYPES mytable TYPE SORTED TABLE OF CustomerLine  
WITH UNIQUE KEY Cust_ID. 
WRITE:/'The mytable is an Internal Table'.

Step 5 - Salvar, ativar e executar o programa normalmente.

Neste exemplo, mytable é uma tabela interna e uma chave exclusiva é definida no campo Cust_ID.

O código acima produz a seguinte saída -

The mytable is an Internal Table.

Em tabelas internas, o preenchimento inclui recursos como seleção, inserção e acréscimo. Este capítulo enfoca as instruções INSERT e APPEND.

Instrução INSERT

A instrução INSERT é usada para inserir uma única linha ou um grupo de linhas em uma tabela interna.

A seguir está a sintaxe para adicionar uma única linha a uma tabela interna -

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

Nesta sintaxe, a instrução INSERT insere uma nova linha na tabela interna internal_tab. Uma nova linha pode ser inserida usando a expressão work_area_itab INTO antes do parâmetro internal_tab. Quando a expressão work_area_itab INTO é usada, a nova linha é retirada da área de trabalho work_area_itab e inserida na tabela internal_tab. No entanto, quando a expressão work_area_itab INTO não é usada para inserir uma linha, a linha é retirada da linha de cabeçalho da tabela internal_tab.

Quando uma nova linha é inserida em uma tabela interna usando a cláusula INDEX, o número do índice das linhas após a linha inserida é incrementado em 1. Se uma tabela interna contém <index_num> -1 linhas, a nova linha é adicionada no fim da mesa. Quando o sistema SAP adiciona com sucesso uma linha a uma tabela interna, a variável SY-SUBRC é definida como 0.

Exemplo

A seguir está um programa de exemplo que usa a instrução insert.

REPORT  ZCUSLIST1. 
DATA: BEGIN OF itable1 OCCURS 4,
      F1 LIKE SY-INDEX,
      END OF itable1.
	
   DO 4 TIMES.
      itable1-F1 = sy-index.
      APPEND itable1.
   ENDDO.
	
itable1-F1 = -96.  
INSERT itable1 INDEX 2.  

LOOP AT itable1.
   Write / itable1-F1.  
ENDLOOP.  

LOOP AT itable1 Where F1 ≥ 3.
   itable1-F1 = -78.
   INSERT itable1.
ENDLOOP.

Skip.
LOOP AT itable1.
   Write / itable1-F1.
ENDLOOP.

O código acima produz o seguinte outp -

1 
96- 
		2 
		3 
 4  
		1 
96- 
		2 
78- 
 3 
78- 
 4

No exemplo acima, o loop DO anexa 4 linhas contendo os números de 1 a 4 a ele. O componente itable1-F1 da linha de cabeçalho recebeu o valor -96. A instrução Insert insere a linha de cabeçalho como uma nova linha no corpo antes da linha 3. A linha 3 existente torna-se a linha 4 após a inserção. A instrução LOOP AT recupera as linhas da tabela interna que têm um valor F1 maior ou igual a 3. Antes de cada linha, a instrução Insert insere uma nova linha da linha de cabeçalho dela. Antes da inserção, o componente F1 foi alterado para conter -78.

Depois que cada instrução de inserção é executada, o sistema reindexa todas as linhas abaixo da inserida. Isso introduz uma sobrecarga quando você insere linhas próximas ao topo de uma grande mesa interna. Se você precisar inserir um bloco de linhas em uma grande tabela interna, prepare outra tabela com as linhas a serem inseridas e use inserir linhas.

Ao inserir uma nova linha dentro de itable1 dentro de um loop em itable1, isso não afeta a tabela interna instantaneamente. Na verdade, ele se torna efetivo na próxima passagem do loop. Ao inserir uma linha após a linha atual, a tabela é reindexada no ENDLOOP. O sy-tabix é incrementado e o próximo loop processa a linha apontada por sy-tabix. Por exemplo, se você estiver na segunda passagem do loop e inserir um registro antes da linha 3. Quando o endloop é executado, a nova linha se torna a linha 3 e a antiga linha 3 se torna a linha 4 e assim por diante. Sy-tabix é incrementado em 1, e a próxima passagem de loop processa o registro recém-inserido.

Declaração APPEND

A instrução APPEND é usada para adicionar uma única linha ou linha a uma tabela interna existente. Esta instrução copia uma única linha de uma área de trabalho e a insere após a última linha existente em uma tabela interna. A área de trabalho pode ser uma linha de cabeçalho ou qualquer outra string de campo com a mesma estrutura de uma linha de uma tabela interna. A seguir está a sintaxe da instrução APPEND que é usada para acrescentar uma única linha em uma tabela interna -

APPEND <record_for_itab> TO <internal_tab>.

Nesta sintaxe, a expressão <record_for_itab> pode ser representada pela área de trabalho <work_area_itab>, que pode ser convertida em um tipo de linha ou pela cláusula INITIAL LINE. Se o usuário usar uma área de trabalho <work_area_itab>, o sistema SAP adiciona uma nova linha à tabela interna <internal_tab> e a preenche com o conteúdo da área de trabalho. A cláusula INITIAL LINE anexa uma linha em branco que contém o valor inicial para cada campo da estrutura da tabela. Após cada instrução APPEND, a variável SY-TABIX contém o número do índice da linha anexada.

Anexar linhas a tabelas padrão e classificadas com uma chave não exclusiva funciona independentemente de as linhas com a mesma chave já existirem na tabela. Em outras palavras, podem ocorrer entradas duplicadas. No entanto, um erro de tempo de execução ocorre se o usuário tentar adicionar uma entrada duplicada a uma tabela classificada com uma chave exclusiva ou se o usuário violar a ordem de classificação de uma tabela classificada anexando as linhas a ela.

Exemplo

REPORT  ZCUSLIST1. 
DATA: BEGIN OF linv Occurs 0,
      Name(20) TYPE C,
      ID_Number TYPE I,
END OF linv. 

DATA table1 LIKE TABLE OF linv. 
linv-Name = 'Melissa'. 
linv-ID_Number = 105467. 
APPEND linv TO table1. 
LOOP AT table1 INTO linv. 

Write: / linv-name, linv-ID_Number. 
ENDLOOP.

O código acima produz a seguinte saída -

Melissa		105467

Quando lemos um registro de uma tabela interna com uma linha de cabeçalho, esse registro é movido da própria tabela para a linha de cabeçalho. É então a linha de cabeçalho com a qual nosso programa trabalha. O mesmo se aplica ao criar um novo registro. É a linha de cabeçalho com a qual você trabalha e a partir da qual o novo registro é enviado para o próprio corpo da tabela.

Para copiar os registros, podemos usar uma instrução SELECT para selecionar todos os registros da tabela e, em seguida, usar a instrução MOVE que moverá os registros da tabela original para a nova tabela interna nos campos onde os nomes correspondem.

A seguir está a sintaxe para a instrução MOVE -

MOVE <table_field> TO <internal_tab_field>.

Exemplo

REPORT  ZCUSLIST1. 
TABLES: ZCUSTOMERS1. 
DATA: BEGIN OF itab01 Occurs 0,
      name LIKE ZCUSTOMERS1-name,
      dob LIKE ZCUSTOMERS1-dob, 
END OF itab01. 

Select * FROM ZCUSTOMERS1. 
MOVE ZCUSTOMERS1-name TO itab01-name. 
MOVE ZCUSTOMERS1-dob TO itab01-dob. 
ENDSELECT.
 
Write: / itab01-name, itab01-dob.

O código acima produz a seguinte saída -

MARGARET  		02.11.1994

O loop de seleção preenche cada campo um por vez, usando a instrução MOVE para mover os dados de um campo da tabela para o outro. No exemplo acima, as instruções MOVE foram usadas para mover o conteúdo da tabela ZCUSTOMERS1 para os campos correspondentes na tabela interna. Você pode realizar essa ação com apenas uma linha de código. Você pode usar a instrução MOVECORRESPONDING.

A seguir está a sintaxe para a instrução MOVE-CORRESPONDING -

MOVE-CORRESPONDING <table_name> TO <internal_tab>.

Diz ao sistema para mover os dados dos campos de ZCUSTOMERS1 para seus campos correspondentes em itab01.

Exemplo

REPORT  ZCUSTOMERLIST. 
TABLES: ZCUSTOMERS1. 
DATA: Begin of itab01 occurs 0,
      customer LIKE ZCUSTOMERS1-customer,
      name LIKE ZCUSTOMERS1-name,
      title LIKE ZCUSTOMERS1-title,
      dob LIKE ZCUSTOMERS1-dob, 
END OF itab01. 

SELECT * from ZCUSTOMERS1. 
MOVE-Corresponding ZCUSTOMERS1 TO itab01. 
APPEND itab01. 
ENDSELECT. 
LOOP AT itab01. 
Write: / itab01-name, itab01-dob. 
ENDLOOP.

O código acima produz a seguinte saída -

MARK           21.05.1981 
JAMES          14.08.1977 
AURIELE        19.06.1990 
STEPHEN        22.07.1985 
MARGARET       02.11.1994

Isso é possível pelo fato de que ambos têm nomes de campo correspondentes. Ao fazer uso dessa instrução, você precisa se certificar de que ambos os campos possuem tipos e comprimentos de dados correspondentes. Isso foi feito aqui com a instrução LIKE anteriormente.

Podemos ler as linhas de uma tabela usando a seguinte sintaxe da instrução READ TABLE -

READ TABLE <internal_table> FROM <work_area_itab>.

Nesta sintaxe, a expressão <work_area_itab> representa uma área de trabalho compatível com o tipo de linha da tabela <internal_table>. Podemos especificar uma chave de pesquisa, mas não uma chave de tabela, dentro da instrução READ usando a cláusula WITH KEY, conforme mostrado na seguinte sintaxe -

READ TABLE <internal_table> WITH KEY = <internal_tab_field>.

Aqui, toda a linha da tabela interna é usada como um search key. O conteúdo de toda a linha da tabela é comparado com o conteúdo do campo <internal_tab_field>. Se os valores do campo <internal_tab_field> não forem compatíveis com o tipo de linha da tabela, esses valores serão convertidos de acordo com o tipo de linha da tabela. A chave de pesquisa permite localizar entradas em tabelas internas que não possuem um tipo de linha estruturada, ou seja, onde a linha é um único campo ou um tipo de tabela interna.

A seguinte sintaxe da instrução READ é usada para especificar uma área de trabalho ou símbolo de campo usando a cláusula COMPARING -

READ TABLE <internal_table> <key> INTO <work_area_itab>
   [COMPARING <F1> <F2>...<Fn>].

Quando a cláusula COMPARING é usada, os campos especificados da tabela <F1>, <F2> .... <Fn> do tipo de linha estruturada são comparados com os campos correspondentes da área de trabalho antes de serem transportados. Se a cláusula ALL FIELDS for especificada, o sistema SAP compara todos os componentes. Quando o sistema SAP encontra uma entrada com base em uma chave, o valor da variável SY-SUBRC é definido como 0. Além disso, o valor da variável SY-SUBRC é definido como 2 ou 4 se o conteúdo do campos não são iguais ou se o sistema SAP não consegue encontrar uma entrada. No entanto, o sistema SAP copia a entrada na área de trabalho de destino sempre que encontra uma entrada, independentemente do resultado da comparação.

Exemplo

REPORT  ZREAD_DEMO. 
*/Creating an internal table 
DATA: BEGIN OF Record1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Record1. 

DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP. 
DO 6 Times.
Record1-ColP = SY-INDEX. 
Record1-ColQ = SY-INDEX + 5. 
INSERT Record1 INTO TABLE mytable. 
ENDDO. 

Record1-ColP = 4. 
Record1-ColQ = 12. 
READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ. 

WRITE: 'SY-SUBRC =', SY-SUBRC. 
SKIP. 
WRITE: / Record1-ColP, Record1-ColQ.

O código acima produz a seguinte saída -

SY-SUBRC =    2 

4         9

No exemplo acima, mytable é uma tabela interna do tipo hash table, com Record1 como a área de trabalho e ColP como a chave exclusiva. Inicialmente, mytable é preenchida com seis linhas, onde o campo ColP contém os valores da variável SY-INDEX e o campo ColQ contém os valores (SY-INDEX + 5).

A área de trabalho do Registro1 é preenchida com 4 e 12 como valores para os campos ColP e ColQ, respectivamente. A instrução READ lê a linha da tabela depois de comparar o valor do campo-chave ColP com o valor na área de trabalho Record1 usando a cláusula COMPARING e, a seguir, copia o conteúdo da linha lida na área de trabalho. O valor da variável SY-SUBRC é exibido como 2 porque quando o valor no campo ColP é 4, o valor no ColQ não é 12, mas 9.

A instrução DELETE é usada para excluir um ou mais registros de uma tabela interna. Os registros de uma tabela interna são excluídos especificando-se uma chave ou condição da tabela ou localizando entradas duplicadas. Se uma tabela interna tiver uma chave não exclusiva e contiver entradas duplicadas, a primeira entrada da tabela será excluída.

A seguir está a sintaxe para usar a instrução DELETE para excluir um registro ou linha de uma tabela interna -

DELETE TABLE <internal_table> FROM <work_area_itab>.

Na sintaxe acima, a expressão <work_area_itab> é uma área de trabalho e deve ser compatível com o tipo da tabela interna <internal_table>. A operação de exclusão é executada com base em uma chave padrão que pode ser obtida dos componentes da área de trabalho.

Você também pode especificar uma chave de tabela explicitamente na instrução DELETE TABLE usando a seguinte sintaxe -

DELETE TABLE <internal_table> WITH TABLE KEY <K1> = <F1>………… <Kn> = <Fn>.

Nesta sintaxe, <F1>, <F2> .... <Fn> são os campos de uma tabela interna e <K1>, <K2> .... <Kn> são os campos-chave da tabela. A instrução DELETE é usada para excluir os registros ou linhas da tabela <internal_table> com base nas expressões <K1> = <F1>, <K2> = <F2> ... <Kn> = <Fn>.

Note - Se os tipos de dados dos campos <F1>, <F2> .... <Fn> não forem compatíveis com os campos-chave <K1>, <K2> ... <Kn>, o sistema SAP os converterá automaticamente em o formato compatível.

Exemplo

REPORT  ZDELETE_DEMO. 
DATA: BEGIN OF Line1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Line1. 
DATA mytable LIKE HASHED TABLE OF Line1  
WITH UNIQUE KEY ColP. 
DO 8 TIMES. 

Line1-ColP = SY-INDEX. 
Line1-ColQ = SY-INDEX + 4. 
INSERT Line1 INTO TABLE mytable. 
ENDDO. 

Line1-ColP = 1. 
DELETE TABLE mytable: FROM Line1, 
WITH TABLE KEY ColP = 3.
LOOP AT mytable INTO Line1. 

WRITE: / Line1-ColP, Line1-ColQ. 
ENDLOOP.

O código acima produz a seguinte saída -

2         6 
4         8 
5         9 
6         10 
7         11 
8         12

Neste exemplo, mytable tem dois campos, ColP e ColQ. Inicialmente, minha tabela é preenchida com oito linhas, onde o ColP contém os valores 1, 2, 3, 4, 5, 6, 7 e 8. O ColQ contém os valores 5, 6, 7, 8, 9, 10, 11 e 12 porque os valores ColP são incrementados em 4 todas as vezes.

A instrução DELETE é usada para excluir as linhas de minha tabela onde o valor do campo-chave ColP é 1 ou 3. Após a exclusão, o campo ColP de minha tabela contém os valores 2, 4, 5, 6, 7 e 8, como mostrado na saída. O campo ColQ contém os valores 6, 8, 9, 10, 11 e 12.

A orientação a objetos simplifica o design do software para torná-lo mais fácil de entender, manter e reutilizar. Object Oriented Programming(OOP) representa uma maneira diferente de pensar ao escrever software. A beleza da OOP está em sua simplicidade. A expressividade do OOP torna mais fácil entregar componentes de software de qualidade no prazo.

Como as soluções são projetadas em termos de objetos do mundo real, fica muito mais fácil para os programadores e analistas de negócios trocar idéias e informações sobre um projeto que usa uma linguagem de domínio comum. Essas melhorias na comunicação ajudam a revelar requisitos ocultos, identificar riscos e melhorar a qualidade do software que está sendo desenvolvido. A abordagem orientada a objetos concentra-se em objetos que representam coisas abstratas ou concretas do mundo real. Esses objetos são definidos por seu caráter e propriedades que são representadas por sua estrutura interna e seus atributos (dados). O comportamento desses objetos é descrito por métodos (ou seja, funcionalidade).

Vamos comparar a programação procedural e orientada a objetos -

Características Abordagem Orientada a Procedimentos Abordagem orientada a objetos
Ênfase A ênfase está nas tarefas. A ênfase está nas coisas que executam essas tarefas.
Modularização Os programas podem ser divididos em programas menores conhecidos como funções. Os programas são organizados em classes e objetos e as funcionalidades são incorporadas aos métodos de uma classe.
Segurança de dados A maioria das funções compartilha dados globais. Os dados podem ser ocultados e não podem ser acessados ​​por fontes externas.
Extensibilidade Isso consome mais tempo para modificar e estender a funcionalidade existente. Novos dados e funções podem ser adicionados sem esforço como e quando necessário.

ABAP foi inicialmente desenvolvido como uma linguagem procedural (semelhante à linguagem de programação procedural anterior como COBOL). Mas o ABAP agora adaptou os princípios dos paradigmas orientados a objetos com a introdução dos objetos ABAP. Os conceitos orientados a objetos em ABAP, como classe, objeto, herança e polimorfismo, são essencialmente os mesmos de outras linguagens orientadas a objetos modernas, como Java ou C ++.

À medida que a orientação a objetos começa a tomar forma, cada classe assume atribuições de funções específicas. Essa divisão de trabalho ajuda a simplificar o modelo geral de programação, permitindo que cada classe se especialize em resolver uma parte específica do problema em questão. Essas classes têm alta coesão e as operações de cada classe estão intimamente relacionadas de alguma forma intuitiva.

Os principais recursos da orientação a objetos são -

  • Estrutura de programação eficaz.
  • Entidades do mundo real podem ser modeladas muito bem.
  • Estresse na segurança e acesso aos dados.
  • Minimiza a redundância de código.
  • Abstração e encapsulamento de dados.

Um objeto é um tipo especial de variável que possui características e comportamentos distintos. As características ou atributos de um objeto são usados ​​para descrever o estado de um objeto, e os comportamentos ou métodos representam as ações executadas por um objeto.

Um objeto é um padrão ou instância de uma classe. Ele representa uma entidade do mundo real, como uma pessoa ou uma entidade de programação, como variáveis ​​e constantes. Por exemplo, contas e alunos são exemplos de entidades do mundo real. Mas os componentes de hardware e software de um computador são exemplos de entidades de programação.

Um objeto tem as seguintes três características principais -

  • Tem um estado.
  • Possui uma identidade única.
  • Pode ou não exibir o comportamento.

O estado de um objeto pode ser descrito como um conjunto de atributos e seus valores. Por exemplo, uma conta bancária possui um conjunto de atributos como Número da conta, Nome, Tipo de conta, Saldo e valores de todos esses atributos. O comportamento de um objeto se refere às mudanças que ocorrem em seus atributos ao longo de um período de tempo.

Cada objeto possui uma identidade única que pode ser usada para distingui-lo de outros objetos. Dois objetos podem apresentar o mesmo comportamento e podem ou não ter o mesmo estado, mas nunca têm a mesma identidade. Duas pessoas podem ter o mesmo nome, idade e sexo, mas não são idênticas. Da mesma forma, a identidade de um objeto nunca mudará ao longo de sua vida.

Os objetos podem interagir uns com os outros enviando mensagens. Os objetos contêm dados e código para manipular os dados. Um objeto também pode ser usado como um tipo de dado definido pelo usuário com a ajuda de uma classe. Os objetos também são chamados de variáveis ​​da classe de tipo. Depois de definir uma classe, você pode criar qualquer número de objetos pertencentes a essa classe. Cada objeto está associado aos dados da classe de tipo com a qual foi criado.

Criação de um objeto

A criação do objeto geralmente inclui as seguintes etapas -

  • Criando uma variável de referência com referência à classe. A sintaxe para a qual é -

DATA: <object_name> TYPE REF TO <class_name>.
  • Criando um objeto a partir da variável de referência. A sintaxe para a qual é -

CREATE Object: <object_name>.

Exemplo

REPORT ZDEMO_OBJECT. 
CLASS Class1 Definition. 
Public Section. 
DATA: text1(45) VALUE 'ABAP Objects.'. 
METHODS: Display1. 
ENDCLASS. 

CLASS Class1 Implementation. 
METHOD Display1. 
Write:/ 'This is the Display method.'. 
ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
DATA: Class1 TYPE REF TO Class1. 
CREATE Object: Class1. 
Write:/ Class1->text1. 
CALL METHOD: Class1->Display1.

O código acima produz a seguinte saída -

ABAP Objects. 
This is the Display method.

Uma classe é usada para especificar a forma de um objeto e combina representação de dados e métodos para manipular esses dados em um pacote organizado. Os dados e funções dentro de uma classe são chamadosmembers of the class.

Definição e implementação de classes

Ao definir uma classe, você define um blueprint para um tipo de dados. Na verdade, isso não define nenhum dado, mas define o que significa o nome da classe, em que consistirá um objeto da classe e quais operações podem ser realizadas em tal objeto. Ou seja, define as características abstratas de um objeto, como atributos, campos e propriedades.

A sintaxe a seguir mostra como definir uma classe -

CLASS <class_name> DEFINITION. 
.......... 
.......... 
ENDCLASS.

Uma definição de classe começa com a palavra-chave CLASS seguida pelo nome da classe, DEFINITION e o corpo da classe. A definição de uma classe pode conter vários componentes da classe, como atributos, métodos e eventos. Quando declaramos um método na declaração da classe, a implementação do método deve ser incluída na implementação da classe. A sintaxe a seguir mostra como implementar uma classe -

CLASS <class_name> IMPLEMENTATION. 
........... 
.......... 
ENDCLASS.

Note- A implementação de uma classe contém a implementação de todos os seus métodos. Em objetos ABAP, a estrutura de uma classe contém componentes como atributos, métodos, eventos, tipos e constantes.

Atributos

Atributos são campos de dados de uma classe que podem ter qualquer tipo de dados, como C, I, F e N. Eles são declarados na declaração da classe. Esses atributos podem ser divididos em 2 categorias: atributos de instância e estáticos. Ainstance attributedefine o estado específico da instância de um objeto. Os estados são diferentes para objetos diferentes. Um atributo de instância é declarado usando a instrução DATA.

Static attributesdefinir um estado comum de uma classe que é compartilhado por todas as instâncias da classe. Ou seja, se você alterar um atributo estático em um objeto de uma classe, a alteração também será visível para todos os outros objetos da classe. Um atributo estático é declarado usando a instrução CLASS-DATA.

Métodos

Um método é uma função ou procedimento que representa o comportamento de um objeto na classe. Os métodos da classe podem acessar qualquer atributo da classe. A definição de um método também pode conter parâmetros, para que você possa fornecer os valores a esses parâmetros quando os métodos são chamados. A definição de um método é declarada na declaração da classe e implementada na parte de implementação de uma classe. As instruções METHOD e ENDMETHOD são usadas para definir a parte de implementação de um método. A sintaxe a seguir mostra como implementar um método -

METHOD <m_name>. 
.......... 
.......... 
ENDMETHOD.

Nesta sintaxe, <m_name> representa o nome de um método. Note - Você pode chamar um método usando a instrução CALL METHOD.

Acessando atributos e métodos

Os componentes da classe podem ser definidos em seções de visibilidade pública, privada ou protegida que controlam como esses componentes podem ser acessados. A seção de visibilidade privada é usada para negar acesso a componentes de fora da classe. Esses componentes só podem ser acessados ​​de dentro da classe, como um método.

Os componentes definidos na seção de visibilidade pública podem ser acessados ​​de qualquer contexto. Por padrão, todos os membros de uma classe seriam privados. Na prática, definimos dados na seção privada e métodos relacionados na seção pública para que possam ser chamados de fora da classe, conforme mostrado no programa a seguir.

  • Os atributos e métodos declarados na seção Pública em uma classe podem ser acessados ​​por essa classe e qualquer outra classe, subclasse do programa.

  • Quando os atributos e métodos são declarados na seção Protegida em uma classe, eles podem ser acessados ​​por essa classe e subclasses (classes derivadas) apenas.

  • Quando os atributos e métodos são declarados na seção Private em uma classe, eles podem ser acessados ​​apenas por aquela classe e não por qualquer outra classe.

Exemplo

Report ZAccess1. 
CLASS class1 Definition.
   PUBLIC Section.
      Data: text1 Type char25 Value 'Public Data'.
      Methods meth1.
		
   PROTECTED Section.
      Data: text2 Type char25 Value 'Protected Data'.
		
   PRIVATE Section.     
      Data: text3 Type char25 Value 'Private Data'. 
ENDCLASS.
 
CLASS class1 Implementation.   
   Method meth1.     
      Write: / 'Public Method:',   
             / text1,
             / text2,
             / text3.
      Skip.
   EndMethod.
ENDCLASS. 

Start-Of-Selection.   
   Data: Objectx Type Ref To class1.
   Create Object: Objectx.
   CALL Method: Objectx→meth1.
   Write: / Objectx→text1.

O código acima produz a seguinte saída -

Public Method: 
Public Data 
Protected Data 
Private Data
  
Public Data

Atributos estáticos

Um atributo Static é declarado com a instrução CLASS-DATA. Todos os objetos ou instâncias podem usar o atributo estático da classe. Os atributos estáticos são acessados ​​diretamente com a ajuda do nome da classe como class_name⇒name_1 = 'Algum Texto'.

Exemplo

A seguir está um programa em que queremos imprimir um texto com o número da linha de 4 a 8 vezes. Definimos uma classe class1 e na seção pública declaramos CLASS-DATA (atributo estático) e um método. Depois de implementar a classe e o método, acessamos diretamente o atributo estático no evento Start-Of-Selection. Em seguida, apenas criamos a instância da classe e chamamos o método.

Report ZStatic1. 
CLASS class1 Definition.   
   PUBLIC Section.
      CLASS-DATA: name1 Type char45,
                  data1 Type I.
   Methods: meth1. 
ENDCLASS. 

CLASS class1 Implementation.   
   Method meth1.
      Do 4 Times.
         data1 = 1 + data1.
         Write: / data1, name1.
      EndDo.
      Skip.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
   class1⇒name1 = 'ABAP Object Oriented Programming'.
   class1⇒data1 = 0.
   Data: Object1 Type Ref To class1,
         Object2 Type Ref To class1.
			
   Create Object: Object1, Object2.
   CALL Method: Object1→meth1, 
                Object2→meth1.

O código acima produz a seguinte saída -

Construtores

Construtores são métodos especiais que são chamados automaticamente, ao criar um objeto ou acessar os componentes de uma classe. O construtor é acionado sempre que um objeto é criado, mas precisamos chamar um método para acionar o método geral. No exemplo a seguir, declaramos dois métodos públicos method1 e constructor. Ambos os métodos têm operações diferentes. Ao criar um objeto da classe, o método construtor aciona sua operação.

Exemplo

Report ZConstructor1. 
CLASS class1 Definition.
   PUBLIC Section.
      Methods: method1, constructor.
ENDCLASS. 

CLASS class1 Implementation.
   Method method1.
      Write: / 'This is Method1'.
   EndMethod.
	
   Method constructor.
      Write: / 'Constructor Triggered'.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection.
   Data Object1 Type Ref To class1.
   Create Object Object1.

O código acima produz a seguinte saída -

Constructor Triggered

Operador ME em Métodos

Ao declarar uma variável de qualquer tipo na seção pública de uma classe, você pode usá-la em qualquer outra implementação. Uma variável pode ser declarada com um valor inicial na seção pública. Podemos declarar a variável novamente dentro de um método com um valor diferente. Quando escrevemos a variável dentro do método, o sistema irá imprimir o valor alterado. Para refletir o valor anterior da variável, temos que usar o operador 'ME'.

Neste programa, declaramos uma variável pública text1 e iniciamos com um valor. Declaramos a mesma variável novamente, mas instanciada com valor diferente. Dentro do método, estamos escrevendo essa variável com o operador 'ME' para obter o valor iniciado anteriormente. Obtemos o valor alterado declarando diretamente.

Exemplo

Report ZMEOperator1. 
CLASS class1 Definition.
   PUBLIC Section. 
	
Data text1 Type char25 Value 'This is CLASS Attribute'.
   Methods method1. 
ENDCLASS. 

CLASS class1 Implementation.
   Method method1. 
	
Data text1 Type char25 Value 'This is METHOD Attribute'.
   Write: / ME→text1,
          / text1.
   ENDMethod.
ENDCLASS. 

Start-Of-Selection.
   Data objectx Type Ref To class1.
   Create Object objectx.
   CALL Method objectx→method1.

O código acima produz a seguinte saída -

This is CLASS Attribute 
This is METHOD Attribute

Um dos conceitos mais importantes na programação orientada a objetos é o de herança. A herança nos permite definir uma classe em termos de outra classe, o que torna mais fácil criar e manter um aplicativo. Isso também fornece uma oportunidade de reutilizar a funcionalidade do código e tempo de implementação rápido.

Ao criar uma classe, em vez de escrever membros de dados e métodos completamente novos, o programador pode designar que a nova classe deve herdar os membros de uma classe existente. Esta classe existente é chamada debase class ou super class, e a nova classe é chamada de derived class ou sub class.

  • Um objeto de uma classe pode adquirir as propriedades de outra classe.

  • A classe derivada herda os dados e métodos de uma superclasse. No entanto, eles podem substituir métodos e também adicionar novos métodos.

  • A principal vantagem da herança é a reutilização.

A relação de herança é especificada usando a adição 'INHERITING FROM' à instrução de definição de classe.

A seguir está a sintaxe -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Exemplo

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

O código acima produz a seguinte saída -

This is public data 
Method in child class 
This is public data

Controle de acesso e herança

Uma classe derivada pode acessar todos os membros não privados de sua classe base. Assim, os membros da superclasse que não devem ser acessíveis às funções de membro das subclasses devem ser declarados privados na superclasse. Podemos resumir os diferentes tipos de acesso de acordo com quem pode acessá-los da seguinte maneira -

Acesso Público Protegido Privado
Mesmos calss sim sim sim
Classe derivada sim sim Não
Fora da aula sim Não Não

Ao derivar uma classe de uma superclasse, ela pode ser herdada por herança pública, protegida ou privada. O tipo de herança é especificado pelo especificador de acesso conforme explicado acima. Dificilmente usamos herança protegida ou privada, mas a herança pública é comumente usada. As seguintes regras são aplicadas ao usar diferentes tipos de herança.

  • Public Inheritance- Ao derivar uma classe de uma superclasse pública, os membros públicos da superclasse se tornam membros públicos da subclasse e os membros protegidos da superclasse se tornam membros protegidos da subclasse. Os membros privados da superclasse nunca são acessíveis diretamente de uma subclasse, mas podem ser acessados ​​por meio de chamadas para os membros públicos e protegidos da superclasse.

  • Protected Inheritance - Ao derivar de uma superclasse protegida, os membros públicos e protegidos da superclasse tornam-se membros protegidos da subclasse.

  • Private Inheritance - Ao derivar de uma superclasse privada, os membros públicos e protegidos da superclasse tornam-se membros privados da subclasse.

Redefinindo métodos na subclasse

Os métodos da superclasse podem ser reimplementados na subclasse. Algumas regras de redefinição de métodos -

  • A instrução de redefinição para o método herdado deve estar na mesma seção que a definição do método original.

  • Se você redefinir um método, não precisa inserir sua interface novamente na subclasse, mas apenas o nome do método.

  • Dentro do método redefinido, você pode acessar componentes da superclasse direta usando a super referência.

  • A pseudo referência super só pode ser usada em métodos redefinidos.

Exemplo

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

Depois de executar F8, se inserirmos os valores 9 e 10, o código acima produzirá a seguinte saída -

Redefinition Demo 
29

O termo polimorfismo significa literalmente 'muitas formas'. De uma perspectiva orientada a objetos, o polimorfismo funciona em conjunto com a herança para tornar possível que vários tipos dentro de uma árvore de herança sejam usados ​​alternadamente. Ou seja, o polimorfismo ocorre quando existe uma hierarquia de classes e elas são relacionadas por herança. Polimorfismo ABAP significa que uma chamada a um método fará com que um método diferente seja executado, dependendo do tipo de objeto que invoca o método.

O programa a seguir contém uma classe abstrata 'class_prgm', 2 subclasses (class_procedural e class_OO) e uma classe de driver de teste 'class_type_approach'. Nessa implementação, o método de classe 'start' nos permite exibir o tipo de programação e sua abordagem. Se você observar atentamente a assinatura do método 'start', verá que ele recebe um parâmetro de importação do tipo class_prgm. No entanto, no evento Start-Of-Selection, esse método foi chamado em tempo de execução com objetos do tipo class_procedural e class_OO.

Exemplo

Report ZPolymorphism1. 
CLASS class_prgm Definition Abstract. 
PUBLIC Section. 
Methods: prgm_type Abstract, 
approach1 Abstract. 
ENDCLASS. 

CLASS class_procedural Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_procedural Implementation. 
Method prgm_type. 
Write: 'Procedural programming'. 

EndMethod. Method approach1. 
Write: 'top-down approach'. 

EndMethod. ENDCLASS. 
CLASS class_OO Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_OO Implementation. 
Method prgm_type. 
Write: 'Object oriented programming'. 
EndMethod. 

Method approach1. 
Write: 'bottom-up approach'.
EndMethod. 
ENDCLASS. 

CLASS class_type_approach Definition. 
PUBLIC Section. 
CLASS-METHODS: 
start Importing class1_prgm 
Type Ref To class_prgm. 
ENDCLASS. 

CLASS class_type_approach IMPLEMENTATION. 
Method start. 
CALL Method class1_prgm→prgm_type. 
Write: 'follows'. 

CALL Method class1_prgm→approach1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data: class_1 Type Ref To class_procedural, 
class_2 Type Ref To class_OO. 

Create Object class_1. 
Create Object class_2. 
CALL Method class_type_approach⇒start 
Exporting 

class1_prgm = class_1. 
New-Line. 
CALL Method class_type_approach⇒start 
Exporting 
class1_prgm = class_2.

O código acima produz a seguinte saída -

Procedural programming follows top-down approach  
Object oriented programming follows bottom-up approach

O ambiente de tempo de execução ABAP executa uma conversão implícita de estreitamento durante a atribuição do parâmetro de importação class1_prgm. Este recurso ajuda o método 'start' a ser implementado genericamente. As informações de tipo dinâmico associadas a uma variável de referência de objeto permitem que o ambiente de tempo de execução ABAP vincule dinamicamente uma chamada de método com a implementação definida no objeto apontado pela variável de referência de objeto. Por exemplo, o parâmetro de importação 'class1_prgm' para o método 'start' na classe 'class_type_approach' refere-se a um tipo abstrato que nunca poderia ser instanciado por conta própria.

Sempre que o método é chamado com uma implementação de subclasse concreta, como class_procedural ou class_OO, o tipo dinâmico do parâmetro de referência class1_prgm é vinculado a um desses tipos concretos. Portanto, as chamadas aos métodos 'prgm_type' e 'approach1' referem-se às implementações fornecidas nas subclasses class_procedural ou class_OO em vez das implementações abstratas indefinidas fornecidas na classe 'class_prgm'.

O encapsulamento é um conceito de Programação Orientada a Objetos (OOP) que une dados e funções que manipulam os dados e mantém ambos protegidos contra interferências externas e uso indevido. O encapsulamento de dados levou ao importante conceito OOP de ocultação de dados. O encapsulamento é um mecanismo de agrupar os dados e as funções que os utilizam, e a abstração de dados é um mecanismo de expor apenas as interfaces e ocultar os detalhes de implementação do usuário.

ABAP oferece suporte às propriedades de encapsulamento e ocultação de dados por meio da criação de tipos definidos pelo usuário chamados classes. Conforme discutido anteriormente, uma classe pode conter membros privados, protegidos e públicos. Por padrão, todos os itens definidos em uma classe são privados.

Encapsulamento por Interface

O encapsulamento realmente significa que um atributo e método podem ser modificados em classes diferentes. Conseqüentemente, dados e métodos podem ter formas e lógicas diferentes que podem ser ocultadas para separar classes.

Vamos considerar o encapsulamento por interface. Interface é usada quando precisamos criar um método com diferentes funcionalidades em diferentes classes. Aqui, o nome do método não precisa ser alterado. O mesmo método terá que ser implementado em diferentes implementações de classe.

Exemplo

O programa a seguir contém uma Interface inter_1. Declaramos atributo e um método method1. Também definimos duas classes, como Class1 e Class2. Portanto, temos que implementar o método 'method1' em ambas as implementações de classe. Implementamos o método 'method1' de maneira diferente em diferentes classes. No início da seleção, criamos dois objetos Object1 e Object2 para duas classes. Em seguida, chamamos o método por diferentes objetos para obter a função declarada em classes separadas.

Report ZEncap1. 
Interface inter_1.
   Data text1 Type char35.
   Methods method1.
EndInterface.

CLASS Class1 Definition.
   PUBLIC Section.
      Interfaces inter_1.
ENDCLASS. 

CLASS Class2 Definition.
   PUBLIC Section.
      Interfaces inter_1. 
ENDCLASS.

CLASS Class1 Implementation.
   Method inter_1~method1.
      inter_1~text1 = 'Class 1 Interface method'.
      Write / inter_1~text1.
   EndMethod. 
ENDCLASS.
 
CLASS Class2 Implementation.
   Method inter_1~method1.
      inter_1~text1 = 'Class 2 Interface method'.
      Write / inter_1~text1.
   EndMethod. 
ENDCLASS.
 
Start-Of-Selection.
   Data: Object1 Type Ref To Class1,
      Object2 Type Ref To Class2.
		
   Create Object: Object1, Object2.
   CALL Method: Object1→inter_1~method1,
                Object2→inter_1~method1.

O código acima produz a seguinte saída -

Class 1 Interface method 
Class 2 Interface method

As classes encapsuladas não têm muitas dependências no mundo externo. Além disso, as interações que eles têm com clientes externos são controladas por meio de uma interface pública estabilizada. Ou seja, uma classe encapsulada e seus clientes são fracamente acoplados. Na maioria das vezes, as classes com interfaces bem definidas podem ser conectadas a outro contexto. Quando projetadas corretamente, as classes encapsuladas se tornam ativos de software reutilizáveis.

Estratégia de Projeto

A maioria de nós aprendeu por meio de experiências amargas a tornar os alunos privados por padrão, a menos que realmente precisemos expô-los. Isso é apenas um bom encapsulamento. Essa sabedoria é aplicada com mais frequência aos membros de dados e também se aplica igualmente a todos os membros.

Semelhante às classes em ABAP, as interfaces atuam como tipos de dados para objetos. Os componentes das interfaces são iguais aos componentes das classes. Ao contrário da declaração de classes, a declaração de uma interface não inclui as seções de visibilidade. Isso ocorre porque os componentes definidos na declaração de uma interface estão sempre integrados na seção de visibilidade pública das classes.

As interfaces são utilizadas quando duas classes semelhantes possuem um método com o mesmo nome, mas as funcionalidades são diferentes uma da outra. As interfaces podem parecer semelhantes às classes, mas as funções definidas em uma interface são implementadas em uma classe para estender o escopo dessa classe. As interfaces junto com o recurso de herança fornecem uma base para o polimorfismo. Isso ocorre porque um método definido em uma interface pode se comportar de maneira diferente em classes diferentes.

A seguir está o formato geral para criar uma interface -

INTERFACE <intf_name>. 
DATA..... 
CLASS-DATA..... 
METHODS..... 
CLASS-METHODS..... 
ENDINTERFACE.

Nesta sintaxe, <intf_name> representa o nome de uma interface. As instruções DATA e CLASSDATA podem ser usadas para definir a instância e os atributos estáticos da interface, respectivamente. As instruções METHODS e CLASS-METHODS podem ser usadas para definir a instância e os métodos estáticos da interface, respectivamente. Como a definição de uma interface não inclui a classe de implementação, não é necessário adicionar a cláusula DEFINITION na declaração de uma interface.

Note- Todos os métodos de uma interface são abstratos. Eles são totalmente declarados incluindo sua interface de parâmetro, mas não implementados na interface. Todas as classes que desejam usar uma interface devem implementar todos os métodos da interface. Caso contrário, a classe se torna uma classe abstrata.

Usamos a seguinte sintaxe na parte de implementação da classe -

INTERFACE <intf_name>.

Nesta sintaxe, <intf_name> representa o nome de uma interface. Observe que essa sintaxe deve ser usada na seção pública da classe.

A seguinte sintaxe é usada para implementar os métodos de uma interface dentro da implementação de uma classe -

METHOD <intf_name~method_m>. 
<statements>. 
ENDMETHOD.

Nesta sintaxe, <intf_name ~ method_m> representa o nome totalmente declarado de um método da interface <intf_name>.

Exemplo

Report ZINTERFACE1. 
INTERFACE my_interface1. 
Methods msg. 
ENDINTERFACE. 

CLASS num_counter Definition. 
PUBLIC Section. 
INTERFACES my_interface1. 
Methods add_number. 
PRIVATE Section. 
Data num Type I. 
ENDCLASS. 

CLASS num_counter Implementation. 
Method my_interface1~msg. 
Write: / 'The number is', num. 
EndMethod. 

Method add_number. 
ADD 7 TO num. 
EndMethod. 
ENDCLASS. 

CLASS drive1 Definition. 
PUBLIC Section. 
INTERFACES my_interface1. 
Methods speed1.
PRIVATE Section.
Data wheel1 Type I. 
ENDCLASS. 

CLASS drive1 Implementation.
Method my_interface1~msg.
Write: / 'Total number of wheels is', wheel1. 
EndMethod. 

Method speed1. 
Add 4 To wheel1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data object1 Type Ref To num_counter. 
Create Object object1. 

CALL Method object1→add_number.
CALL Method object1→my_interface1~msg.

Data object2 Type Ref To drive1. 
Create Object object2.
 
CALL Method object2→speed1. 
CALL Method object2→my_interface1~msg.

O código acima produz a seguinte saída -

The number is 7 
Total number of wheels is 4

No exemplo acima, my_interface1 é o nome de uma interface que contém o método 'msg'. A seguir, duas classes, num_counter e drive1 são definidas e implementadas. Ambas as classes implementam o método 'msg' e também métodos específicos que definem o comportamento de suas respectivas instâncias, como os métodos add_number e speed1.

Note - Os métodos add_number e speed1 são específicos para as respectivas classes.

A eventé um conjunto de resultados que são definidos em uma classe para acionar os manipuladores de eventos em outras classes. Quando um evento é disparado, podemos chamar qualquer número de métodos manipuladores de eventos. O link entre um gatilho e seu método manipulador é decidido dinamicamente em tempo de execução.

Em uma chamada de método normal, um programa de chamada determina qual método de um objeto ou classe precisa ser chamado. Como o método de tratamento fixo não é registrado para todos os eventos, no caso de tratamento de eventos, o método de tratamento determina o evento que precisa ser disparado.

Um evento de uma classe pode disparar um método manipulador de eventos da mesma classe usando a instrução RAISE EVENT. Para um evento, o método do manipulador de eventos pode ser definido na mesma classe ou em classes diferentes usando a cláusula FOR EVENT, conforme mostrado na sintaxe a seguir -

FOR EVENT <event_name> OF <class_name>.

Semelhante aos métodos de uma classe, um evento pode ter interface de parâmetro, mas possui apenas parâmetros de saída. Os parâmetros de saída são passados ​​para o método manipulador de eventos pela instrução RAISE EVENT que os recebe como parâmetros de entrada. Um evento é vinculado ao seu método manipulador dinamicamente em um programa usando a instrução SET HANDLER.

Quando um evento é disparado, os métodos de tratamento de eventos apropriados devem ser executados em todas as classes de tratamento.

Exemplo

REPORT ZEVENT1. 
CLASS CL_main DEFINITION. 
PUBLIC SECTION. 
DATA: num1 TYPE I. 
METHODS: PRO IMPORTING num2 TYPE I. 
EVENTS: CUTOFF. 
ENDCLASS. 

CLASS CL_eventhandler DEFINITION. 
PUBLIC SECTION. 
METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main. 
ENDCLASS. 

START-OF-SELECTION. 
DATA: main1 TYPE REF TO CL_main. 
DATA: eventhandler1 TYPE REF TO CL_eventhandler. 

CREATE OBJECT main1. 
CREATE OBJECT eventhandler1. 

SET HANDLER eventhandler1→handling_CUTOFF FOR main1. 
main1→PRO( 4 ).
CLASS CL_main IMPLEMENTATION.
METHOD PRO.
num1 = num2.
IF num2 ≥ 2. 
RAISE EVENT CUTOFF.
ENDIF. 
ENDMETHOD.
ENDCLASS.

CLASS CL_eventhandler IMPLEMENTATION.
METHOD handling_CUTOFF.
WRITE: 'Handling the CutOff'. 
WRITE: / 'Event has been processed'. 
ENDMETHOD. ENDCLASS.

O código acima produz a seguinte saída -

Handling the CutOff 
Event has been processed

UMA reporté uma apresentação de dados em uma estrutura organizada. Muitos sistemas de gerenciamento de banco de dados incluem um gravador de relatórios que permite projetar e gerar relatórios. Os aplicativos SAP oferecem suporte à criação de relatórios.

Um relatório clássico é criado usando os dados de saída na instrução WRITE dentro de um loop. Eles não contêm nenhum sub-relatório. O SAP também fornece alguns relatórios padrão, como RSCLTCOP que é usado para copiar tabelas em clientes e RSPARAM que é usado para exibir parâmetros de instância.

Esses relatórios consistem em apenas uma tela como saída. Podemos usar vários eventos, como INITIALIZATON & TOP-OF-PAGE para criar um relatório clássico, e cada evento tem sua própria importância durante a criação de um relatório clássico. Cada um desses eventos está associado a uma ação específica do usuário e é disparado apenas quando o usuário executa essa ação.

A seguir está uma tabela que descreve os eventos e descrições -

S.No. Descrição do Evento
1

INITIALIZATON

Disparado antes de exibir a tela de seleção.

2

AT SELECTION-SCREEN

Disparado após o processamento da entrada do usuário na tela de seleção. Este evento verifica a entrada do usuário antes da execução de um programa. Após processar a entrada do usuário, a tela de seleção permanece no modo ativo.

3

START-OF-SELECTION

Disparado somente após o término do processamento da tela de seleção; ou seja, quando o usuário clica no ícone Executar na tela de seleção.

4

END-OF-SELECTION

Disparado após a última instrução no evento START-OF-SELECTON ser executada.

5

TOP-OF-PAGE

Disparado pela primeira instrução WRITE para exibir os dados em uma nova página.

6

END-OF-PAGE

Disparado para exibir o texto no final de uma página em um relatório. Observe que este evento é o último evento durante a criação de um relatório e deve ser combinado com a cláusula LINE-COUNT da instrução REPORT.

Exemplo

Vamos criar um relatório clássico. Exibiremos as informações armazenadas no banco de dados padrão MARA (contém dados gerais do material) usando uma sequência de declarações no editor ABAP.

REPORT ZREPORT2 
LINE-SIZE 75 
LINE-COUNT 30(3) 
NO STANDARD PAGE HEADING. 
Tables: MARA. 
TYPES: Begin of itab, 

MATNR TYPE MARA-MATNR, 
MBRSH TYPE MARA-MBRSH, 
MEINS TYPE MARA-MEINS, 
MTART TYPE MARA-MTART, 

End of itab. 

DATA: wa_ma TYPE itab,
      it_ma TYPE STANDARD TABLE OF itab.
		
SELECT-OPTIONS: MATS FOR MARA-MATNR OBLIGATORY. 
INITIALIZATION. 
MATS-LOW = '1'. 
MATS-HIGH = '500'. 

APPEND MATS. 
AT SELECTION-SCREEN. .
IF MATS-LOW = ' '. 
MESSAGE I000(ZKMESSAGE). 
ELSEIF MATS-HIGH = ' '. 
MESSAGE I001(ZKMESSAGE). 
ENDIF. 

TOP-OF-PAGE. 
WRITE:/ 'CLASSICAL REPORT CONTAINING GENERAL MATERIAL DATA  
FROM THE TABLE MARA' COLOR 7. 
ULINE. 
WRITE:/ 'MATERIAL' COLOR 1, 

24 'INDUSTRY' COLOR 2, 
38 'UNITS' COLOR 3, 
53 'MATERIAL TYPE' COLOR 4. 
ULINE. 
END-OF-PAGE. 

START-OF-SELECTION. 
SELECT MATNR MBRSH MEINS MTART FROM MARA  
INTO TABLE it_ma WHERE MATNR IN MATS. 
LOOP AT it_ma into wa_ma. 
WRITE:/  wa_ma-MATNR, 

25 wa_ma-MBRSH, 
40 wa_ma-MEINS, 
55 wa_ma-MTART. 
ENDLOOP. 
END-OF-SELECTION. 

ULINE. 
WRITE:/ 'CLASSICAL REPORT HAS BEEN CREATED' COLOR 7.
ULINE. 
SKIP.

O código acima produz a seguinte saída contendo os dados gerais do material da tabela padrão MARA -

A programação de diálogo lida com o desenvolvimento de vários objetos. Todos esses objetos são vinculados hierarquicamente ao programa principal e são executados em uma sequência. O desenvolvimento do programa de diálogo faz uso de ferramentas no ambiente de trabalho ABAP. Essas são as mesmas ferramentas usadas no desenvolvimento de aplicativos SAP padrão.

Aqui estão os principais componentes dos programas de diálogo -

  • Screens
  • Pools de módulos
  • Subroutines
  • Menus
  • Transactions

O conjunto de ferramentas

Os programas de diálogo devem ser desenvolvidos pelo navegador de objetos (transação: SE80) para que todos os objetos sejam vinculados ao programa principal sem ter que apontar explicitamente cada objeto. As técnicas de navegação avançadas aprimoram o processo de movimentação de um objeto para outro.

As telas são compostas de atributos de tela, layout de tela, campos e lógica de fluxo. O pool de módulos consiste em sintaxe modularizada que é colocada dentro de programas de inclusão do programa de diálogo. Esses módulos podem ser chamados pela lógica de fluxo, que é processada pelo processador de diálogo.

Criando um Novo Programa de Diálogo

Step 1 - Na transação SE80, selecione 'Programa' na lista suspensa e insira um nome Z para seu programa SAP personalizado como 'ZSCREENEX'.

Step 2 - Pressione Enter, escolha 'With TOP INCL' e clique no botão 'Yes'.

Step 3 - Digite um nome para o seu top include como 'ZSCRTOP' e clique na marca de seleção verde.

Step 4 - Na tela de atributos, basta inserir um título e clicar no botão Salvar.

Adicionando uma tela ao programa de diálogo

Step 1 - Para adicionar uma tela ao programa, clique com o botão direito no nome do programa e selecione as opções Criar → Tela.

Step 2 - Insira um número de tela como '0211' e clique na marca verde.

Step 3 - Na próxima tela, digite um título curto, defina o tipo de tela normal e clique no botão Salvar na barra de ferramentas superior do aplicativo.

Layout da tela e adição de texto 'Hello World'

Step 1 - Clique no botão layout na barra de ferramentas do aplicativo e a janela Screen Painter é exibida.

Step 2 - Adicione um campo de texto e insira algum texto, como "Hello World".

Step 3 - Salve e ative a tela.

Criação de transação

Step 1 - Para criar um código de transação para o seu programa, basta clicar com o botão direito no nome do programa e escolher a opção Criar → Transação e inserir um código de transação como 'ZTRANEX'.

Step 2 - Insira o texto da transação, o programa e a tela que você acabou de criar (ZSCREENEX & 0211) e marque a caixa de seleção 'SAPGUI para Windows' na seção 'Suporte da GUI'.

Executando o Programa

Salve e ative tudo. Você pode executar o programa. Conforme o programa é executado, o texto que você inseriu é exibido na tela, conforme mostrado na captura de tela a seguir.

A ferramenta SAP Smart Forms pode ser usada para imprimir e enviar documentos. Esta ferramenta é útil no desenvolvimento de formulários, arquivos PDF, e-mails e documentos para a Internet. A ferramenta fornece uma interface para construir e manter o layout e a lógica de um formulário. A SAP também oferece uma seleção de formulários para processos de negócios, como os usados ​​em Customer Relationship Management (CRM), Sales and Distribution (SD), Financial Accounting (FI) e Human Resources (HR).

A ferramenta permite que você modifique formulários usando ferramentas gráficas simples em vez de usar qualquer ferramenta de programação. Isso significa que um usuário sem conhecimento de programação pode configurar esses formulários com dados para um processo de negócios sem esforço.

Em um Smart Form, os dados são recuperados de tabelas estáticas e dinâmicas. O cabeçalho e o subtotal da tabela são especificados pelos eventos disparados e os dados são classificados antes da saída final. Um Smart Form permite incorporar gráficos que podem ser exibidos como parte do formulário ou como plano de fundo. Você também pode suprimir um gráfico de fundo, se necessário, ao imprimir um formulário.

Alguns exemplos de Smart Forms padrão disponíveis no sistema SAP são os seguintes -

  • SF_EXAMPLE_01 representa uma fatura com uma saída de tabela para reserva de voo para um cliente.

  • SF_EXAMPLE_02 representa uma fatura semelhante a SF_EXAMPLE_01, mas com subtotais.

  • SF_EXAMPLE_03 especifica uma fatura semelhante a SF_EXAMPLE_02, mas uma na qual vários clientes podem ser selecionados em um programa de aplicativo.

Criação de um formulário

Vamos criar um formulário usando a ferramenta SAP Smart Forms. Você também aprenderá como adicionar um nó no Smart Form e testar o formulário neste tutorial. Aqui, começamos com a criação de uma cópia do formulário SF_EXAMPLE_01. O formulário SF_EXAMPLE_01 é um Smart Form padrão disponível no sistema SAP.

Step 1- Smart Form Builder é a interface principal usada para construir um Smart Form. Está disponível na tela inicial do SAP Smart Forms. Precisamos digitar o código de transação 'SMARTFORMS' no campo Comando para abrir a tela inicial do SAP Smart Forms. Nesta tela, insira o nome do formulário, SF_EXAMPLE_01, no campo Formulário.

Step 2 - Selecione Smart Forms → Copiar ou clique no ícone Copiar para abrir a caixa de diálogo Copiar formulário ou texto.

Step 3- No campo Objeto de destino, insira um nome para o novo formulário. O nome deve começar com a letra Y ou Z. Neste caso, o nome do formulário é 'ZSMM1'.

Step 4 - Clique no ícone Continuar ou pressione a tecla ENTER na caixa de diálogo Copiar Formulário ou Texto para que o formulário ZSMM1 seja criado como uma cópia do formulário predefinido SF_EXAMPLE_01.

Step 5- Clique no ícone Salvar. O nome do formulário é exibido no campo Formulário na tela inicial do SAP Smart Forms.

Step 6- Clique no botão Criar na tela inicial do SAP Smart Forms. O formulário ZSMM1 aparece no Form Builder.

Step 7- A primeira página de rascunho é criada com uma janela PRINCIPAL. Todos os componentes do novo formulário são baseados no formulário predefinido SF_EXAMPLE_01. Você pode simplesmente clicar em um nó no menu de navegação para visualizar seu conteúdo.

Criação de um nó de texto no formulário

Step 1 - Abra um formulário no modo de alteração da tela SAP Form Builder e clique com o botão direito na opção Janela principal no nó Primeira página e selecione Criar → Texto no menu de contexto.

Step 2- Modifique o texto no campo Texto para 'Meu_Texto' e o texto no campo Significado para 'Texto_Demo'. Digite o texto 'Hello TutorialsPoint .....' na caixa de edição de texto no quadro central do Form Builder, conforme mostrado no seguinte instantâneo -

Step 3 - Clique no botão Salvar para salvar o nó.

Step 4- Ative e teste o nó clicando nos ícones Ativar e Testar, respectivamente. A tela inicial do Function Builder é exibida.

Step 5- Ative e teste o módulo de função clicando nos ícones Ativar e Executar. Os parâmetros do módulo de função são exibidos na tela inicial do Function Builder.

Step 6- Execute o módulo de função clicando no ícone Executar. A caixa de diálogo Imprimir é exibida.

Step 7 - Especifique o dispositivo de saída como 'LP01' e clique no botão Visualizar impressão.

As etapas acima produzirão a seguinte saída -

A ferramenta SAPscript do sistema SAP pode ser usada para construir e gerenciar formulários de negócios, como faturas e pedidos de compra. A ferramenta SAPscript fornece vários modelos que simplificam em grande medida o design de um formulário de negócios.

O sistema SAP vem com formulários SAPscript standard que são fornecidos com o mandante standard SAP (geralmente como mandante 000). A seguir estão alguns exemplos de formulários SAPscript padrão entregues com o cliente 000 -

S.No. Nome e descrição do formulário
1

RVORDER01

Formulário de confirmação de pedido de vendas

2

RVDELNOTE

Lista de embalagem

3

RVINVOICE01

Fatura

4

MEDRUCK

Ordem de Compra

5

F110_PRENUM_CHCK

Cheque pré-numerado

A estrutura de um formulário SAPscript consiste em 2 componentes principais -

Content - Pode ser texto (dados comerciais) ou gráficos (logotipo da empresa).

Layout - Isso é definido por um conjunto de janelas nas quais o conteúdo do formulário aparece.

SAPscript - Ferramenta Form Painter

A ferramenta Form Painter fornece o layout gráfico de um formulário SAPscript e várias funcionalidades para manipular o formulário. No exemplo a seguir, vamos criar um formulário de fatura após copiar sua estrutura de layout de um formulário SAPscript standard RVINVOICE01 e exibir seu layout acessando a ferramenta Form Painter.

Step 1- Abra o Form Painter. Você pode solicitar a tela navegando no menu SAP ou usando o código de transação SE71.

Step 2- No Form Painter, tela de solicitação, insira um nome e um idioma para um formulário SAPscript nos campos Formulário e Idioma, respectivamente. Vamos inserir 'RVINVOICE01' e 'EN' respectivamente nestes campos.

Step 3 - Selecione o botão de opção Layout de página na caixa de grupo Subobjetos.

Step 4- Selecione Utilitários → Copiar do cliente para criar uma cópia do formulário RVINVOICE01. A tela 'Copiar formulários entre clientes' é exibida.

Step 5- Na tela 'Copiar formulários entre clientes', digite o nome original do formulário, 'RVINVOICE01', no campo Nome do formulário, o número do cliente de origem '000' no campo Cliente de origem e o nome do destino formulário como 'ZINV_01' no campo Formulário de destino. Certifique-se de que as outras configurações permaneçam inalteradas.

Step 6- Em seguida, clique no ícone Executar na tela 'Copiar formulários entre clientes'. A caixa de diálogo 'Criar entrada de diretório de objeto' é exibida. Clique no ícone Salvar.

O formulário ZINV_01 é copiado do formulário RVINVOICE01 e exibido na tela 'Copiar formulários entre clientes', conforme ilustrado no seguinte instantâneo -

Step 7 - Clique no ícone voltar duas vezes e navegue de volta para a tela Form Painter: Request, que contém o nome do formulário copiado ZINV_01.

Step 8 - Após clicar no botão Exibir, a janela 'Formulário ZINV_01: Layout da Página PRIMEIRO' e a tela 'Formulário: Alterar Layout da Página: ZINV_01' aparecem como mostrado na imagem a seguir.

Step 9- A janela 'Formulário ZINV_01: Layout da Página PRIMEIRO' mostra o layout inicial do formulário. O layout do formulário contém cinco janelas: HEADER, ADDRESS, INFO, INFO1 e MAIN. A descrição dessas janelas pode ser acessada no PC Editor.

Por exemplo, apenas selecionando a janela PRINCIPAL e clicando no ícone Texto na tela 'Formulário: Alterar Layout da Página: ZINV_01', você pode visualizar todos os valores de margem conforme mostrado na imagem a seguir -

As saídas do cliente podem ser consideradas como ganchos para os programas padrão SAP. Não precisamos de uma chave de acesso para escrever o código e não há necessidade de modificar o programa padrão SAP. Essas saídas não têm nenhuma funcionalidade e estão vazias. A lógica de negócios pode ser adicionada para atender a vários requisitos do cliente. No entanto, as saídas do cliente não estão disponíveis para todos os programas.

Saídas do cliente para transações padrão

A seguir estão as etapas para localizar saídas de cliente no que diz respeito às transações padrão. Vamos identificar as saídas do cliente disponíveis no MM01 (Criação do Mestre de Materiais).

Step 1 - Vá para a transação MM01 e identifique o nome do programa de MM01 acessando a barra de menus → Sistema → Status como mostrado na imagem acima.

Step 2- Obtenha o nome do programa na tela pop-up. O nome do programa é 'SAPLMGMM'.

Step 3 - Vá para a transação SE38, insira o nome do programa e clique em Exibir.

Step 4 - Navegue até Ir para → Propriedades e descubra o pacote com o nome deste programa.

O nome do pacote é 'MGA'.

Step 5- Vá para o código de transação SMOD que geralmente é usado para identificar saídas de clientes. Navegue até Utilitários → Localizar (ou), você pode pressionar Ctrl + F diretamente no código de transação SMOD.

Step 6 - Depois de ir para a tela 'Find Exits', digite o nome do pacote que obtivemos anteriormente e pressione o botão F8 (Executar).

As etapas acima produzem a seguinte saída com a lista de saídas disponíveis na Criação do mestre de materiais.

As saídas de usuário são usadas em uma extração se os extratores SAP padrão não fornecem os dados esperados ou a funcionalidade necessária, por exemplo, em autorizações ou verificações de tempo. As saídas de usuário são comumente usadas em módulos de vendas e distribuição (SD). Existem muitas saídas fornecidas pela SAP nas áreas de vendas, transporte, remessa e faturamento. Uma saída de usuário é projetada para fazer algumas alterações quando o SAP padrão não é capaz de atender a todos os requisitos.

Para poder acessar quais saídas estão disponíveis em cada área de vendas, acesse IMG através deste caminho: IMG → Vendas e Distribuição → Modificações do Sistema → Saídas de Usuário. A documentação para cada saída nas áreas de SD é explicada detalhadamente.

Por exemplo, se você deseja encontrar saídas de usuário em Processamento de documentos de vendas (contrato, cotação ou pedido de venda), siga o caminho mencionado acima e continue a expandir o nó Saídas de usuário em Vendas → Saídas de usuário. Clique na documentação do ícone para ver todas as saídas de usuário disponíveis no Processamento de documentos de vendas.

S.No. Saída de usuário e descrição
1

USEREXIT_FIELD_MODIFICATION

Usado para modificar os atributos da tela.

2

USEREXIT_SAVE_DOCUMENT

Ajuda na execução de operações quando o usuário clica em Salvar.

3

USEREXIT_SAVE_DOCUMENT_PREPARE

Muito útil para verificar campos de entrada, colocar qualquer valor no campo ou mostrar um popup aos usuários e para confirmar o documento.

4

USEREXIT_MOVE_FIELD_TO_VBAK

Usado quando as alterações do cabeçalho do usuário são movidas para a área de trabalho do cabeçalho.

5

USEREXIT_MOVE_FIELD_TO_VBAP

Usado quando as alterações do item do usuário são movidas para a área de trabalho do item SAP.

Uma saída de usuário tem a mesma finalidade que as saídas de cliente, mas estão disponíveis apenas para o módulo SD. A saída é implementada como uma chamada para um Módulo de Função. User Exits são modificações nos programas padrão SAP.

Exemplo

REPORT ZUSEREXIT1. 
TABLES:   
   TSTC, TSTCT,
   TADIR, TRDIR, TFDIR, ENLFDIR,
   MODSAPT, MODACT. 
	
DATA:   
   JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE,
   field1(30),
   v_devclass LIKE TADIR-devclass. 
	
PARAMETERS:
   P_TCODE LIKE TSTC-tcode OBLIGATORY. 
	
SELECT SINGLE *
   FROM TSTC
   WHERE tcode EQ P_TCODE. 
	
IF SY-SUBRC EQ 0.
   SELECT SINGLE *
   FROM TADIR
	
   WHERE pgmid = 'R3TR' AND 
         object = 'PROG' AND
         obj_name = TSTC-pgmna.
		
   MOVE TADIR-devclass TO v_devclass.
	
   IF SY-SUBRC NE 0.
   SELECT SINGLE * 
      FROM TRDIR
      WHERE name = TSTC-pgmna.
		
   IF TRDIR-subc EQ 'F'.
      SELECT SINGLE *
         FROM TFDIR
         WHERE pname = TSTC-pgmna.
			
      SELECT SINGLE *
         FROM ENLFDIR 
         WHERE funcname = TFDIR-funcname.
			
      SELECT SINGLE * 
         FROM TADIR
         WHERE pgmid = 'R3TR' AND
               object = 'FUGR' AND 
               obj_name EQ ENLFDIR-area.
         MOVE TADIR-devclass TO v_devclass.
      ENDIF.
   ENDIF.
	
   SELECT *
      FROM TADIR
      INTO TABLE JTAB
		
      WHERE pgmid = 'R3TR' AND
            object = 'SMOD' AND
            devclass = v_devclass.
			
   SELECT SINGLE *
      FROM TSTCT
      WHERE sprsl EQ SY-LANGU AND
            tcode EQ P_TCODE.
			
   FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
   WRITE:/(19) 'Transaction Code - ', 
      20(20) P_TCODE,
      45(50) TSTCT-ttext.
   SKIP.
	
   IF NOT JTAB[] IS INITIAL.
      WRITE:/(95) SY-ULINE.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
		
      WRITE:/1 SY-VLINE, 
            2 'Exit Name',
            21 SY-VLINE , 
            22 'Description',
            95 SY-VLINE.
			
      WRITE:/(95) SY-ULINE.
      LOOP AT JTAB.
         SELECT SINGLE * FROM MODSAPT
         WHERE sprsl = SY-LANGU AND
               name = JTAB-obj_name.
				
         FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
         WRITE:/1 SY-VLINE,
               2 JTAB-obj_name HOTSPOT ON,
               21 SY-VLINE ,
               22 MODSAPT-modtext,
               95 SY-VLINE.
      ENDLOOP.
		
      WRITE:/(95) SY-ULINE.
      DESCRIBE TABLE JTAB.
      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ 'No of Exits:' , SY-TFILL.
		
   ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(95) 'User Exit doesn’t exist'.
   ENDIF. 
ELSE.

   FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
   WRITE:/(95) 'Transaction Code Does Not Exist'. 
ENDIF.
 
AT LINE-SELECTION.
   GET CURSOR FIELD field1.
   CHECK field1(4) EQ 'JTAB'.
   SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
   CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.

Durante o processamento, insira o código de transação 'ME01' e pressione o botão F8 (Executar). O código acima produz a seguinte saída -

Em alguns casos, funções especiais precisam ser predefinidas em um aplicativo de software para aprimorar a funcionalidade de vários aplicativos. Existem muitos suplementos do Microsoft Excel para melhorar a funcionalidade do MS Excel. Da mesma forma, o SAP facilita algumas funções predefinidas, fornecendoBusiness Add-Ins conhecido como BADIs.

Um BADI é uma técnica de aprimoramento que facilita a um programador SAP, um usuário ou uma indústria específica adicionar algum código adicional ao programa existente no sistema SAP. Podemos usar lógica padrão ou customizada para melhorar o sistema SAP. Um BADI deve primeiro ser definido e então implementado para aprimorar o aplicativo SAP. Ao definir um BADI, uma interface é criada. BADI é implementado por esta interface, que por sua vez é implementada por uma ou mais classes de adaptadores.

A técnica BADI é diferente de outras técnicas de aprimoramento de duas maneiras -

  • A técnica de aprimoramento pode ser implementada apenas uma vez.
  • Essa técnica de aprimoramento pode ser usada por vários clientes simultaneamente.

Você também pode criar BADIs de filtro, o que significa que os BADIs são definidos com base nos dados filtrados, o que não é possível com as técnicas de aprimoramento. O conceito de BADIs foi redefinido no SAP Release 7.0 com os seguintes objetivos -

  • Aprimorando os aplicativos padrão em um sistema SAP, adicionando dois novos elementos na linguagem ABAP, que é 'GET BADI' e 'CALL BADI'.

  • Oferecendo mais recursos de flexibilidade, como contextos e filtros para o aprimoramento de aplicativos padrão em um sistema SAP.

Quando um BADI é criado, ele contém uma interface e outros componentes adicionais, como códigos de função para aprimoramentos de menu e aprimoramentos de tela. Uma criação BADI permite que os clientes incluam suas próprias melhorias no aplicativo SAP padrão. O aprimoramento, a interface e as classes geradas estão localizados em um namespace de desenvolvimento de aplicativo apropriado.

Portanto, um BADI pode ser considerado uma técnica de aprimoramento que usa objetos ABAP para criar 'pontos predefinidos' nos componentes SAP. Esses pontos predefinidos são então implementados por soluções individuais da indústria, variantes de países, parceiros e clientes para atender às suas necessidades específicas. A SAP realmente introduziu a técnica de aprimoramento BADI com o Release 4.6A e a técnica foi reimplementada novamente no Release 7.0.

Web Dynpro (WD) para ABAP é a tecnologia de interface de usuário padrão da SAP desenvolvida pela SAP AG. Ele pode ser usado no desenvolvimento de aplicativos baseados na web no ambiente SAP ABAP que utiliza ferramentas e conceitos de desenvolvimento SAP. Ele fornece uma interface de usuário da web front-end para conectar-se diretamente aos sistemas SAP R / 3 backend para acessar dados e funções para relatórios.

O Web Dynpro para ABAP consiste em um ambiente de tempo de execução e um ambiente de desenvolvimento gráfico com ferramentas de desenvolvimento específicas que são integradas no ABAP Workbench (transação: SE80).

Arquitetura da Web Dynpro

A ilustração a seguir mostra a arquitetura geral do Web Dynpro -

A seguir estão alguns pontos a serem considerados em relação ao Web Dynpro -

  • Web Dynpro é o modelo de programação SAP NetWeaver para interfaces de usuário.

  • Todos os aplicativos Web Dynpro são estruturados de acordo com o modelo de programação Model View Controller (MVC).

  • O modelo define uma interface para o sistema principal e a aplicação Web Dynpro pode ter acesso aos dados do sistema.

  • A visão é responsável por mostrar os dados no navegador da web.

  • O controlador reside entre a vista e o modelo. O controlador formata os dados do modelo a serem exibidos na visualização. Ele processa as entradas do usuário feitas pelo usuário e as retorna ao modelo.

Vantagens

O Web Dynpro oferece as seguintes vantagens para desenvolvedores de aplicativos -

  • O uso de ferramentas gráficas reduz significativamente o esforço de implementação.

  • Reutilizar e melhorar a manutenção usando componentes.

  • O layout e a navegação são facilmente alterados com as ferramentas Web Dynpro.

  • A acessibilidade da interface do usuário é suportada.

  • Integração total no ambiente de desenvolvimento ABAP.

Componente e janela Web Dynpro

O componente é a unidade global do projeto de aplicativo Web Dynpro. Criar um componente Web Dynpro é a etapa inicial no desenvolvimento de um novo aplicativo Web Dynpro. Depois que o componente é criado, ele atua como um nó na lista de objetos do Web Dynpro. Você pode criar qualquer número de visualizações de componente em um componente e montá-los em qualquer número de janelas do Web Dynpro correspondentes.

Pelo menos uma janela do Web Dynpro está contida em cada componente do Web Dynpro. A janela Web Dynpro incorpora todas as visualizações que são exibidas no aplicativo da web front-end. A janela é processada nos editores de janela do ABAP Workbench.

Note

  • A visualização do componente exibe todos os detalhes administrativos do aplicativo, incluindo a descrição, o nome da pessoa que o criou, a data de criação e o pacote de desenvolvimento atribuído.

  • A aplicação Web Dynpro é o objeto independente na lista de objetos do ABAP Workbench. A interação entre a janela e o aplicativo é criada pela visualização da interface de uma determinada janela.