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.
Pronto, agora sabemos como utilizar o INLINE VALUE…
Abs.
LNunes