Inquiridor
Gerar relatório a partir de um SELECT dinâmico

Pergunta
-
Eu tenho uns campos de filtro e gostaria de gerar um relatório montando um SELECT dinamicamente, dependendo se os campos de texto ou combos estão com valor ou não para filtro.
Eu tentei por meio de uma FUNCTION que criei no BD, porém com a function ou procedure eu já defino todos os parâmetros e meus parâmetros vão depender se tem valor nos campos para filtro. Com View também não serve, pois não aceita parâmetros até onde eu pesquisei.
O meu ReportViewer precisa ter um ObjectDataSource? Porque se for obrigatório eu tenho que selecionar um método para pegar os dados "SelectMethod" não é?
Para exemplificar:
Tenho uns campos para filtro e um botão para gerar o relatório a partir desses filtros. Só que nem todos os campos de filtro são obrigatórios.
Aqui o código que tenho hoje:
relatório.aspx
<asp:UpdatePanel ID="up_relatorio" runat="server"> <ContentTemplate> <rsweb:ReportViewer ID="rp_extMensal" runat="server" Width="873px" Font-Names="Verdana" Font-Size="8pt" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt"> <LocalReport ReportPath="Report1.rdlc"> <DataSources> <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1" /> </DataSources> </LocalReport> </rsweb:ReportViewer> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName="SCM.WEBApp.SCMDataSetTableAdapters.funExtratoMensalReportTableAdapter"> <FilterParameters> < </FilterParameters> <SelectParameters> <asp:FormParameter DefaultValue="16" FormField="rel_filtro_unidade" Name="cod_unidade" Type="Int32" /> <asp:FormParameter DefaultValue="10" FormField="rel_filtro_fornecedor" Name="cod_fornecedor" Type="Int32" /> <asp:FormParameter DefaultValue="8086" FormField="rel_filtro_profissional" Name="cod_profissional" Type="Int32" /> <asp:FormParameter DefaultValue="4" FormField="rel_filtro_especialidade" Name="cod_especialidade" Type="Int32" /> <asp:FormParameter DefaultValue="30" FormField="rel_filtro_competencia" Name="cod_competencia" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource> </ContentTemplate> </asp:UpdatePanel>
Eu inicio com DefaultValue só pra ver um resultado assim que abro a página e está exibindo certinho.
FormField="rel_filtro_unidade" é o controle que ele vai pegar o value pra gerar o relatório, correto? Sempre que eu clicar em atualizar ele vai atualizar com o que tem nesses campos definidos no FomField? Poque não tá acontecendo isso, mesmo estando com o mesmo ID dos Combos e TextBox.
Agora minha function no BD:
SELECT uni_nome, for_nome, pro_nome, pro_cpf, esp_descricao, lan_data, tpt_descricao, lan_qtd_procedimento FROM lancamento JOIN tipo_plantao_turno as tipo_turno ON tipo_turno.tpt_cod = lan_cod_tipo_plantao_turno JOIN especialidade ON esp_cod = lan_cod_especialidade JOIN fornecedor ON for_cod = lan_cod_fornecedor JOIN profissional ON pro_cod = lan_cod_profissional JOIN unidade ON uni_cod = lan_cod_unidade JOIN competencia ON com_cod = lan_cod_competencia WHERE lan_cod_unidade = @cod_unidade AND lan_cod_fornecedor = @cod_fornecedor AND lan_cod_profissional = @cod_profissional AND lan_cod_especialidade = @cod_especialidade AND lan_cod_competencia = @cod_competencia
Só que nem sempre vou passar por exemplo o código do profissional. Desse jeito fica amarrado a ter todos os parâmetros, correto?
Todas as Respostas
-
Procure usar DataSet para fazer isso, bastando apenas passar o dataSet com o resultado de uma query dentro do C#, eu faço isso justamente devido a Crystal Reports veja abaixo nas Threads:
Crystal-Report-with-DataSet-and-DataTable-using-C
Crystal-Report-ASPNet-Example-using-DataSet-or-DataTable-in-C-VBNet-and-Visual-Studio-2010.aspx
-
-
Independente de ser ReportViewer ou Crystal Reportsa lógica é a mesma, segue abaixo com ReportViewer
Dataset com ReportViewer Relatorios Dinamicos- Sugerido como Resposta Mr. GMSOFT terça-feira, 17 de fevereiro de 2015 12:27
-
-
Syd Franco, o reportviewer precisa de um tableadapter apenas para que vc arraste os campos para o relatório, baseado nisso vc pode no codebehind ter o select que quiser, mais tem que ter os mesmos campos, somente isso.
No codebehind da página vc pode ter o select que quiser. Eu tenho por exemplo uma página onde o usuário seleciona o relatório que ele quer tipo : nome, por setor, etc... eu só tenho um arquivo rdlc conforme cada opção eu abro um pop-up onde em cada pop-up tem o seu select e tudo funciona perfeito.
Só mais uma vez lembrando o que não pode mudar são os campos do select no where vc pode mudar sem problemas.
Junior
- Editado Junior_luiz terça-feira, 10 de março de 2015 12:58 errei
-