none
Error en procedimiento almacenado complejo RRS feed

  • Pregunta

  • Hola, espero me puedan ayudar con este procedimiento almacenado, lo diseño alguien que ya no trabaja conmigo y no logro encontrar el problema. Este procemiento almacenado tiene un parametro int que en realidad es el año del que quiere uno sacar información, pero al momento de ejecutarlo me manda este error:

    (1 row(s) affected)
    (2 row(s) affected)
    (4 row(s) affected)
    (2 row(s) affected)
    Msg 205, Level 16, State 1, Line 3
    All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
    (1 row(s) affected)

    Espero alguien pueda ayudarme estoy desesperado. 

    Pego el procedimiento almacenado completo, saludos.

    USE [Geodis]
    GO
    /****** Object:  StoredProcedure [dbo].[GeodisFacturacion]    Script Date: 31/03/2015 11:13:52 a.m. ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    --- DROP PROCEDURE GeodisFacturacion 
            
    ALTER PROCEDURE [dbo].[GeodisFacturacion] 
        @AnnoConsulta INTEGER
    AS 

    --DECLARE @AnnoConsulta Integer = 2015; 

    /* PALLET RECIBIDO */
    if object_id('tempdb..#TablaTempRepFacturacion') is not null
    DROP TABLE #TablaTempRepFacturacion

    SELECT ISNULL(DDI.Observacion, '') Tipo, MONTH(TC.MaxFecha) Mes, CONVERT(varchar(50), 
    CONVERT(money, SUM(ISNULL(DDI.CantidadAduana, 0))), 1) CantidadAduana --SUM(ISNULL(DDI.CantidadAduana, 0)) CantidadAduana
    INTO #TablaTempRepFacturacion
    FROM DocumentoIngreso DI
    LEFT JOIN DetalleIngreso DDI ON DI.IDDocumentoIngreso = DDI.IDDocumentoIngreso
    LEFT JOIN (
    SELECT T1.IDDocumentoIngreso, T1.IDDetalleIngreso, MAX(T1.FechaHora) MaxFecha 
    FROM (SELECT * FROM TransConjunto UNION SELECT * FROM HistTransConjunto) T1
    WHERE T1.IDTipoTransaccion = 4 GROUP BY T1.IDDocumentoIngreso, T1.IDDetalleIngreso
    ) TC ON DDI.IDDocumentoIngreso = TC.IDDocumentoIngreso AND DDI.IDDetalleIngreso = TC.IDDetalleIngreso
    WHERE IDTipoIngreso IN (1,2,5) AND DDI.Observacion IN ('PALLET'/*, 'GRANEL'*/)
    AND YEAR(TC.MaxFecha) = @AnnoConsulta
    GROUP BY DDI.Observacion, MONTH(TC.MaxFecha)
    ORDER BY ISNULL(DDI.Observacion, '') ASC, MONTH(TC.MaxFecha) ASC;


    DECLARE @ConsultaReporte VARCHAR(3000) = '', @MesEvaluar INTEGER = 1, @CantidadConsulta VARCHAR(10) = '', @MesConsulta INTEGER = 0; 
    SET @ConsultaReporte = 'SELECT '''' Title, '''' Titulo,  ''ENERO'' M1, ''FEBRERO'' M2, ''MARZO'' M3, ''ABRIL'' M4, ''MAYO'' M5, ''JUNIO'' M6, ''JULIO'' M7, ''AGOSTO'' M8, ''SEPTIEMBRE'' M9, ''OCTUBRE'' M10, ''NOVIEMBRE'' M11, ''DICIEMBRE'' M12, ''0'' Orden' 

    DECLARE MyCursor INSENSITIVE SCROLL CURSOR FOR SELECT Mes, CantidadAduana FROM #TablaTempRepFacturacion; 
    OPEN MyCursor;    
    SET @ConsultaReporte = @ConsultaReporte + ' UNION SELECT ''Pallet Receipt'', ''Pallet Recibido'', '; 
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta;       
    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    WHILE @MesEvaluar < @MesConsulta
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END

    SET @ConsultaReporte = @ConsultaReporte + ' ''' + @CantidadConsulta + ''', '; 
    SET @MesEvaluar = @MesConsulta
    --select @ConsultaReporte;
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta; 
    END; 
    CLOSE MyCursor; 
    DEALLOCATE MyCursor;

    IF @MesEvaluar > 1
    SET @MesEvaluar = @MesEvaluar + 1

    WHILE @MesEvaluar <= 12
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END
    SET @ConsultaReporte = @ConsultaReporte + ' ''1'' ' ; 

    /* CAJA RECIBIDA */
    if object_id('tempdb..#TablaTempRepFacturacion2') is not null
    DROP TABLE #TablaTempRepFacturacion2

    --*************************************************
    SELECT ISNULL(DDI.Observacion, '') Tipo, MONTH(TC.MaxFecha) Mes, 
    CONVERT(varchar(50), CONVERT(money, SUM(ISNULL(DDI.CantidadAduana, 0))), 1) CantidadAduana --SUM(ISNULL(DDI.CantidadAduana, 0)) CantidadAduana
    INTO #TablaTempRepFacturacion2
    FROM DocumentoIngreso DI
    LEFT JOIN DetalleIngreso DDI ON DI.IDDocumentoIngreso = DDI.IDDocumentoIngreso
    LEFT JOIN (
    SELECT T1.IDDocumentoIngreso, T1.IDDetalleIngreso, MAX(T1.FechaHora) MaxFecha 
    FROM (SELECT * FROM TransConjunto UNION SELECT * FROM HistTransConjunto) T1
    WHERE T1.IDTipoTransaccion = 4 GROUP BY T1.IDDocumentoIngreso, T1.IDDetalleIngreso
    ) TC ON DDI.IDDocumentoIngreso = TC.IDDocumentoIngreso AND DDI.IDDetalleIngreso = TC.IDDetalleIngreso
    WHERE IDTipoIngreso IN (1,2,5) AND DDI.Observacion IN (/*'PALLET',*/ 'GRANEL')
    AND YEAR(TC.MaxFecha) = @AnnoConsulta
    GROUP BY DDI.Observacion, MONTH(TC.MaxFecha)
    ORDER BY ISNULL(DDI.Observacion, '') ASC, MONTH(TC.MaxFecha) ASC;

    SET @MesEvaluar = 1;
    SET @CantidadConsulta = '';
    SET @MesConsulta = 0; 

    DECLARE MyCursor INSENSITIVE SCROLL CURSOR FOR SELECT Mes, CantidadAduana FROM #TablaTempRepFacturacion2; 
    OPEN MyCursor;    
    SET @ConsultaReporte = @ConsultaReporte + ' UNION SELECT ''Case Receipt'', ''Caja Recibida'', '; 
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta;       
    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    WHILE @MesEvaluar < @MesConsulta
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END

    SET @ConsultaReporte = @ConsultaReporte + ' ''' + @CantidadConsulta + ''', '; 
    SET @MesEvaluar = @MesConsulta
    --select @ConsultaReporte;
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta; 
    END; 
    CLOSE MyCursor; 
    DEALLOCATE MyCursor;

    IF @MesEvaluar > 1
    SET @MesEvaluar = @MesEvaluar + 1

    WHILE @MesEvaluar <= 12
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END
    SET @ConsultaReporte = @ConsultaReporte + ' ''2'' ' ; 

    /* LIBRO RECHAZADO */
    if object_id('tempdb..#TablaTempRepFacturacion3') is not null
    DROP TABLE #TablaTempRepFacturacion3

    SELECT ISNULL(DDI.Observacion, '') Tipo, MONTH(TC.MaxFecha) Mes, CONVERT(varchar(50), CONVERT(money, SUM(ISNULL(DDI.CantidadAduana, 0))), 1) CantidadAduana --SUM(ISNULL(DDI.CantidadAduana, 0)) CantidadAduana
    INTO #TablaTempRepFacturacion3
    FROM DocumentoIngreso DI
    LEFT JOIN DetalleIngreso DDI ON DI.IDDocumentoIngreso = DDI.IDDocumentoIngreso
    LEFT JOIN (
    SELECT T1.IDDocumentoIngreso, T1.IDDetalleIngreso, MAX(T1.FechaHora) MaxFecha 
    FROM (SELECT * FROM TransConjunto UNION SELECT * FROM HistTransConjunto) T1
    WHERE T1.IDTipoTransaccion = 4 GROUP BY T1.IDDocumentoIngreso, T1.IDDetalleIngreso
    ) TC ON DDI.IDDocumentoIngreso = TC.IDDocumentoIngreso AND DDI.IDDetalleIngreso = TC.IDDetalleIngreso
    WHERE IDTipoIngreso IN (3) 
    AND YEAR(TC.MaxFecha) = @AnnoConsulta
    GROUP BY DDI.Observacion, MONTH(TC.MaxFecha)
    ORDER BY ISNULL(DDI.Observacion, '') ASC, MONTH(TC.MaxFecha) ASC;

    SET @MesEvaluar = 1;
    SET @CantidadConsulta = '';
    SET @MesConsulta = 0; 

    DECLARE MyCursor INSENSITIVE SCROLL CURSOR FOR SELECT Mes, CantidadAduana FROM #TablaTempRepFacturacion3; 
    OPEN MyCursor;    
    SET @ConsultaReporte = @ConsultaReporte + ' UNION SELECT ''Individual Books Returns'', ''Libro Rechazado'', '; 
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta;       
    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    WHILE @MesEvaluar < @MesConsulta
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END

    SET @ConsultaReporte = @ConsultaReporte + ' ''' + @CantidadConsulta + ''', '; 
    SET @MesEvaluar = @MesConsulta
    --select @ConsultaReporte;
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta; 
    END; 
    CLOSE MyCursor; 
    DEALLOCATE MyCursor;

    IF @MesEvaluar > 1
    SET @MesEvaluar = @MesEvaluar + 1

    WHILE @MesEvaluar <= 12
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END
    SET @ConsultaReporte = @ConsultaReporte + ' ''3'' ' ; 

    /* SURTIDO */
    if object_id('tempdb..#TablaTempRepFacturacion5') is not null
    DROP TABLE #TablaTempRepFacturacion5

    SELECT '' Tipo, TEMP.Mes, CONVERT(varchar(50), CONVERT(money, SUM(TEMP.CantidadSurtida)), 1) Suma --SUM(TEMP.CantidadSurtida) Suma
    INTO #TablaTempRepFacturacion5
    FROM (
    SELECT DS.IDDocumentoSalida, DS.IDDetalleSalida, DS.IDSubDetalleSalida, DS.CantidadSurtida, MONTH(MAX(RS.FechaHoraSurtido)) Mes
    FROM DetalleSalida DS 
    LEFT JOIN DetalleEmbarque DE ON DE.IDEmbarque = DS.IDEmbarque AND DE.IDDetalleEmbarque = DS.IDDetalleEmbarque
    LEFT JOIN (SELECT * FROM RegistroSurtido UNION SELECT * FROM HistRegistroSurtido) RS ON DS.IDDocumentoSalida = RS.IDDocumentoSalida AND DS.IDDetalleSalida = RS.IDDetalleSalida AND DS.IDSubDetalleSalida = RS.IDSubDetalleSalida
    WHERE (DE.IDEstadoEmbarque = 7 OR RS.IDEstadoRegistroSurtido = 7)
    AND YEAR(RS.FechaHoraSurtido) = @AnnoConsulta 
    GROUP BY DS.IDDocumentoSalida, DS.IDDetalleSalida, DS.IDSubDetalleSalida, DS.CantidadSurtida
    ) TEMP
    GROUP BY TEMP.Mes

    SET @MesEvaluar = 1;
    SET @CantidadConsulta = '';
    SET @MesConsulta = 0; 

    DECLARE MyCursor INSENSITIVE SCROLL CURSOR FOR SELECT Mes, Suma FROM #TablaTempRepFacturacion5; 
    OPEN MyCursor;    
    SET @ConsultaReporte = @ConsultaReporte + ' UNION SELECT ''Total of Assorted Parts'', ''Total de Piezas Surtidas'', '; 
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta;       
    WHILE @@FETCH_STATUS = 0  
    BEGIN 

    WHILE @MesEvaluar < @MesConsulta
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END

    SET @ConsultaReporte = @ConsultaReporte + ' ''' + @CantidadConsulta + ''', '; 
    SET @MesEvaluar = @MesConsulta
    --select @ConsultaReporte;
    FETCH NEXT FROM MyCursor INTO @MesConsulta, @CantidadConsulta; 
    END; 
    CLOSE MyCursor; 
    DEALLOCATE MyCursor;

    IF @MesEvaluar > 1
    SET @MesEvaluar = @MesEvaluar + 1

    WHILE @MesEvaluar <= 12
    BEGIN
    SET @ConsultaReporte = @ConsultaReporte + ' ''' + '0.00' + ''', '; 
    SET @MesEvaluar = @MesEvaluar +1
    END
    SET @ConsultaReporte = @ConsultaReporte + ' ''5'' ' ; 

    SET @ConsultaReporte = 'SELECT Title, Titulo, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12 FROM (' + @ConsultaReporte + ') TEMP ORDER BY Orden'; 
    EXEC(@ConsultaReporte);

    martes, 31 de marzo de 2015 17:16

Respuestas

  • hola en tu consulta tienes

    (SELECT * FROM TransConjunto UNION SELECT * FROM HistTransConjunto)

    revisa que TransConjunto y HistTransConjunto tengan la mismas cantidad de columnas y tipos o simplemente remplaza los * solo por las columnas que necesitas que son IDDocumentoIngreso,IDDetalleIngreso,FechaHora,IDTipoTransaccion 

    despues coloca un print antes de hacer el EXEC de la siguiente manera

    PRINT @ConsultaReporte 
    EXEC(@ConsultaReporte);
    y revisa que los SELECTs unidos por UNION en el PRINT tengan la misma cantidad de columnas


    Juan Pablo Burgos

    martes, 31 de marzo de 2015 18:34

Todas las respuestas

  • Apeiron Store,

    Como estas? Tu problema viene por el lado de los Union(basicamente el error viene porque el Union esta juntando mas columnas de un lado que de otro) .... revisa todas las consultas donde se utilice ya que alguna de esas (no se cual es porque hay mucho select *)  se ve que se agrego alguna columna nueva (x eso una buena practica de programacion es no incluir select *) y esto hace que no funcione.

    Espero te sirva!

    saludos!

    martes, 31 de marzo de 2015 17:23
  • hola en tu consulta tienes

    (SELECT * FROM TransConjunto UNION SELECT * FROM HistTransConjunto)

    revisa que TransConjunto y HistTransConjunto tengan la mismas cantidad de columnas y tipos o simplemente remplaza los * solo por las columnas que necesitas que son IDDocumentoIngreso,IDDetalleIngreso,FechaHora,IDTipoTransaccion 

    despues coloca un print antes de hacer el EXEC de la siguiente manera

    PRINT @ConsultaReporte 
    EXEC(@ConsultaReporte);
    y revisa que los SELECTs unidos por UNION en el PRINT tengan la misma cantidad de columnas


    Juan Pablo Burgos

    martes, 31 de marzo de 2015 18:34
  • voy a hacer el cambio que me recomiendas porque esas dos tablas que mencionas tienen un numero de diferente de columas. Lo hago de inmediato y te aviso, muchas gracias.
    martes, 31 de marzo de 2015 21:56