Recuperando dados classificados do campo CHAR com números...

Introdução:

Gostaria de compartilhar uma situação curiosa que me deparei recentemente. Imagine que você precisa recuperar o arquivo valor máximo de um campo de tabela. Fácil, certo? Basta usar ORDENAR POR na sua instrução SQL SELECT e você está certo. Bem, não tão rápido. Isso funciona perfeitamente quando o campo é do tipo NUMC, Integer ou Float. Mas e se o campo for do tipo CHAR, mesmo que armazene dados numéricos?

Eu tentei usar ORDEM POR DESCIDA nesse campo CHAR. Isso funcionou bem para números de um único dígito (0-9). Mas assim que ele encontrou números de dois dígitos como 10, a mágica parou. De repente, 1 > 10 (aos olhos do SQL). Eca! Frustrante, não é?

Então, e agora?

Ideia 1: recuperar todos os dados

Poderíamos simplesmente inserir todos os registros em uma tabela interna temporária, classificá-los localmente e escolher o primeiro. Problema resolvido, certo? Bem, na verdade não. Por que? Por que:

1. Estamos recuperando muitos dados dos quais nem precisamos.
2. Se os dados transacionais da sua tabela forem enormes, você está enfrentando um possível gargalo de desempenho. Ninguém quer que sua agenda fique mais lenta!

Ideia 2: Mude o design

Devemos redesenhar o tipo de campo? Ou até mesmo pressionar a SAP para mudar isso para nós? Claro, é uma opção. Mas temos todo esse tempo e isso não vai causar mais problemas? Provavelmente não.

ELENCO para o resgate! Agora, é aqui que as coisas ficam emocionantes! Se você estiver usando ABAP versão 7.50+ ou S/4HANA, a SAP nos deu uma arma secreta: o Sintaxe CAST. É como um canivete suíço para suas instruções SELECT. Aqui está o plano de jogo:

  1. Primeiro vamos usar LANÇAR para converter o campo CHAR em NUMC.

  2. Então, como um truque de mágica com bis, encadeamos outro LANÇAR para transformar NUMC em inteiro (ou INT8).

Sim, você ouviu certo: encadear declarações CAST é o seu bilhete dourado! É como construir uma máquina que melhore o desempenho, uma camada de cada vez. Vamos mergulhar na ação.

Por exemplo, eu precisava selecionar o valor máximo do campo TEXT3 da tabela VTTK (cabeçalho de remessa). Este campo é CHAR40. Em seguida, construí a instrução Select com expressões Open SQL e usando CAST conforme mostrado abaixo. Aqui lv_text3 é o valor máximo armazenado em formato numérico.

             SELECT
FROM vttk
FIELDS CAST( CAST( text3 AS NUMC( 40 ) ) AS INT8 ) AS text3
WHERE text3 NE @space
ORDER BY text3 DESCENDING
INTO @DATA(lv_text3) UP TO 1 ROWS.
ENDSELECT.
*OR
SELECT
FROM vttk
FIELDS MAX( CAST( CAST( text3 AS NUMC( 40 ) ) AS INT8 ) ) AS text3
WHERE text3 NE @space
INTO @DATA(lv_text3).

E assim transformamos um problema complicado em uma solução simples e de alto desempenho. Nenhuma recuperação de dados desnecessária. Sem gargalos frustrantes. Magia ABAP simplesmente elegante e eficiente.

Isso encerra a funcionalidade.

Agradeço por ter vindo ler o artigo! Seus comentários, sugestões e compartilhamentos são muito apreciados.

. Não invente. Não escreva em outro idioma. Não fale sobre o autor do conteúdo. Foque no conteúdo, não em outras páginas, como políticas de privacidade, política de cookies ou outras. Seja exaustivo na reescrita: pelo menos 300 palavras. Não traduza nomes de marcas, produtos ou empresas.

FONTE

Por Staff

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *