¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Como arredondar um número de ponto flutuante no Open SQL: solução para o SQL que não está funcionando

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 40 Vistas
0
Cargando...

Olá,

Posso saber como arredondar um número de ponto flutuante no Open SQL?

A seguinte SQL não está funcionando... Por favor, me ajude, obrigado!

select round( ( cast( lvar1 as FLTP ) / cast( lvar2 as FLTP ) ), 6 ) ...

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

gk.goh2 , agora entendo completamente o seu problema. Eu atualizei novamente a resposta anterior com as seguintes informações e código que devem te ajudar.

Então, isso é o que você deveria fazer em vez disso:

  • utilizar a função Open SQL DIVISION para valores numéricos com decimais (exceto números de ponto flutuante)
  • essa função também permite definir o decimal que precisa ser arredondado
  • o operador de divisão '/' só pode ser utilizado com FLTP, mas o arredondamento e a conversão não podem ser feitos com FLTP
select division( lvar1, lvar2, 6) ...
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Obrigado Michael. Gostaria de CONVERTER para decimal, mas o SAP parece não permitir a divisão de campos decimais. Por isso, utilizei CONVERTER para FLTP. Você poderia me dizer se há alguma solução se eu quiser realizar tanto a DIVISÃO quanto o ARREDONDAMENTO em open SQL? Muito obrigado.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

A função Open SQL round não está 'disponível' para valores de tipo número de ponto flutuante (FLTP).

Além disso, com Open SQL, a divisão (operador '/') não é possível para inteiros e decimais, mas sim para números de ponto flutuante. No entanto, um valor FLTP não pode ser convertido em um decimal DEC, de fato, não pode ser convertido em nenhum outro tipo de valor (<<Uma expressão CAST deveria ser independente da plataforma. As conversões do tipo FLTP para outros tipos numéricos não são permitidas porque o resultado seria dependente da plataforma.>>).

Portanto, em vez disso, deve-se usar a função DIVISION para decimais com decimais, o que também cuidará do arredondamento do decimal. (A função DIV só pode ser usada para valores numéricos sem decimais).

Portanto, isso é o que você teria que fazer em seu lugar:

select division( lvar1, lvar2, 6) ...

Mais informações:

Desde o ABAP 7.50+, existem funções Open SQL para valores numéricos, como a função de arredondamento e as funções de divisão:

No entanto, a função DIVISION do SQL só está disponível para o Open SQL a partir da versão 7.51+.
Na versão 7.50, a SAP 'apenas' o introduziu no ABAP CDS.

Uso:

  • ROUND( expr, pos )
    expr: INT1, INT2, INT4, INT8, DEC, CURR e QUAN
    pos: INT1, INT2 e INT4
  • DIVISION( expr1, expr2, dec )
    expr1, expr2: INT1, INT2, INT4, INT8, DEC, CURR e QUAN
    dec: Literal ou variável de host constante com tipo ABAP b, s, i, int8 maior ou igual a 0 e não maior que 6 e a extensão de exp2 mais o número de decimais de exp1 mais 1
    Resultado:

Exemplo:

SELECT round( zwert,1 ) AS zwert,                        " CURR 13,2
       round( zmeng,2 ) AS zmeng,                        " QUAN 13,3
       round( umvkz,-1 ) AS umvkz,                       " DEC   5,0
       round( stcur,4 ) AS stcur,                        " DEC   9,5
"      round( posnr,-2 ) AS posnr                        " NUMC => No se permite un tipo de datos no numérico ;)
       round( cast( posnr as DEC( 6,
            
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

A função Open SQL round não está disponível para valores de tipo número de ponto flutuante (FLTP).

Além disso, com Open SQL, a divisão (operador '/') não é possível para inteiros e decimais, mas sim para números de ponto flutuante. No entanto, um valor FLTP não pode ser convertido em um decimal DEC, de fato, não pode ser convertido em nenhum outro tipo de valor (<<Uma expressão CAST deve ser independente da plataforma. Não são permitidas conversões do tipo FLTP para outros tipos numéricos porque o resultado seria dependente da plataforma.>>).

Portanto, em vez disso, deve-se usar a função DIVISION para decimais com casas decimais, que também cuidará de arredondar o decimal. (A função DIV só pode ser usada para valores numéricos sem casas decimais).

Então isso é o que você teria que fazer em vez disso:

select division( lvar1, lvar2, 6) ...

Mais informações:

Desde o ABAP 7.50+, existem funções Open SQL para valores numéricos, como a função round e as funções de divisão:

No entanto, a função DIVISION do SQL está disponível para Open SQL apenas a partir de 7.51+.
No 7.50, a SAP 'apenas' o introduziu no ABAP CDS.

Uso:

  • ROUND( expr, pos )
    expr: INT1, INT2, INT4, INT8, DEC, CURR e QUAN
    pos: INT1, INT2 e INT4
  • DIVISION( expr1, expr2, dec )
    expr1, expr2: INT1, INT2, INT4, INT8, DEC, CURR e QUAN
    dec: Literal ou variável host constante com tipo ABAP b, s, i, int8 maior ou igual a 0 e não maior que o valor máximo de 6 e o comprimento de exp2 mais o número de casas decimais de exp1 mais 1
    Resultado:

Exemplo:

SELECT round( zwert,1 ) AS zwert,                        " CURR 13,2
       round( zmeng,2 ) AS zmeng,                        " QUAN 13,3
       round( umvkz,-1 ) AS umvkz,                       " DEC   5,0
       round( stcur,4 ) AS stcur,                        " DEC   9,5
"      round( posnr,-2 ) AS posnr                        " NUMC => No se permite un tipo de datos no numérico ;)
       round( cast( posnr as DEC( 6,0 
        
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?