Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Funcion ABS (https://www.clubdelphi.com/foros/showthread.php?t=62982)

brandolin 23-01-2009 19:17:09

Funcion ABS
 
Hola a todos, busque y no encontre nada

necesito una funcion similara a la ABS... es decir en una consulta necesito que una columna sea siempre positiva... hay valores que son negativos y necesito convertirlos.

La consulta es:

Código SQL [-]
select fecha, tipo_mov, sum(cantidad) from mov_stock

Gracias desde ya...

jhonny 23-01-2009 19:34:55

"Chevere", pero, ¿Que motor utilizas?, estoy seguro que esa información es muy valiosa para poderte ayudar.

brandolin 23-01-2009 19:43:20

haaa si me olvide de ese detalle...

Firebird 1.5...

por lo que estoy leyendo la funcion ABS se implemento en la version 2.1.. habra alguna otra forma de implementarla... ???

jhonny 23-01-2009 19:53:17

Cita:

Empezado por brandolin (Mensaje 335716)
por lo que estoy leyendo la funcion ABS se implemento en la version 2.1.. habra alguna otra forma de implementarla... ???

Como bien dices esa función esta implementada dentro del motor, desde la versión 2.1 de Firebird... para versiones anteriores como la tuya, puedes declarar en la base de datos la UDF que viene con esa distribución, asi:

Código SQL [-]
DECLARE EXTERNAL FUNCTION abs 
    DOUBLE PRECISION
    RETURNS DOUBLE PRECISION BY VALUE
    ENTRY_POINT 'IB_UDF_abs' MODULE_NAME 'ib_udf';

Debes tener en cuenta (Aunque generalmente es asi), que la DLL llamada ib_udf.dll debe estar en la carpeta UDF de Firebird.

RolphyReyes 23-01-2009 20:32:06

Saludos.

Otra solución sería realizar la sentencia dentro de un Stored Procedure y quedaría así:

Código SQL [-]
CREATE OR ALTER PROCEDURE SP_IMPLEMENTA_ABS 
RETURNS (
    PONUMBER CHAR(8),
    CUSTNO INTEGER,
    TOTALVALUE DECIMAL(9,2))
AS
begin
  /* Procedure Text */
  FOR SELECT PO_NUMBER, CUST_NO, TOTAL_VALUE
  FROM SALES
  INTO
   :PONUMBER,
   :CUSTNO,
   :TOTALVALUE
  DO
  BEGIN
    if (:TOTALVALUE < 0) then
     TOTALVALUE = :TOTALVALUE * -1;
    suspend;
  END
end;

Y luego harías:
Código SQL [-]
SELECT PONUMBER, CUSTNO, SUM(TOTALVALUE)
FROM SP_IMPLEMENTA_ABS

Hasta luego.

hecospina 24-01-2009 14:53:38

Hola
Yo trabajo la version 2.0 pero creo (aunque no estoy seguro) que la version 1.5 tenia ya implemantedo el IIf y se podria hacer desde el mismo sql

Código SQL [-]
select fecha, tipo_mov, iif(sum(cantidad)>0,sum(cantidad),-sum(cantidad)) as cantidad from mov_stock
group by fecha, tipo_mov


La franja horaria es GMT +2. Ahora son las 06:32:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi