none
Criar Relatório dinamicamente RRS feed

  • Pergunta

  • Boa tarde, comunidade msdn


    Ultimamente, estive com um problema para criar uma consulta utilizando a cláusula PIVOT do SQL Server 2005, depois de algum tempo tentando, obtive ajuda do Gustavo Maia aqui no fórum, e consegui resolver meu problema graças ao exemplo que ele passou.

    Transformei essa consulta em uma procedure para atender minhas necessidades, já que, vou utiliza-la em um relatório gerado no VB.NET 2005.
    Meu problema agora é, como a consulta é dinâmica, os campos do relatório também necessitam de ser dinâmicos, por exemplo:

    Minha consulta traz uma relação de 6 meses, eu preciso lançar 6 campos no relatório, assim como essa consulta poderia resultar em 7 meses.....tendo que gerar 7 campos e etc.



    É possível ter essa dinâmica para criar relatórios?


    Estou utilizando o ReportViewer.



    Desde já, 
    Obrigado


    Paulo Eduardo Bueno
    quarta-feira, 1 de outubro de 2008 19:51

Respostas

  • E ai Paulo tudo bem?

     

    Neste caso basta fazer o designer do relatório utilizando o controle Matrix existente no Editor do Reportview (Toolbar)

     

    Como fazer:

    http://www.gotreportviewer.com/matrices/index.html

     

    Além disso, o SQL pode ser uma listagem simples (sem utilizar o PIVOT do SQL Server), o controle Matrix já possui essa "funcionalidade".

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

    quarta-feira, 1 de outubro de 2008 20:08
    Moderador

