none
Relatórios com ReportView (Contar valores iguais e filtrar por intervalo de data)

    Question

  • Bom dia pessoal, 

    estou criando um relatório, e nele, preciso fazer o seguinte: Na Coluna Importancia, pode contém três valores diferentes (Baixa, Média, Alta).

    No meu relatório, quero fazer o seguinte: Criar uma tabela dessa forma

                        IMPORTANCIA                          
    BAIXA       |        MÉDIA        |        ALTA       |

    Na coluna Baixa, eu preciso que conte quantas vezes aparece o texto "BAIXA" na coluna Importancia do DataGridView, e assim por diante.

    Além de que preciso filtrar por um intervalo de data, por exemplo: pegar os dados acima, apenas quando a o campo data do DataGridView estiver entre 01/07/2012 e 31/07/2012

    VALEU

    Monday, July 02, 2012 1:16 PM

Answers

  • rsrs.
    Voce tem o dataset criado, componente ?

    Segue esses passos :

    No form em que esta o Reportview, Já deve ter criado o dataset certo? 
    Ele deve estar la embaixo na barra de componentes utilizados no form. 

    Clicar com botao direito -> Edit in Dataset Design. 
    NoTableAdapter, da caixa de vizualização do dataset, clicar com o botão direito -> Configure.
    Nesta caixa voce coloca o seu código. 


    {SELECT 
    ID_SOLICITACAO AS Codigo
    ,DT_ABERTURA AS Data
    ,PRIORIDADE AS Prioridade
    FROM 
    SOLICITACAO
    WHERE MONTH(DT_ABERTURA) = @MES
    }

    Next -> Finish;

    " Se quiser fazer isso acima, direto no código abrir o dataset.design.cs e colocar o seu select no :  this._commandCollection[0].CommandText "

    Agora o dataset que ira popular o reportview esta com o seu codigo desejado e esperando um parâmetro. 
    Você já deve ter vinculado anteriormente o reportview para carregar os dados deste dataset certo.

            private void FormRel_Load(object sender, EventArgs e)
            {
     
                try
                {
                    this.relatorioTableAdapter.Fill(this.DataSet.relatorio, mes ); // mes variavel global já preenchida 
                    this.reportViewer1.RefreshReport();
                }
                catch (Exception m)
                {
                    MessageBox.Show("Erro ao montar relatório. Erro : "+m.ToString(),"Erro",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }


    Não sei se você está usando o componente dataset , isto vale se tiver usando o componente.
    Tuesday, July 03, 2012 5:07 PM
  • Blz. 

    Tem o comando :

    =now()

    pega a data atual .

    -----------
    Uma maneira rápida de vc filtrar direto no textbox usando as expression nativas, Passa uma data no dataset e filtra pelos comandos:

    =Month(Fields!Date.Value);// pega mes da data passada

    =Year(Fields!Date.Value);// pega ano da data passada

    ---------------

    Agora se quiser por parametros igual voce comentou é um pouco mais elaborado mas da :

    http://renatoalmeidasoares.blogspot.com.br/2011/01/trabalhando-com-reportviewer-vs2010.html;


    Tuesday, July 03, 2012 7:26 PM

All replies

  • Você esta fazendo direto no relatório ?

    Se sim. No Report.rdlc, dentro da célula desejada o comando :

    Para contagem :
    =count(Fields!coluna.Value)

    Para comparação :
    =IIf(Fields!campo.Value = "NAO","ORÇAMENTO","VENDA")

    Ai adaptar para seu caso. Não sei se é isso que esta querendo. 

    O filtro por data creio que vindo filtrado no dataset fique mais simples.

    Monday, July 02, 2012 2:15 PM
  • Danilo, muito obrigado, consegui fazer ele contar certinho.

    Apenas não entendi como fazer o filtro por data!

    Valeu

    Monday, July 02, 2012 5:42 PM
  • É por passagem de parametro. Ao carregar o dataset que irá popular o relatório , vc já faz este filtro.
    Da uma olhada neste link, o marcus paulo deu uma explanada nesta parte.

    http://social.msdn.microsoft.com/Forums/pt-BR/vsreportingpt/thread/7944f7fa-16b1-4547-8ce3-394980e631fa/

    Qualquer coisa só falar.

    Monday, July 02, 2012 6:20 PM
  • Então Danilo, mas a questão é que o usuário que deve definir o intervalo.

    Por exemplo: 

    ele definiu de 01/07/12 a 15/07/12.

    No relatório, vai aparecer apenas o dados que a coluna data está dentro deste intervalo.

    Vou dar uma lida aqui para ver se me ajuda!

    Valeu

    ------------------

    Danilo, se eu conseguir fazer o seguinte, já me ajuda muito:

    O usuário seleciona um mês, no form do relatório.

    Com isso, puxa apenas os dados da grid do outro form que o mês (MM) for igual ao mês selecionado pelo usuário!

    Monday, July 02, 2012 6:49 PM
  • Neste caso voce irá utilizar dois DataTimePicker .

    A explicação de como filtrar os dados ao carregar o dataset, esta naquele link.

    O select do seu dataset ficaria :
     SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE DATA_PEDIDO >@DATAINI AND DATA_PEDIDO < @DATAFIM;
    A passagem das duas datas faria assim :

    this.pedidoTableAdapter.Fill(this.DataSet1.pedido,                                                        Convert.ToDateTime(dateTimePickerIni.Value.ToString()).ToString("yyyy/MM/dd")    // data inicial
    Convert.ToDateTime(dateTimePickerFim.Value.ToString()).ToString("yyyy/MM/dd")  // data final

    );

    Tuesday, July 03, 2012 11:08 AM
  • cara, bom dia.

    Estou tentando fazer de uma outra forma, porém, não deu certo!

    se liga

    criei uma procedure, que é a seguinte:

    ALTER PROCEDURE pRelatorio_INC1
    	@MES	INT
    AS
    	SELECT 
    		ID_SOLICITACAO AS Codigo
    		,DT_ABERTURA AS Data
    		,PRIORIDADE AS Prioridade
    	FROM 
    		SOLICITACAO
    	WHERE MONTH(DT_ABERTURA) = @MES

    Ou seja, eu quero que ele filtre todas a linhas no qual o mes do campo da data de abertura é igual à variavel @MES

    criei um form, com um report e uma combobox + button para selecionar o mes e fiz o seguinte codigo:

            private void button1_Click(object sender, EventArgs e)
            {
                int mes = 0;
    
                SqlConnection cn = new SqlConnection(
                    Dados.DuPontIFConnecton());
    
                SqlCommand cmd = new SqlCommand(
                    "pRelatorio_INC01", cn);
                cmd.CommandType = CommandType.StoredProcedure;
    
                if (cbMES.SelectedIndex == 0){ mes = 1; }
                else if (cbMES.SelectedIndex == 1) { mes = 2; }
                else if (cbMES.SelectedIndex == 2) { mes = 3; }
                else if (cbMES.SelectedIndex == 3) { mes = 4; }
                else if (cbMES.SelectedIndex == 4) { mes = 5; }
                else if (cbMES.SelectedIndex == 5) { mes = 6; }
                else if (cbMES.SelectedIndex == 6) { mes = 7; }
                else if (cbMES.SelectedIndex == 7) { mes = 8; }
                else if (cbMES.SelectedIndex == 8) { mes = 9; }
                else if (cbMES.SelectedIndex == 9) { mes = 10; }
                else if (cbMES.SelectedIndex == 10) { mes = 11; }
                else if (cbMES.SelectedIndex == 11) { mes = 12; }
    
                cmd.Parameters.AddWithValue("@MES", mes);
    
            }

    porém, tá dando tudo errado hahahaha não to sabendo fazer dar certo isso aqui :(((

    tá dificil kkkk


    Tuesday, July 03, 2012 1:39 PM
  • rsrs.
    Voce tem o dataset criado, componente ?

    Segue esses passos :

    No form em que esta o Reportview, Já deve ter criado o dataset certo? 
    Ele deve estar la embaixo na barra de componentes utilizados no form. 

    Clicar com botao direito -> Edit in Dataset Design. 
    NoTableAdapter, da caixa de vizualização do dataset, clicar com o botão direito -> Configure.
    Nesta caixa voce coloca o seu código. 


    {SELECT 
    ID_SOLICITACAO AS Codigo
    ,DT_ABERTURA AS Data
    ,PRIORIDADE AS Prioridade
    FROM 
    SOLICITACAO
    WHERE MONTH(DT_ABERTURA) = @MES
    }

    Next -> Finish;

    " Se quiser fazer isso acima, direto no código abrir o dataset.design.cs e colocar o seu select no :  this._commandCollection[0].CommandText "

    Agora o dataset que ira popular o reportview esta com o seu codigo desejado e esperando um parâmetro. 
    Você já deve ter vinculado anteriormente o reportview para carregar os dados deste dataset certo.

            private void FormRel_Load(object sender, EventArgs e)
            {
     
                try
                {
                    this.relatorioTableAdapter.Fill(this.DataSet.relatorio, mes ); // mes variavel global já preenchida 
                    this.reportViewer1.RefreshReport();
                }
                catch (Exception m)
                {
                    MessageBox.Show("Erro ao montar relatório. Erro : "+m.ToString(),"Erro",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }


    Não sei se você está usando o componente dataset , isto vale se tiver usando o componente.
    Tuesday, July 03, 2012 5:07 PM
  • BOOOOOOAAAAAAA CAMPEÃO!

    Enfim, consegui. Muito obrigado pela paciência e atenção!

    Você sabe se tem como usar variável nas Expressions?

    Por exemplo: Dentro do meu arquivo .rdlc, coloquei uma textbox. Eu quero que ela puxe o mês e o ano selecionado pelo usuario tipo assim:

    TÍTULO: "INC01 - NÚMERO DE INCIDENTES DEFINIDO POR PRIORIDADE - [MÊS]/[ANO]"

    Abraço.

    Tuesday, July 03, 2012 7:08 PM
  • Blz. 

    Tem o comando :

    =now()

    pega a data atual .

    -----------
    Uma maneira rápida de vc filtrar direto no textbox usando as expression nativas, Passa uma data no dataset e filtra pelos comandos:

    =Month(Fields!Date.Value);// pega mes da data passada

    =Year(Fields!Date.Value);// pega ano da data passada

    ---------------

    Agora se quiser por parametros igual voce comentou é um pouco mais elaborado mas da :

    http://renatoalmeidasoares.blogspot.com.br/2011/01/trabalhando-com-reportviewer-vs2010.html;


    Tuesday, July 03, 2012 7:26 PM
  • Consegui Cara, valeu, porém...

    Vamos supor que tem 7 linhas com mês igual a julho, quando eu coloco a expression =Month(Fields!Date.Value), ele imprime 7 linhas na tela. Tem como eu pegar apenas uma linha que contenha, o mês 7?

    Tuesday, July 03, 2012 8:02 PM
  • Sim.

    É só você colocar o edit fora do table Details, que é o corpo do relatório. O edit só mostra 1 registro. 

    Se vier 7 registros no select , irá mostrar apenas o ultimo. Como você quer pegar o mes e ano é só usar aquele month e year na data.

    No edit1   : =Month(Fields!Date.Value);          e Edit2  :  =Year(Fields!Date.Value);

    Wednesday, July 04, 2012 11:26 AM
  • Vc poderia me ajudar com isso? rs 

    Procurei, procurei, procurei, mas não achei nada de EDIT :(

    É exatamente o que vc disse, eu coloquei uma table com duas colunas e uma linha, na coluna um eu coloquei: =Month(First(Fields!DT_ABERTURA.Value)) e na coluna 2: =Year(First(Fields!DT_ABERTURA.Value))

    Ele lista todos os registros! no caso, 7.

    Valeu mais uma vez

    Wednesday, July 04, 2012 1:03 PM
  • Opa,

    Você vizualizando o  report.rdlc . Que no caso é a vizualização do relatório.
    É só vizualizar o Toolbox. Nele estará todos componentes que você poderá trabalhar no relatório. Tem outros como image chart.  Os edits que me referi, é os TextBox. rsrs. É que programo em outras , as vezes uso edits. No nosso caso é textbox

    Você deve ter colocado o comando no Details da tabela, por isso traz todos registros. Se você colocar o Comando table Footer, que é o rodapé da tabela. Também da certo, pq a célula do rodapé só aparece uma vez.

    Para verificar onde voce colocou, seleciona a tabela que esta aparecendo os dados. No canto esquerdo aparece umas linhazinhas, clica com o direito nelas. Ai você ve a que aquela célula pertence, se ela está no table details que falei.

    Wednesday, July 04, 2012 1:14 PM
  • A sim! rsrs

    Consegui fazer gráficos e tal. Eu tinha pensado nisso da textbox, porém, não aparece o quadradinho com as linhas (aquele de puxar algum campo) na textbox e nem no cabeçalho e rodapé, apenas quando crio um table!

    ---------------

    Cara, tive que fazer uma alteração. Ao invés de fazer o cara escolher o mês, ele tem que escolher um intervalo de datas. Beleza, fiz umas modificações naquilo que você me passou, e deu tudo certinho! Agora, seguinte, tem como eu fazer isso dentro do report1.rdlc:

    Intervalo : [datetimepicker1] à [datetimepicker2]

    valeu!

    Wednesday, July 04, 2012 2:14 PM
  • Opa, que bom que esta dando certo.

    Dentro do report.rdlc nao tem como. 
    Ele é apenas o relatório a folha que ira ser vista.

    Não da pra programar nele, mas sim os dados que irão ser carregados nele, e as expression que voce pode trabalhar dentro das células.

    Foi como disse no começo, você pode carregar essas datas no dataset, passando elas por paramentros. Ai é sem problemas o dataset será carregado no relatório no intervalo de datas que ele escolheu. 

    Eu faria assim:

    Um form só para o relatório , e nele o reportview. Só isso.

    O forme que irá chamar ele tem os datatimepickers. Ai quando chamar o Form relatório, passa as datas nele , já carregando o relatório.
    Ai no load dor form relatório coloca o código lá pra carregar as datas :

    p
    ublic static datetime data_ini,data_fim; // o form que irá chamar irá popular essas datas

            private void FormRel_Load(object sender, EventArgs e)
            {
     
                try
                {
                    this.relatorioTableAdapter.Fill(this.DataSet.relatorio, data_ini,data_fim); // variaveis que será passada para o dataset montar a consulta 
                    this.reportViewer1.RefreshReport();
                }
                catch (Exception m)
                {
                    MessageBox.Show("Erro ao montar relatório. Erro : "+m.ToString(),"Erro",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }

    Acho assim bem mais simples, ficar o form do relatório separado, e fica mais organizado. No meu ponto de vista. 

    Wednesday, July 04, 2012 2:31 PM
  • Entendi, Danilo!

    Fiz aqui, então agora é assim:

    Menu -> Relatórios -> RELATORIO 01

    Quando clicar no RELATORIO 01, aparece um form para ele colocar o intervalo, e nada mais. No botão gerar relatório, abri outro form pegando os parametros dos datapickers do form anterior. BELEZA, funcionou.

    Mas ainda não consegui mostrar a data no relatório :/

    veja meus códigos:

    form CHAMA RELATÓRIO (onde tem os intervalos 'datetimepicker')

    namespace DuPontIF
    {
        public partial class ChamaINC01 : Form
        {
            public static string dtINI, dtFIM;
            
            public ChamaINC01()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                dtINI = Convert.ToString(dtpINI.Text);
                dtFIM = Convert.ToString(dtpFIM.Text);
                inc01 f = new inc01();
                f.ShowDialog();
            }
        }
    }
    

    form INC01 (onde tem o report1)

    namespace DuPontIF
    {
        public partial class inc01 : Form
        {
            //string _dtini, _dtfim;
            string _dtINI = ChamaINC01.dtINI;
            string _dtFIM = ChamaINC01.dtFIM;
            public inc01()
            {
                InitializeComponent();
            }
    
            private void inc01_Load(object sender, EventArgs e)
            {
                try
                {
                    this.SOLICITACAOTableAdapter.Fill(this.DS1.SOLICITACAO, _dtINI, _dtFIM); // variaveis que será passada para o dataset montar a consulta 
                    this.reportViewer1.RefreshReport();
                }
                catch (Exception m)
                {
                    MessageBox.Show("Erro ao montar relatório. Erro : " + m.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
    }
    

    VALEU

    Wednesday, July 04, 2012 5:44 PM
  • Nao entendi qual data voce nao esta conseguindo mostrar. Se esta passando no dataset é só colocar no .rdlc , em um textbox.
    Thursday, July 05, 2012 1:44 PM
  • Acho que não estou sabendo essa parte de passar no DataSet, se bem que fiz tudo como vc me explicou

    ---

    pq isso que eu to fazendo já está populando o dataset DS1, ou não?

                    this.SOLICITACAOTableAdapter.Fill(this.DS1.SOLICITACAO, _dtINI, _dtFIM); // variaveis que será passada para o dataset montar a consulta 
                    this.reportViewer1.RefreshReport();

    Porém, eu não estou conseguindo utilizá-lo!

    Thursday, July 05, 2012 4:27 PM
  • Eu montei um doc com um passo a passo q fiz. Se quiser eu te mando. qual seu email.
    Friday, July 06, 2012 7:43 PM
  • Orra cara, muito obrigado pela força, brother!

    leonardondamato@gmail.com

    Friday, July 06, 2012 8:04 PM