Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Utilización del iif (https://www.clubdelphi.com/foros/showthread.php?t=39383)

efelix 18-01-2007 15:41:01

Utilización del iif
 
Hola a tdos, muchos saludos. Bueno no se si este debe ser el titulo para este hilo, pero el caso es que el problema creo que está en está función sql, eso creo yo. El problema es el siguiente. Estoy tratando de construir una vista en sql server 2000 de la siguiente forma:
Código SQL [-]
SELECT     IdFactura, Descripcion, Importe, Aplicada, FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, iff (DATEDIFF(day,FechaRecepcion,GETDATE())>30,Saldo,0) AS MA30dias
FROM         dbo.Facturas
WHERE     (Aplicada = 0)
Cuando ejcuto la vista me genera el siguiente error:
Error in list of function arguments: '>' not recognized.
Unable to parse query text.
Ya no se que hacer he leído acerca de esta función en la ayuda y no se donde pueda estar el problema. Agradecería cualquier ayuda. Muchas gracias.

ContraVeneno 18-01-2007 17:06:15

Si "Saldo" es otro campo, esta raro, pero si lo que quieres es el mismo saldo que estas calculando, la función debería ser así:
Código SQL [-]
select IdFactura, Descripcion, Importe, Aplicada, FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo,
case when DATEDIFF(day, FechaRecepcion, GETDATE()) > 30 then DATEDIFF(day, FechaRecepcion, GETDATE()) else 0 end MA30dias
from Facturas
where (Aplicada = 0)

droguerman 18-01-2007 19:43:24

intenta con CASE, te da mas flexibilidad

efelix 18-01-2007 23:22:42

ContraVeneno muchas gracias por tu ayuda al igual que a droguerman. Esto fue lo que hice fue lo siguiente:
Código SQL [-]
CREATE PROCEDURE spPruebaIIf 

AS
SELECT     Proveedores.IdProveedor, Proveedores.NombreProveedor, Facturas.IdFactura, Facturas.Descripcion, Facturas.Importe, Facturas.FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, CASE WHEN DATEDIFF(day, 
                      FechaRecepcion, GETDATE()) > 0  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 30 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END MENOSDE30dias,
                    CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 31  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 60 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END ENTRE3060dias,
                    CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 61  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 90 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END ENTRE6090dias,
                   CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN DATEDIFF(day, FechaRecepcion, GETDATE()) ELSE 0 END MASDE90dias 
FROM         Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE     (Aplicada = 0)
GO
A lo mejor está un poco desorganizado y hay una mejor forma de usar el case. En caso de que así sea por favor les agradecería su colaboración. Muchas Gracias.

ContraVeneno 19-01-2007 00:13:44

Bueno, no tienes que declarar el case en cada línea, solo hacer falta hacerlo una vez, ademas, como estas comparando un rango, lo mejor sería utilizar un "between":
Código SQL [-]
CASE WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) between 31 AND 60 THEN 'Entre 30 y 60'
WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) between 61 AND 90 THEN 'Entre 61 y 90'
WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN 'Mayor 91'
ELSE 0 END Diffdias

a menos que quieras tenerlos en 3 campos separados en cuyo caso si estaría bien hacer 3 cases diferentes.
De cualquier manera creo que te serviría hacerlo en una sola columna y utilizar una agrupación u ordenarlos por ese campo. En fin, la decisión es tuya. :D

efelix 19-01-2007 15:35:22

Saludos ContraVeneno muchas gracias por tu aclaración, pero tengo el siguiente problema. Tengo una tabla denominada facturas que es a partir de la cual que construyo esta consulta. Esta tabla tiene entre otros los campos idfactura, fecharecepcion, importe, entre otros. Que persigo con la consulta que esta arriba: que me devuelva el importe de las facturas que están comprendidos entre los rangos de edades que me devuelve la consulta. Para ser mas específico deseo que me de para entre 30 y 60 días el importe de las facturas que tienen esa edad. Para luego utilizar esta consulta pra construir un Reporte en delphi 7. Esto no se como hacerlo, agradecería cualquier ayuda. Muchas gracias. Disculpa la molestia.

ContraVeneno 19-01-2007 20:12:52

Pues yo lo haría a partir de esa misma consulta agrupada por el campo DiffDias (pense que eran días, pero ya veo que son edades). En la banda de agrupación le especifico que agrupe por este campo (el del case) y listo. Me pondrá primero todos los de menores a 30, luego los que estan entre 30 y 60 y así sucesivamente.

Para el total, pues en el GroupFooter pongo un TQRExpr con la suma del campo importe.

¿Dudas? Consulta la ayuda de Delphi, o puedes preguntar en este mismo hilo y trataré de darte más pistas. :D

efelix 22-01-2007 15:42:18

