Introdução
Este breve blog descreve como enviar a funcionalidade de seleção de opções da camada ABAP para CDS usando funções de tabela. Antes de ler este breve blog, sugiro que você dê uma olhada nas opções de seleção de gerenciamento do AMDP. Temos visto muitas perguntas no SCN e em outros fóruns sobre como usar opções de seleção em AMDP, CDS etc. SELECT OPTIONS não é um recurso SQL. É um recurso ABAP (ou OPEN SQL) que o script SQL não entende. Portanto, não é possível pensar em enviar esta variável de opção de seleção (intervalo) diretamente para o nível do BD.
Implementação
O que podemos fazer? A única técnica de filtragem que o SQL pode compreender é o uso de uma cláusula where. Nas opções selecionadas, temos diversas opções para alternar entradas, como EQ, NE, CP, BETWEEN etc. Se pudermos converter essas opções em uma cláusula where compreendida pelo SQL, poderemos executá-la dinamicamente na camada do banco de dados.
Posso usar as opções Select no CDS?
Sim, pode, mas apenas na camada externa logo após projetar os dados, como fazemos no ABAP. Ou seja, ao consumir este CDS da camada ABAP você pode utilizar a variável range. Mas não é isso que estamos vendo. Precisamos empurrá-lo para o nível DB. Vamos primeiro criar uma função de tabela, para recuperar a lista de materiais junto com seu texto.
Esta função de tabela recebe uma string como parâmetro e retorna o número do material e o texto. Na implementação correspondente, usamos Função APPLY_FILTER disponível em SQL para aplicar a cláusula where dinâmica. Então, em sel_opt parâmetro da função de tabela, devemos passar uma cláusula where dinâmica correspondente às opções de seleção.
Aqui, o filtro é aplicado na tabela mara e o conjunto de resultados retornado é salvo em uma variável para uso posterior.
Agora o lado ABAP.
O que acontece aqui é, o programa abap possui uma tela de seleção com o número do material como opção de seleção. O CL_SHDB_SELTAB e é um método estático combine_sel_tabs retorna uma cláusula where dinâmica com base na variável de opção selecionada que passamos. Podemos especificar vários campos e suas variáveis de intervalo juntos. Esta operação deve ser executada quando todas as colunas especificadas estiverem disponíveis na projeção alvo. (Podemos especificar MATNR, ERSDA e MATKL juntos, pois todos esses campos estão disponíveis na tabela MARA.) O nome da coluna do cliente é um parâmetro opcional. Se passarmos este campo, o campo cliente também será adicionado na cláusula where dinâmica.
Passei 2 números de materiais na tela de seleção e a cláusula where gerada.
Agora passaremos esse valor (cláusula where) para a função de tabela que criamos.
E a cláusula where é executada na camada de banco de dados e os dados são filtrados.
Agora, fiz uma pequena alteração no código do script SQL na função de tabela. As colunas projetadas agora possuem novos nomes. Agora estamos aplicando o filtro em uma variável que possui os campos Cliente, Material, Idioma e Descrição. Então, mudou a dinâmica da cláusula where.
O aplicar_filtro a função pega uma tabela, visualização ou variável de tabela no escopo e aplica a cláusula where dinâmica. Leia meu outro blog sobre: mapeando a funcionalidade abap com abap para hana. Sreehari