¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo redondear un número de punto flotante en Open SQL: solución a la SQL que no funciona

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

Hola,

¿Puedo saber cómo redondear un número de punto flotante en Open SQL?

La siguiente SQL no está funcionando... ¡Por favor, ayúdame, gracias!

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 , ahora entiendo completamente tu problema. He actualizado nuevamente la respuesta anterior con la siguiente información y código que debería ayudarte.

Entonces esto es lo que tendrías que hacer en su lugar:

  • utilizar la función Open SQL DIVISION para valores numéricos con decimales (excepto números de punto flotante)
  • esta función también te permite definir el decimal que necesita ser redondeado
  • el operador de división '/' solo se puede utilizar con FLTP pero el redondeo y la conversión no se pueden hacer con FLTP
select division( lvar1, lvar2, 6) ...
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Gracias Michael. Me gustaría CONVERTIR a decimal pero SAP parece no permitir la división de campos decimales. Por eso utilicé CONVERTIR a FLTP. ¿Podrías decirme si hay alguna solución si quiero realizar tanto la DIVISIÓN como la REDONDEO en open SQL? Muchas gracias.

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

La función Open SQL round no está 'disponible' para valores de tipo número de punto flotante (FLTP).

Además, con Open SQL, la división (operador '/') no es posible para enteros y decimales, pero sí lo es para números de punto flotante. Sin embargo, un valor FLTP no puede ser convertido en un decimal DEC, de hecho, no se puede convertir en ningún otro tipo de valor (<<Una expresión CAST debería ser independiente de la plataforma. Las conversiones del tipo FLTP a otros tipos numéricos no están permitidas porque el resultado sería dependiente de la plataforma.>>).

Por lo tanto, en lugar de eso, se debe utilizar la función DIVISION para decimales con decimales, lo que también se encargará de redondear el decimal. (La función DIV solo se puede utilizar para valores numéricos sin decimales).

Por lo tanto, esto es lo que tendrías que hacer en su lugar:

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

Más información:

Desde ABAP 7.50+, existen funciones Open SQL para valores numéricos, como la función de redondeo y las funciones de división:

Sin embargo, la función DIVISION de SQL solo está disponible para Open SQL desde la versión 7.51+.
En la versión 7.50, SAP 'solo' lo introdujo en ABAP CDS.

Uso:

  • ROUND( expr, pos )
    expr: INT1, INT2, INT4, INT8, DEC, CURR y QUAN
    pos: INT1, INT2 e INT4
  • DIVISION( expr1, expr2, dec )
    expr1, expr2: INT1, INT2, INT4, INT8, DEC, CURR y QUAN
    dec: Literal o variable de host constante con tipo ABAP b, s, i, int8 mayor o igual a 0 y no mayor al valor máximo de 6 y la longitud de exp2 más el número de decimales de exp1 más 1
    Resultado:

Ejemplo:

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...

La función Open SQL round no está 'disponible' para valores de tipo número de punto flotante (FLTP).

Además, con Open SQL, la división (operador '/') no es posible para enteros y decimales, pero sí lo es para números de punto flotante. Sin embargo, un valor FLTP no puede convertirse en un decimal DEC, de hecho, no puede convertirse en ningún otro tipo de valor (<<Una expresión CAST debería ser independiente de la plataforma. No se permiten conversiones del tipo FLTP a otros tipos numéricos porque el resultado sería dependiente de la plataforma.>>).

Por lo tanto, en su lugar, se debe usar la función DIVISION para decimales con lugares decimales, que también se encargará de redondear el decimal. (La función DIV solo se puede usar para valores numéricos sin lugares decimales).

Entonces esto es lo que tendrías que hacer en su lugar:

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

Más información:

Desde ABAP 7.50+, existen funciones Open SQL para valores numéricos, como la función round y las funciones de división:

Sin embargo, la función DIVISION de SQL está disponible para Open SQL solo desde 7.51+.
En 7.50 SAP 'solo' lo introdujo en ABAP CDS.

Uso:

  • ROUND( expr, pos )
    expr: INT1, INT2, INT4, INT8, DEC, CURR y QUAN
    pos: INT1, INT2 e INT4
  • DIVISION( expr1, expr2, dec )
    expr1, expr2: INT1, INT2, INT4, INT8, DEC, CURR y QUAN
    dec: Literal o variable host constante con tipo ABAP b, s, i, int8 mayor o igual a 0 y no mayor que el valor máximo de 6 y la longitud de exp2 más el número de lugares decimales de exp1 más 1
    Resultado:

Ejemplo:

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?