A Progamação SAP ABAP [Contexto de Dados]
Olá Amigo(a),
Dando continuidade a série de post sobre a Programação SAP ABAP, hoje vamos falar sobre Contexto de Dados. Este é nosso terceiro post de uma série de oito aonde já falamos sobre conceito ABAP e o ABAP Dictionay.
No contexto de dados daremos uma visão das definições de objetos de dados do ABAP, as que julgo mais importantes e básicas.
É um post técnico, porém, bem importante.
Vamos lá!
Definindo objeto de dados
É como declaramos a sintaxe dos comandos de definição dos objetos abap.
Variáveis
Você pode associar uma variável referenciando a um objeto pré existente no programa, a um tipo pré definido (caractere, data, numérico...) ou a um objeto do banco de dados.
Quando se faz referência a outro objeto, é atribuída a variável as mesma características do objeto referenciado.
Sintaxe:
TYPE <Tipo de Dados ABAP>
DATA: <variável> TYPE <Objeto definido pelo usuário>
TYPE <Objeto do Dicionário>
DATA: <variável> LIKE <Objeto do Dicionário>
Tipo de Dados
Os dados definidos pelo usuário podem ser elementares ou estruturados.
Tipo de dados elementares não podem ser quebrados em outros componentes.
Tipo de dados estruturados, por outro lado, podem ser quebrados em varias partes para o armazenamento das informações.
Em dados estruturados existe uma diferença entre dados de estrutura e dados de tabela:
- Dados de estrutura só consegue armazenar um único conjunto de informações (como se fosse um único registro).
- Dados de tabela consegue armazenar vários níveis de informação (como se fosse uma tabela).
Tipos pré-definidos
Existem oito tipos de dados pré definidos divididos em dados numéricos e alfa.
Os dados numéricos são: Packed Number (P), Inteiro (I) e Ponto Flutuante (F).
Os dados alfa numéricos são: Texto Numérico (N), Texto (C), Data (D), Time (T), Hexadecimal (X).
Estruturas
Para a definição de tipo de estrutura usamos a sintaxe TYPE: BEGIN OF <type>,...., END OF <type>.
Dentro de uma estrutura pode conter outra estrutura ou mesmo uma tabela.
Por razões de compatibilidade, também podemos declarar uma estrutura utilizando DATA: BEGIN OF <type>,...., END OF <type>. Sem ter de haver uma declaração de estrutura.
Algumas particularidades:
- Cálculos com o tipo I são mais econômicos, comparados com os tipo P e F.
- O tipo F é melhor utilizado para problemas matemáticos complexos que possibilitem uma aproximação com erro. Para problemas financeiros melhor utilizar o tipo P.
- Nos tipos P, N, C e X deve ser informado, entre parênteses, o tamanho máximo.
- No tipo de dados P pode ser informado o número de casas decimais, com a adição da clausula DECIMALS. O máximo que pode ser utilizado é 14.
- O tipo de dados default é caractere (C), ou seja, se nenhum dado for informado, o tipo será C.
- Cada dado elementar pode possuir valores iniciais, para isso adicione a clausula VALUE após o tipo do dado.
- Variáveis e tipos de dados também podem ser referenciar a objetos de banco de dados.
- Usamos a clausula LIKE para se referenciar a um objeto do banco de dados.
- Quando se altera o conteúdo de uma variável referenciada a um objeto de banco de dados é a variável que modifica o conteúdo e não o objeto no banco de dados.
Regras para nomes de variáveis:
- Máximo de 30 caracteres,
- Não utilizar símbolos como: ( ) + . , :
- SPACE é um campo pré definido.
O Comando TABLES
O comando TABLES declara um objeto de dados interno que serve com estrutura de dados e funciona como uma área de trabalho. Não é necessário declarar no comando TABLES o nome de todas as tabelas referenciadas no programa, somente quando for necessário armazenar em memória (work area) os dados.
Sintaxe:
TABLES <nome da tabela no dicionário>.
Exemplo:
TABLES: EKKO, EKPO, EKKN.
Constantes
Para se definir valores constantes (que não mudam o valor no programa) é utilizado o comando CONSTANTS. A clausula VALUE é obrigatória para definir o seu valor.
Constantes numéricas são armazenadas utilizando os tipos P ou I.
Literais
O ABAP só reconhece 2 tipos de literais: numérico e texto. Os textos deverão vir sempre aspas simples.
Símbolo de texto ( text-xxx ) é um outro tipo de literal. A grande vantagem dos símbolos de texto é que o mesmo pode ser traduzido e as contantes não.
Comandos
Falaremos sobre alguns comandos básicos muito úteis e que com certeza você utilizara ou já utiliza bastante no seu dia a dia.
Comando MOVE e MOVE-CORRESPONDING
Comandos utilizados para transferis valores de um objeto para outro.
Sintaxe:
MOVE <objeto1> TO <objeto2>. ou <objeto1> = <objeto2>.
MOVE-CORRESPONDING <registro1> TO <registro2>.
Calculando Valores
Você pode usar o comando[COMPUTE] <campo> = <expressão aritmética>
Operadores: [ + ] [ - ] [ / ] [ * ] [ DIV ] [ MOD ] [ ** ]
Funções: [ SQRT ] [ EXP ] [ LOG ] [ SIN ] [ COS ] [ STRLEN ] [ TAN ]
Aonde:
- O comando COMPUTE é opcional.
- Os operadores e os parênteses que são parte da expressão são contados como uma palavra e portanto devem estar separados com espaços.
- Os parênteses só não devem estar separados da chamada da função, por exemplo SQRT(...).
- Os operadores DIV e MOD retornam valores inteiros.
- A função STRLEN retorna o tamanho de uma string.
Para efetuar as operações matemáticas básicas (soma, subtração, multiplicação e divisão) também podemos utilizar os comandos: ADD, SUBTRACT, MULTIPLY e DIVIDE.
Outras particularidades que normalmente não damos muita atenção e as vezes usamos sem mesmo saber como e o porque funciona desta forma:
- Sub-Campos; Podemos endereçar e alterar sub-areas de um campo elementar especificando a posição e o tamanho do campo de origem. Pode-se endereçar para estrutura, sem determinar qual a posição em que vá ficar as informações.
- Cálculo de Data; Se a data é convertida em campo numérico, o ABAP calcula o número de dias entre a 01.01.0001 e o dia. Uma data pode ser manipulada com string. O formato de data no sistema é no formato germânico, onde as posições são: ano (4 posições), mês (2 posições) e dia (02 posições).
As Expressões Lógicas
Diria que as expressões lógicas é o sangue de qualquer linguagem de programação, está em toda parte e no ABAP não é diferente. São elas:
EQ (=), NE (<>, ><), GT (>), GE (>=,=>), LT (<), LE (<=,=<)
BETWEEN V1 and V2 (Intervalo)
IS INITIAL (Valor Inicial)
As expressões lógicas podem estar linkadas com NOT, AND e OR.
A utilização dos parênteses indica uma sub expressão, e como tal ela considerada uma palavra, portanto deverão estar separadas por espaço.
Os comandos IF e CASE
Dois comandos que também estão misturados no sangue da linguagem.
CASE <objeto>.
WHEN <dado1>
...
WHEN <dado2>
...
WHEN OTHERS.
...
ENDCASE.
IF <expressão lógica>
...
ELSEIF <expressão lógica>
...
ELSEIF <expressão lógica>
...
ELSE <expressão lógica>
...
ENDIF.
Os comandos CASE e IF permite que se teste várias distinções.
No comando CASE...ENDCASE, somente um seqüência de WHEN será executada e a seqüência WHEN OTHERS é opcional.
No comando IF…ENDIF, as sequencias ELSE e ELSEIF são opicioanais. Se a expressão lógica é completamente validada, a seqüência de comandos seguida será executada. Podemos inserir quantos ELSEIF entre o IF e o ENDIF forem necessários, mas somente um ELSE.
LOOP, DO e WHILE
Comandos também muito utilizados aonde processamos lógicas de loop para dados armazenados em tabelas por exemplo.
Sintaxes:
LOOP AT t_table.
........
ENDLOOP.
DO <n> TIMES.
...
ENDDO.
WHILE <expressão lógica>.
...
ENDWHILE.
Alguns dados sobre esses comandos:
- O contador de vezes que o loop é executado é armazenado no SY-INDEX, tanto para DO...ENDDO quanto para WHILE...ENDWHILE.
- No loop DO, o parâmetro “<n> TIMES” é opcional. Se não for necessário, a saída do loop deve ser feita por comando dentro do loop.
- O número de passos do loop não pode ser modificado em tempo de execução alterando o valor do SY-INDEX.
- No loop WHILE, o loop será executado várias vezes enquanto a expressão lógica for verdadeira. O número de passos do loop não pode ser modificado em tempo de execução alterando o valor do SY-INDEX.
Por ultimo gostaria de falar sobre os comandos CHECK e EXIT.
Quando utilizamos o comando CHECK e a expressão lógica não for validada, o programa pula para o final do loop, ignorando todos os comandos existentes entre o comando e o finalizador do loop.
Já o comando EXIT faz com que o controle do sistema saia do loop, independente se a condição original foi finalizada ou não.
Sintaxe:
CHECK <expressão lógica>.
EXIT.
Exemplo:
WHILE sy-index LT li_cont.
CHECK sy-index < 50.
ENDWHILE.
Bom é isso meu amigo(a), espero que tenha ajuda.
Até o próximo post.
Alexandre Figueiredo