Saludos, ContraVeneno muchas gracias a ti y a droguerman por su a yuda, ya resolví el problema de la siguiente forma:
Hola sinalocarlos, muchas gracias por tu ayuda. Te cuento que ya resolví el probelma y logré lo que quería de la siguiente forma:
Código SQL [-]
CREATE PROCEDURE spAntiguedad 

AS
SELECT     Proveedores.IdProveedor, Proveedores.NombreProveedor, Facturas.IdFactura, Facturas.Descripcion, Facturas.Importe, Facturas.FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, 
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 0  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) <= 30 THEN Facturas.Importe ELSE 0 END MENOSDE30dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE ()) >= 31  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) <= 60 THEN Facturas.Importe  ELSE 0 END ENTRE3060dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) >= 61  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) <= 90 THEN Facturas.Importe ELSE 0 END ENTRE6090dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN Facturas.Importe ELSE 0 END MASDE90dias 
FROM         Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE     (Aplicada = 0)
GO
Es decir ahora obtengo el importe por cada rango de edad que establecí, que era lo que me faltaba, el problema estaba cuando yo ponía then DATEDIFF(day,FechaRecepcion, GETDATE()) en vez de poner el campo Importe.
Gracias.
Creo que la función iif no se puede utilizar en una vista pues la misma corresponde a Analysis Services, por eso creo que me salía el error en el argumento '>'.
Les reitero las gracias.

efelix 22-01-2007 17:31:48

Hola ContraVeneno, voy a aprovechar tu sugerencia, sobre la ayuda que me prometiste en uno de tus correos sobre el tema. El siguiente procedimiento almacenado me devuelve los resulyados que yo deseo:
Código SQL [-]
CREATE PROCEDURE spAntiguedad 

AS
SELECT     Proveedores.IdProveedor, Proveedores.NombreProveedor, Facturas.IdFactura, Facturas.Descripcion, Facturas.Importe, Facturas.FechaRecepcion, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Saldo, 
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 0  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 31 THEN Facturas.Importe ELSE 0 END MENOSDE30dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE ()) > 30  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 61 THEN Facturas.Importe  ELSE 0 END ENTRE3060dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 60  AND  DATEDIFF(day, FechaRecepcion, GETDATE()) < 91 THEN Facturas.Importe ELSE 0 END ENTRE6090dias,
                    CASE
                        WHEN DATEDIFF(day, FechaRecepcion, GETDATE()) > 91 THEN Facturas.Importe ELSE 0 END MASDE90dias 
FROM         Proveedores INNER JOIN Facturas ON Proveedores.IdProveedor=Facturas.IdProveedor
WHERE     (Aplicada = 0)
GO
Este procedimiento me devuelve los resultados que yo espero. Ahora voy al delphi y creo un nuevo reporte, agrego los componentes de la paleta ADO:
adoconnection, adostoredprocedure y un datasource. Agrego un qrexpression donde pongo la siguiente expresión: sum(adospantiguedad.Entre3060dias), y así lo hago con cada uno delos campos que me genera el ado stored procedure. Cuando le doy un preview no me pone nada, solo 0 en cada uno de los campos. A que se deberá esto?. Gracias.

ContraVeneno 22-01-2007 17:45:02

Cita:

Empezado por efelix
Hola ContraVeneno, voy a aprovechar tu sugerencia, sobre la ayuda que me prometiste en uno de tus correos sobre el tema...

¿correos o mensajes? Por que hasta donde yo recuerdo, nunca te he mandado ningún correo :P

Cita:

Empezado por efelix
Agrego un qrexpression donde pongo la siguiente expresión: sum(adospantiguedad.Entre3060dias), y así lo hago con cada uno delos campos que me genera el ado stored procedure. Cuando le doy un preview no me pone nada, solo 0 en cada uno de los campos. A que se deberá esto?. Gracias.

Tu reporte, las bandas y el TQRExpr, ¿estan debidamente conectados a tu dataset?

efelix 22-01-2007 19:04:53

Disculpa ContraVeneno cuando dije esto fua haciendo alusión al hecho de que cundo me registré en el foro, elegí la opción de que las respuestas a los hilos que publicara me llegaran vía correo electrónico. Si creo que todo está bien, te digo como están establecidas las propiedades. La propiedad connection del ado estored prcedure apunta al ado connection el cual tiene su propiedad connected establecida a true, el data source tiene su propiedad dataset establecida el ado stored procedure, el ado stored procedure tiene la propiedad active establecida a true. Creo que estás son las mas significativas en cuanto a lo que me dices. No se porque no funciona. Gracias.

ContraVeneno 22-01-2007 19:13:42

Me refería a los componentes del TQReport. Ya que si la consulta en tu programa te muestra todos los resultados como deseas, pero el reporte no lo hace, entonces el problema esta en el reporte y la manera en que este está conectado a tu dataset. Mi pregunta entonces, hiba encaminada a saber si los componentes de tu reporte (el reporte, las bandas y las expresiones) estan debidamente enlazados a tu dataset.


La franja horaria es GMT +2. Ahora son las 23:12:32.

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