Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 18-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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)
__________________

Responder Con Cita
  #3  
Antiguo 18-01-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
intenta con CASE, te da mas flexibilidad
__________________
self.free;
Responder Con Cita
  #4  
Antiguo 18-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 19-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #6  
Antiguo 19-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 19-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #8  
Antiguo 22-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 22-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.

Última edición por efelix fecha: 22-01-2007 a las 17:39:59.
Responder Con Cita
  #10  
Antiguo 22-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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?
__________________

Responder Con Cita
  #11  
Antiguo 22-01-2007
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 22-01-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
utilizacion trigger dmagui Firebird e Interbase 16 10-06-2005 01:38:55
Utilización de InoSetup Tonio Varios 7 21-11-2004 09:48:39
Utilización webs jymy788 Varios 4 15-11-2004 17:55:16
Utilizacion RichEdit FNADALO Impresión 1 27-09-2004 15:30:20
Utilización de DLL's Enan0 Varios 2 19-05-2004 20:43:13


La franja horaria es GMT +2. Ahora son las 00:39:17.


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
Copyright 1996-2007 Club Delphi