Todas as Respostas

  • E ai Paulo tudo bem?

     

    Neste caso basta fazer o designer do relatório utilizando o controle Matrix existente no Editor do Reportview (Toolbar)

     

    Como fazer:

    http://www.gotreportviewer.com/matrices/index.html

     

    Além disso, o SQL pode ser uma listagem simples (sem utilizar o PIVOT do SQL Server), o controle Matrix já possui essa "funcionalidade".

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

    quarta-feira, 1 de outubro de 2008 20:08
    Moderador
  •  

    Cara, estou tentando usar o Matrix aqui mas não estou conseguindo, não faço idéia do que preciso fazer para a Coluna dos meses ser dinâmica...


    eu tenho a seguinte View e a seguinte Procedure abaixo:



    Code Snippet

    Create procedure P_REPORT_INS_8

    @DataMenor SMALLDATETIME,

    @DataMaior SMALLDATETIME

    as

    DECLARE @menorPeriodo SMALLDATETIME, @maiorPeriodo SMALLDATETIME,

    @Periodos VARCHAR(500), @cmdSQL VARCHAR(1000)

    SELECT @menorPeriodo = @DATAMENOR, @maiorPeriodo = @DATAMAIOR,

    @Periodos = '' FROM movimento

    SET @cmdSQL = 'SELECT juncao AS Juncao, ?

    FROM

    (SELECT juncao, insumo, Periodo, quantidade

    FROM vReports where insumo = 8 )

    AS TBO

    PIVOT

    (sum(quantidade) FOR Periodo IN (?)) AS TPVT

    ORDER BY juncao '

    SET @menorPeriodo = DATEADD(D,-DAY(@menorPeriodo)+1,@menorPeriodo)

    SET @maiorPeriodo = DATEADD(D,-DAY(@maiorPeriodo)+1,@maiorPeriodo)

    WHILE @menorPeriodo <= @maiorPeriodo

    BEGIN

    SET @Periodos = @Periodos + '[' + RIGHT(CONVERT(CHAR(10),@menorPeriodo,103),7) + '],'

    SET @menorPeriodo = DATEADD(M,1,@menorPeriodo)

    END

    SET @Periodos = LEFT(@Periodos,LEN(@Periodos)-1)

    SET @cmdSQL = REPLACE(@cmdSQL,'?',@Periodos)

     

    EXEC (@cmdSQL)

     

     

    #######################    VIEW   ##################################

     

    CREATE VIEW vReports (juncao, insumo, periodo, quantidade)

    AS

    SELECT

    juncao, insumo, RIGHT(CONVERT(CHAR(10),data,103),7), quantidade/500

    FROM MOVIMENTO

     

     

     

     

     

    Os Tipos dados na tabela Movimento são

     

    Junção - Inteiro

    Insumo - Inteiro - FK

    Data - SmallDateTime

    Quantidade - Inteiro

     

     

    Quando eu executo minha procedure, obtenho o seguinte resultado por exemplo

     

    exec P_REPORT_INS_8 '2008-01-01', '2008-01-05'

     

     

    As colunas dos respectivos meses são geradas dinâmicamente pelo operador PIVOT, quando ele faz o loop para gera-las e substituir o caracter "?" pela nova coluna

     

    Não consegui implementar isso no ReportViewer. Eu gostaria de colocar essa procedure como DataSource do Relatório...ou, se for mais simples, como poderia especificar esse tipo de coluna no ReportViewer? Teria algum exemplo básico, não consegui utilizar os do link passado

     

     

     

     

    Desde já,

    Obrigado!!

    quinta-feira, 2 de outubro de 2008 14:31
  • Paulo,

     

    Eu terminei o 3 webcast sobre relatórios com Crystal Reports e ReportView e tenho um exemplo usando o controle Matrix no ReportView.

     

     

    O Vídeo será publicado no Media Center para Download. Enguanto isso, envia um e-mail para laercio.freitas@yahoo.com.br, Que eu mando apenas a parte do vídeo que mostra como criar um reportview com utilizando o controle Matrix (O exemplo é com os dados da Bolsa de Valores, ficou bem legal).

     

    Fico no aguardo!

     

    []'s

     

    Laércio.

     

     

     

    sexta-feira, 3 de outubro de 2008 20:30
    Moderador
  • Opa Laércio, Bom dia 


    Desculpe a demora para dar o feedback, tive que resolver uns problemas urgentes por aqui e ontem fui participar do S2B, então não tive nem tempo de te postar aqui,


    Então cara, já enviei o e-mail pra você. qualquer coisa se não achar ele na sua caixa, fico grato se puder enviar o exemplo pra mim:

    duda_hiei@hotmail.com




    Desde já,
    Grato

    Paulo Eduardo Bueno
    quarta-feira, 8 de outubro de 2008 11:51
  •  Laercio da Silva Freitas wrote:

    Paulo,

     

    Eu terminei o 3 webcast sobre relatórios com Crystal Reports e ReportView e tenho um exemplo usando o controle Matrix no ReportView.

     

     

    O Vídeo será publicado no Media Center para Download. Enguanto isso, envia um e-mail para laercio.freitas@yahoo.com.br, Que eu mando apenas a parte do vídeo que mostra como criar um reportview com utilizando o controle Matrix (O exemplo é com os dados da Bolsa de Valores, ficou bem legal).

     

    Fico no aguardo!

     

    []'s

     

    Laércio.

     

     

     


    Fala Laércio, boa tarde


    Vou enviar outro e-mail pra você, qualquer coisa se não chegar, quanto você tiver um tempo, fico extremamente grato se puder me enviar o WebCast, estou muito curioso.

    duda_hiei@hotmail.com

    Ainda não consegui resolver o meu problema, fiz um "select *" na table, depois tentei usar o Matrix mas não consegui, você teria algum outro exemplo para mostrar?


    Desde já,

    Obrigado !!
    segunda-feira, 13 de outubro de 2008 18:19
  • Paulo,

     

    Desculpe, acabei de ver o seu post! hoje a noite eu mando a parte do vídeo onde eu mostro como utilizar o controle Matrix no ReportView.

     

    Essa semana tem o evento Tech.ed 2008 em São Paulo e por isso ainda não foi publicado pela equipe do MSDN no Media Center.

     

    [ ]'s

     

    Laércio.

     

     

    segunda-feira, 13 de outubro de 2008 18:36
    Moderador
  • Opa

    então cara, tentei aqui de diversas formas criar o relatório mas não consegui mesmo...como por enquanto o vídeo não está disponível, eu gostaria de saber se é possivel fazer algo do similar ao Matrix, porém utilizando minha procedue criada.




    Desde já,

    Obrigado!



    Paulo Eduardo Bueno

    quarta-feira, 22 de outubro de 2008 10:46
  • Consegui criar um relatório meio absurdo pelo Matrix, mas ainda assim não consegui chegar no que eu quero, mas, uma coisa que pude reparar, não sei se é porque esse relatório que eu estou fazendo é pesado, mas, o Report demora MUITO para sair, além de deixar a máquina travada, travada mesmo...



    O ReportVIewer é mais lento que o Crystal ?

    O Matrix, por ser dinâmico é um componente muito lento ou é a minha consulta gerada nele que está assim? Lembrando que está uma consulta muito mal elaborada mesmo, não consegui criar um range de 6 meses, então ele esta trazendo todos os meses (acho que do mês 06/07 ao mês 08/08)


    é melhor utilizar o Matrix ou tentar fazer de alguma forma o relatório dinâmico através da procedure? Qual o método mais rápido?



    Desde já,
    Obrigado!


    quarta-feira, 29 de outubro de 2008 11:19
  • Laércio,

    Gostaria de saber se já está disponível o seu WebCast que estava sendo planejado para lançar no site do msdn, procurei ele por lá e nada.

    Ainda estou tendo problemas com o Matrix, gostaria de saber quando será disponibilizado o WebCast para ver se com ele consigo resolver mais essa tarefa !


    Não existe nenhuma outra forma de criar as colunas do ReportViewer dinâmicas sem utilizar o componente Matrix?

    Desde já,
    Obrigado
    quarta-feira, 5 de novembro de 2008 11:58
  • Olá Paulo,

     

    O vídeo foi publicado ontem no site do MSDN Media Center. Ainda está faltando a publicação das demos utilizadas no vídeo.

     

    http://www.msdnbrasil.com.br/microsoft.mediacenter/default.aspx

     

    Estou aguardando a publicação desse item para fazer a divulgação no fórum MSDN.

     

     

    [ ] 's

     

    Laércio.

     

     

    quarta-feira, 5 de novembro de 2008 12:28
    Moderador
  • Fala Laércio? Beleza cara?



    Gostei muito do WebCast! Ta muito bem explicado, ficou muito legal
    porém, ainda não consegui usar o Matrix aqui comigo...a minha diferença deste seu relatório apresentado é que eu preciso formatar primeiro o mês e agrupa-lo


    Vou mostrar as imagens e explicando:



    Primeiramente essa é uma consulta select * da minha tabela de movimento, a mesma que eu preciso "pivotear" ou montar a consulta pelo Matrix. Repare que eu tenho um registro para cada movimento, ou seja, a mesma junção se repete varias vezes, porém com datas, insumos e quantidades diferentes. 

    Para a minha necessidade, eu precisaria exibir estes dados da seguinte forma:




    Então criei minha procedura com a ajuda do Gustavo Maia aqui do fórum, ela soma a coluna quantidade para cada mês e para cada junção. Ela também formata a data para só o mês e ano.



    Quando eu tento jogar o Select no Table Adapter, ele acusa o seguinte erro:




     

    Certo, porém eu acredito que posso usar um select * simples, e adaptar na hora de gerar o relatório Matrix, afinal é esse controle que irá fazer esses agrupamentos.


    Porém, não consigo fazer a mesma coisa com o Matrix, que seria, mostrar a junção, o total da quantidade por mês (este último sendo o maior problema, não consigo fazer a mesma conversão e agrupamento).

    Eu acredito também que preciso ter alguma forma de relacionar o campo "=Sum(Fields!quantidade.Value)" com a data formatada. 

     



    Você saberia como eu posso construir a expressão da data para  fazer essa conversão e se for necessário, fazer esse agrupamento?
     
    Acredito que resolvendo isso, o meu problema termine


    Mais uma vez,
    Obrigado pela ajuda que já tem me dado, e desde já agradeço novamente !!!



    Paulo Eduardo Bueno
    sexta-feira, 7 de novembro de 2008 12:41
  • Olá Paulo,

     

    Pelo que eu vi no seu relatório, falta apenas formatar a data para o formato MM/yyyy.

     

    Neste caso, basta clicar com o botão direito no mouse no campo data e selecionar a opção expression.

     

    informe a expressão para o campo

    Code Snippet
    =format(Fields!data.Value, "MM/yyyy")

     

     

     

     

    [ ]'s

     Laércio.


    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

    segunda-feira, 10 de novembro de 2008 13:32
    Moderador
  • Laércio

     

    Então cara, eu já tinha tentado dessa forma mas não resolveu, porém eu acho que é por aí

     

    o que eu preciso agora é fazer com que ele agrupe os mêses e não haja repetição dos mesmos

     

    exemplo:

     

     

    Se eu tivesse

    11/07/2008       15/07/2008           26/08/2008

          5                      6                         7

     

     

    teria que ficar:

     

     

    07/2008           08/2008

        11                    7

     

     

     

    ele está trazendo da seguinte forma:

     

     

     

     

    Como eu poderia fazer para corrigir isso?

     

     

    Desde já,

    Obrigado

     

     

    Paulo Eduardo Bueno

    terça-feira, 11 de novembro de 2008 10:36
  • Quando Laercio falou de formatar os dados para MM\yyyy, acho que você mudou somente o valor que está sendo mostrado, e não a expressão do agrupamento na coluna. Clique com o botao direito/ Edit Group. E na expressão do grupo use a mesma que você está mostrando na textbox.

     

    Att

    Boreki

    quinta-feira, 13 de novembro de 2008 23:14
  • Perfeito !!

    Era exatamente isso Boreki, esqueci de colocar a formatação no Group. Funcionou perfeitamente !!! Muito obrigado pela ajuda de vocês! Finalmente consegui utilizar esse Matrix hehe


    Só mais uma coisa pra fechar de uma vez essa thread. Estou tentando agora fazer com que as linhas apareçam uma de cada cor, assim como o exemplo do WebCast. Porém, o ReportViewer acusa o seguinte erro:

    Error 1 The BackgroundColor expression for the textbox ‘quantidade’ has a scope parameter that is not valid for RunningValue, RowNumber or Previous.  The scope parameter must be set to a string constant that is equal to the name of a containing group within the matrix ‘matrix1’. \Outsourcing\Relatorios\rptInsumo8.rdlc Outsourcing


    Como posso consertar isso?



    Desde já,
    Obrigado novamente


    Paulo Eduardo Bueno
    sexta-feira, 14 de novembro de 2008 12:11
  • Na funcao RowNumber use o nome do

    agrupamento de linhas que você criou.

     

    Att

    Boreki

    segunda-feira, 17 de novembro de 2008 21:52
  • Opa, bom dia
    então cara, estou fazendo assim

    =IIf(RowNumber("matrix1_juncao") mod 2= 0 ,  "White", "Silver")


    porém, não está dando certo, ele está retornando assim:



    Eu gostaria que ficasse uma linha prata e uma linha branca.
    Alguma outra sugestão ?



    Desde já, obrigado!
    terça-feira, 18 de novembro de 2008 11:05
  • Essa questão da linha colorida foi respondido aqui 



    Com isso, fechou esse tópico também !!!

    Muito obrigado mais uma vez Laércio, muito obrigado mais uma vez também Boreki!!!


    Abraço
    sexta-feira, 5 de dezembro de 2008 11:01