Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con Procedimiento Almacenado

Estas en el tema de Problema con Procedimiento Almacenado en el foro de SQL Server en Foros del Web. Estimados, muy buenas tardes. De momento estoy generando un SP el cual me debe arrojar datos a modo de alimentacion de un reporte, esto me ...
  #1 (permalink)  
Antiguo 19/10/2011, 15:11
 
Fecha de Ingreso: agosto-2009
Mensajes: 45
Antigüedad: 14 años, 8 meses
Puntos: 2
Problema con Procedimiento Almacenado

Estimados, muy buenas tardes.

De momento estoy generando un SP el cual me debe arrojar datos a modo de alimentacion de un reporte, esto me funciona perfectamente, salvo por un pequeño problema.

El SP es el siguiente:

Código:
CREATE PROCEDURE [dbo].[VCPP_PAPEL_CLIENTE]
@ANIO1 int,
@ANIO2 int,
@PAPEL CHAR(1),
@CLIENTE varchar(80)

AS

declare @TIPO CHAR(3), @FAC_Num int,  @FAC_CodCliente nvarchar(50), @CL_razonSocial nvarchar(50), @FAC_FechaEmision datetime, @FAC_TotalNeto int, @NC_TotalNeto int


CREATE TABLE #VentasNetasMes (FAC_Num INT, 
                    FAC_FechaEmision datetime, 
                    FAC_TotalNeto int)

DECLARE C_facturas  CURSOR FOR 

    select     'FAC' ,
        FAC_Num, 
        FAC_FechaEmision, 
        FAC_TotalNeto = isnull((select sum(isnull(ITFAC_Neto, 0)) from [FACTURA ITEM] where FAC_Num = ITFAC_Num),0)
--        ISNULL(FAC_TotalNeto,0)
    from [factura] 
    where FAC_FechaEmision is not null AND EXISTS(SELECT * FROM [FACTURA ITEM],[ORDEN DE TRABAJO ITEM]  
                                                    WHERE FAC_NUM = ITFAC_NUM AND ITFAC_NUMOT = OTD_NUM AND ITFAC_IDDETALLE = OTD_IDDETALLE AND OTD_PAPEL = @PAPEL)
    AND YEAR(FAC_FechaEmision)  between @ANIO1 and @ANIO2
    AND FAC_CodCliente = @CLIENTE
    UNION ALL
    select     'NC',
        NC_Num, 
        NC_FechaEmision, 
        NC_TotalNeto = isnull((select sum(isnull(NCIT_Neto, 0)) from [NOTA CREDITO ITEM] Where NC_Num = NCIT_Num ),0)
--        ISNULL(NC_TotalNeto,0)
    from [NOTA CREDITO] 
    where NC_FechaEmision is not null AND EXISTS(SELECT * FROM [NOTA CREDITO ITEM],[ORDEN DE TRABAJO ITEM]  WHERE NC_NUM = NCIT_NUM AND NCIT_NUMOT = OTD_NUM AND NCIT_IDDETALLE = OTD_IDDETALLE AND OTD_PAPEL = @PAPEL)
    AND YEAR(NC_FechaEmision)  between @ANIO1 and @ANIO2
    AND NC_CodCliente = @CLIENTE
OPEN C_facturas

FETCH NEXT FROM C_facturas
INTO @TIPO,  @FAC_Num , @FAC_FechaEmision, @FAC_TotalNeto

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @TIPO = 'NC'
        SELECT @FAC_TotalNeto = @FAC_TotalNeto *(-1)

   INSERT INTO #VentasNetasMes (FAC_Num, FAC_FechaEmision, FAC_TotalNeto)VALUES(@FAC_Num, @FAC_FechaEmision, @FAC_TotalNeto)

   FETCH NEXT FROM C_facturas
   INTO @TIPO, @FAC_Num , @FAC_FechaEmision, @FAC_TotalNeto
END


CLOSE C_facturas
DEALLOCATE C_facturas

select ano=datepart(yyyy, FAC_FechaEmision), 
    mes=datepart(mm, FAC_FechaEmision), 
    total = sum(FAC_TotalNeto) 
from #VentasNetasMes
group by datepart(yyyy, FAC_FechaEmision), datepart(mm, FAC_FechaEmision)
order by 1,2
GO
Los datos son arrojados correctamente al momento de generar la siguiente consulta desde la aplicación:

Código:
Exec VCPP_PAPEL_CLIENTE '2010', '2011', 'R', '96861750-8'
El SP lo trabajo con cursores. Necesito averiguar la forma de que cuando no existan datos en un determinado periodo me arroje como valor 0.
Pues como aun no soluciono esto me genera un reporte incompleto debido a que falta lo que indiqué anteriormente.


Agradezco cualquier ayuda de uds.

Saludos.

Última edición por Rro237; 19/10/2011 a las 15:17
  #2 (permalink)  
Antiguo 19/10/2011, 17:37
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: Problema con Procedimiento Almacenado

Necesitas crear una tabla adicional (temporal, permanente o como retorno de una función) que contenga todos los períodos posibles y usarla en un outer join para generar los registros que faltan. Un poco simplificado, el ejemplo sería algo así:

Código:
create table facturas (id numeric(8), fecha_factura datetime)
insert into facturas values (1,'20110101')
--no hay facturas con fecha 20110102
insert into facturas values (2,'20110103')
insert into facturas values (3,'20110104')
go

create table periodos (fecha datetime)
insert into periodos values ('20110101')
insert into periodos values ('20110102')
insert into periodos values ('20110103')
insert into periodos values ('20110104')
go

select 
 isnull(facturas.id,0) factura, 
 facturas.fecha_factura,
 periodos.fecha periodo
from periodos 
 left join facturas on facturas.fecha_factura = periodos.fecha
go

--resultado de la consulta

factura fecha_factura periodo
1 2011-01-01 2011-01-01
0 NULL 2011-01-02 --período con 0 si no hay factura 
2 2011-01-03 2011-01-03
3 2011-01-04 2011-01-04
Saludos

Etiquetas: fecha, procedimiento, procedure, select, almacenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:49.