INLINE VALUE 7.40 – Criando dados com VALUE

Se eu entendi bem tudo que li, o construtor de expressões INLINE VALUE cria como resultado um objeto com o tipo de dado especificado, que pode ser genérico ou não.

O que podemos “criar” com o INLINE VALUE? Com o VALUE é possível “criar” valores iniciais de todos os tipos para variáveis, estruturas, tabelas internas e classes.

É possível informar o tipo de dado explicitamente ou informar o # para que o resultado assuma o tipo do dado informado dentro dos parenteses.

var = VALUE #(var2). “Onde ‘var’ deverá possuir o tipo de ‘var2’.

Vejamos alguns exemplos simples.

Valor inicial para variáveis:
DATA(var) = VALUE string( ).   “A variável ‘var’ é criada com o tipo string
DATA(var) = VALUE int2( ).      “A variável ‘var’ é criada com o tipo inteiro
DATA(var) = VALUE xstring( ). “A variável ‘var’ é criada com o tipo xstring
DATA(var) = VALUE char40( ). “A variável ‘var’ é criada com o tipo caractere com 40 posições
DATA(var) = VALUE zchar2( ).  “A variável ‘var’ é criada com o tipo (‘Z’) caractere com 2 posições

***Se quiser aprender mais sobre declarações INLINE veja esse post aqui.

Valor inicial para estruturas:
TYPES: BEGIN OF ty_end,
                    rua       TYPE string,
                    nr         TYPE i,
                    cidade TYPE string,
                END OF ty_end.

DATA(wa_endereco) = VALUE ty_end( ). “A estrutura ‘wa_endereco’ é criada com o tipo (TY_END) informado

Valor inicial para tabelas internas:
DATA(ti_texto) = VALUE char40_t( ). “Deve-se usar tipos de tabela nesse caso, e o resultado é uma tabela interna

***Pode ser usado também para instanciar uma classe, mas como não usei ainda não vou exemplificar. Tem algum exemplo prático que deseja ver aqui, deixe um comentário. 🙂

Exemplos práticos de utilização do construtor INLINE VALUE:

*”Popular uma tabela interna já existente
TYPES: BEGIN OF ty_end,
                    rua       TYPE string,
                    nr         TYPE i,
                    cidade TYPE string,
                END OF ty_end.

DATA ti_endereco TYPE TABLE OF ty_end.

APPEND VALUE #( rua       = ‘XPTO’
                                  nr         = 1
                                  cidade = ‘ABAPLANDIA’ ) TO ti_endereco.

*”Appendar registros em uma tabela interna sem perder seu conteúdo atual
DATA ti_materiais TYPE TABLE OF mara.

SELECT *
     INTO TABLE @DATA(ti_mara)
    FROM mara
WHERE matnr = ‘000000000000000001’.
ti_materiais = ti_mara.

SELECT
     INTO TABLE @ti_mara
    FROM mara
WHERE matnr = ‘000000000000000002’.
ti_materiais = VALUE #( BASE ti_materiais ( LINES OF ti_mara ) ). “O BASE garante que os dados já existentes em ti_materiais não sejam substituídos

O resultado aqui deverá ser ti_materiais com dois registros.

*”Preencher uma tabela interna já existente com base em um LOOP e com possibilidade de tratamento de dados

ti_produtos = VALUE #FOR <fs_l> IN ti_materiais matnr = |{ <fs_l>matnr ALPHA OUT }| “Retira os zeros a esquerda
                                                                                                matkl = |GMat. { <fs_l>matkl }| )“Concatena valores

O field-symbol é instanciado, utilizado e liberado após o uso, aqui poderíamos utilizar uma work-area também sem ser declarada previamente.

*”Ou ainda declarar a tabela interna INLINE ‘tipada’ conforme a necessidade.
DATA(ti_produtos) = VALUE char40_t( FOR <fs_l> IN ti_materiais ( |{ <fs_l>-matnr ALPHA = OUT }| ) ).

Bom, esse carinha aí, o VALUE, na minha opinião, é muito útil para preencher RANGES e popular tabelas internas evitando LOOPs e mais LOOPs.

INLINE VALUE

Pronto, agora sabemos como utilizar o INLINE VALUE…

Abs.
LNunes

Quer receber todas os posts sobre a versão 7.40 gratuitamente no seu e-mail? Inscreva-se, é grátis.

* Campo obrigatório