Jump to content
Fórum Script Brasil
  • 0

Relatório no Gridview


Paulo Jardim

Question

Prezados,

Desde já agredoço ao Xistyle pela força que tem me dado...Quase terminado meu software

Agora preciso apenas de um relatório..

Esse relatório deve ter o seguinte formato no gridview

Data da declaração               valorTotalDeclaracao01              valorTotalDeclaracao02                 valorTotalDeclaracao03           Maior Valor Por linha

01-01-2011                                  2000                                        5000                                                3000                                 5000
02-01-2011                                 5000                                         4000                                                4000                                 5000
03-01-2011                                   0                                               0                                                      0                                   0
TOTAL 7000 9000 7000 Como podem ver devo retornar a data e o valor de cada tipo de declaração além do maior valor por linha e o total por coluna. Além disso outra coisa importante é que preciso, mesmo que não tenha declaração com alguma dtaa do intervalo ela apareça no relatório segue o link para a estrutura do banco de dados Modelagem Banco Para preencher vou utilizar a seguinte stored procedure:
USE [AUDITORIA]
GO
/****** Object:  StoredProcedure [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao]    Script Date: 11/01/2011 11:43:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Proc [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao] (
   @Param_data_inicial Date,
   @Param_data_final Date,
   @Param_cod_loja Int,
   @Param_cod_tipo_declaracao01 Int ,
   @Param_cod_tipo_declaracao02 Int,
   @Param_cod_tipo_declaracao03 Int) 
AS

SELECT Loja.cod_loja, Declaracao.data_declaracao,
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao01) then Itens_Declaracao.valor else 0 end)) valor1, 
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao02) then Itens_Declaracao.valor else 0 end)) valor2,
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao03) then Itens_Declaracao.valor else 0 end)) valor3 



FROM Itens_Declaracao 
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao 
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja 
WHERE Declaracao.data_declaracao  BETWEEN ('@Param_data_inicial') AND ('@Param_data_final') 
AND Declaracao.cod_loja = @Param_cod_loja 
AND Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao01,@Param_cod_tipo_declaracao02,
@Param_cod_tipo_declaracao03) 
GROUP BY Declaracao.data_declaracao, Loja.cod_loja




RETURN

OBS: dentro desse estored procedure ainda não implemente o total por coluna nem o maior valor por linha

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0

Paulo, chegou a trabalhar com tabelas temporárias? Acho que vai ser a melhor solução nesse seu caso. Você iria inserir os dados retornados do SELECT da sua SProcedure e depois tratá-los.

Exemplo:

USE [AUDITORIA]
GO
/****** Object:  StoredProcedure [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao]    Script Date: 11/01/2011 11:43:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Proc [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao] (
   @Param_data_inicial Date,
   @Param_data_final Date,
   @Param_cod_loja Int,
   @Param_cod_tipo_declaracao01 Int ,
   @Param_cod_tipo_declaracao02 Int,
   @Param_cod_tipo_declaracao03 Int)
AS

-- O # indica que é uma tabela temporária, excluida após o processamento da procedure.
CREATE TABLE #resultado (id                           INT PRIMARY KEY IDENTITY(1,1),
                                        cod_loja                  INT,
                                        data_declaracao      DATETIME,
                                        valor1                     NUMERIC(10,2), --Ou outro tipo de dado que você já esteja usando pra valor
                                        valor2                     NUMERIC(10,2),
                                        valor3                     NUMERIC(10,2),
                                        maior_valor_linha    NUMERIC(10,2))

INSERT INTO #resultado (cod_loja, data_declaracao, valor1, valor2, valor3) 

SELECT Loja.cod_loja, Declaracao.data_declaracao,
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao01) then Itens_Declaracao.valor else 0 end)) valor1,
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao02) then Itens_Declaracao.valor else 0 end)) valor2,
SUM( (case when Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao03) then Itens_Declaracao.valor else 0 end)) valor3

FROM Itens_Declaracao
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja
WHERE Declaracao.data_declaracao  BETWEEN ('@Param_data_inicial') AND ('@Param_data_final')
AND Declaracao.cod_loja = @Param_cod_loja
AND Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao01,@Param_cod_tipo_declaracao02,
@Param_cod_tipo_declaracao03)
GROUP BY Declaracao.data_declaracao, Loja.cod_loja

-- Como criamos um campo ID pra nossa tabela temporária, vamos usar um While pra percorrer os registros dela
DECLARE @registroAtual AS INT
DECLARE @registroFinal AS INT
DECLARE @valor1         AS INT
DECLARE @valor2         AS INT
DECLARE @valor3         AS INT

SET @registroAtual = (SELECT MIN(id) FROM #resultado)
SET @registroFinal = (SELECT MAX(id) FROM #resultado)

WHILE @registroAtual <= @registroFinal
BEGIN
    
     --Aqui existem várias formas de fazer as comparações. Vou usar uma mais "legível" e simples
     SET @valor1 = (SELECT valor1 FROM #resultado WHERE id = @registroAtual)
     SET @valor2 = (SELECT valor2 FROM #resultado WHERE id = @registroAtual)
     SET @valor3 = (SELECT valor3 FROM #resultado WHERE id = @registroAtual)

     IF @valor1 > @valor2 AND @valor1 > @valor3
          UPDATE #resultado SET maior_valor_linha = @valor1 WHERE id = @registroAtual

     IF @valor2 > @valor1 AND @valor2 > @valor3
          UPDATE #resultado SET maior_valor_linha = @valor2 WHERE id = @registroAtual

     IF @valor3 > @valor1 AND @valor3 > @valor2
          UPDATE #resultado SET maior_valor_linha = @valor3 WHERE id = @registroAtual

    SET @registroAtual = (SELECT MIN(id) FROM #resultado WHERE id > @registroAtual)

END

-- Depois de percorrer todos os registros, basta exibir os dados
SELECT data_declaracao,
            valor1,
            valor2,
            valor3,
            maior_valor_linha,
            SUM(valor1) AS Total1, --Totais dos valores
            SUM(valor2) AS Total2,
            SUM(valor3) AS Total3
FROM #resultado

PS: não testei o código. Mas acho que deve funcionar :) Qualquer coisa posta ai!

Link to comment
Share on other sites

  • 0

Nossa

Perfeito.

MUito obrigado mesmo Mais uma vez Xistyle

segue aqui o resultado da consulta

Agora só tenho uma dúvida

No caso o total ta por dia, tem como eu colocar esse total no total da coluna? ou eu tenho de fazer isso na aplicação?

Outra dúvida, como faço pra que aparecam as datas que fazem parte do intervalo de data mesmo que não tenham valores associados

EX:

entre 10 e 15 de outubro.

mais digamos que dia 13 não teve declaração,

Tenho como representar esta data vazia no grid?

Link to comment
Share on other sites

  • 0

Hmm perai que tem um erro nesse SELECT. Esse GROUP acho que "confundiu" a pesquisa. Na primeira linha é possível ver que só existe o valor2 (110.345). No Total2 da linha 1, vê se o valor duplicado (220.690), sendo que deveria ser apenas (110.345 + 2.500).

Não é uma boa dica, mas como não existem muitos registros, não irá impactar no desempenho (iria impactar acima de uns 200 mil registros). Tente usar um Union:

SELECT data_declaracao,
            valor1,
            valor2,
            valor3,
            maior_valor_linha
FROM #resultado
UNION ALL
SELECT '' AS data_declaracao,
            SUM(valor1) AS total1,
            SUM(valor2) AS total2,
            SUM(valor3) AS total3,
            '0' AS maior_valor_linha
FROM #resultado
Com relação a data, não tem como fazer isso a não ser testando. Você pode fazer isso durante a execução da sua SProcedure. Coloque o seguinte código no While, antes do "SET @registroAtual = ...":
DECLARE @dataAtual AS DATETIME

SET @dataAtual = (SELECT data_declaracao FROM #resultado WHERE id = @registroAtual)

-- Se não existir, insere um registro vazio
IF NOT EXISTS(SELECT id FROM #resultado WHERE data_declaracao = DATEADD(day, 1, @dataAtual))
    INSERT INTO #resultado (data_declaracao, valor1, valor2, valor3, maior_valor_linha) VALUES (DATEADD(day, 1, @dataAtual), '0.0', '0.0', '0.0', '0.0')

Como será inserida uma nova linha no final, com uma ID mais alta do que a que a data anterior, compensa você retornar o SELECT ordenando por data_declaracao. Exemplo: a linha 3 de ID 3 com data 04/10/11 gerou uma linha vazia 12 de ID 12 com data 05/10/11. Se ordernar por ID, essa data não aparecerá corretamente ordenada.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...