Usuário com melhor resposta
Conexão

Pergunta
-
Se eu criar uma conexão usando o wizard do VS.Net 2005 para me conectar com um Banco Access o caminho para acessar o Banco focará fixo se eu mudar de maquina terie que refazer a conexão e depois qdo o sistema estiver pronto e eu instalar nas maquinas dos clientes o caminho não será o mesmo ... como faço para configurar isso há uma maneira ou não
Outro caso eu crio um DataSet via wizard e uso uma conexão tbm seria o mesmo caso de reconfiguração de caminho
Valeuuu
Respostas
-
Quando você cria a conexão pelo Wizard, o Wizard já cria o código de leitura do arquivo de configuração. No arquivo designer do DataSet haverá uma linha mais ou menos assim para fazer a leitura:
this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.MeuBancoConnectionString;
No caso do Access, na segunda tela do Wizard você é perguntado se quer copiar o banco para o diretório do aplicativo etc., e responde *não*. Na tela seguinte você é perguntado qual é o nome do atributo para sua string de conexão a ser armazenado no arquivo de configuração, no exemplo acima "MeuBancoConnectionString" (o atributo completo é "WindowsApplication1.Properties.Settings.Default.MeuBancoConnectionString").
No arquivo de configuração haverá a entrada para a string. O conteúdo do arquivo será algo assim:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="WindowsApplication1.Properties.Settings.MeuBancoConnectionString"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MeuBanco.mdb"
providerName="System.Data.OleDb" />
</connectionStrings>
</configuration>O caminho do arquivo está no atributo "Data Source" da string de conexão, no exemplo "C:\MeuBanco.mdb". É esse valor que você deve alterar para conter a localização real do banco na máquina.
-
Você deve passar uma fonte de dados para o relatório.
Por exemplo, suponha que você tenha criado um relatório, e para exemplo suponha que tenha sido criado usando a tabela Clientes do banco de exemplo Northwind que vem com o Access (tabela Customers na versão em inglês), assim você pode reproduzir aí se quiser. No form em que você tem o ReportView modifique o construtor para receber um DataSet ou DataTable para os dados e uma uma variável string para receber o caminho em disco do arquivo do relatório; também declare duas variáveis no escopo do form para referenciar os objetos que você recebeu no construtor. Algo assim:
private DataSet m_ds;
private string m_arquivo;
public SeuForm(DataSet ds, string arquivo)
{
InitializeComponent();m_ds = ds;
m_arquivo = arquivo;
}No evento Load do form, carregue o relatório passando a fonte de dados e o caminho para o relatório. Algo assim:
Microsoft.Reporting.WinForms.ReportDataSource datasource = new Microsoft.Reporting.WinForms.ReportDataSource("NorthwindDataSet_Clientes", m_ds.Tables["Clientes"]);
reportViewer1.LocalReport.DataSources.Add(datasource);
reportViewer1.LocalReport.ReportPath = m_arquivo;
reportViewer1.RefreshReport();"NorthwindDataSet_Clientes" é o nome do DataSet que o Visual Studio cria quando se inclui a tabela Clientes do banco Northwind usando a janela "Data Sources". Se o nome da tabela fosse "Customers" (como na versão em inglês) o nome seria "NorthwindDataSet_Customers" e assim por diante. Você precisa dizer que o DataTable que você está usando como fonte de dados é para esse DataSet, como demonstarado acima, já que pode haver diversos DataSets por relatório. Esse dado também deve ser passado por parâmetro, só o incluí diretamente aqui para clareza no exemplo.
No form de onde você chama o form de exibição de relatório, você preencheria o DataSet e instanciaria o form de exibição passando os parâmetros. Algo assim:
OleDbConnection cnn = new OleDbConnection(<string de conexão>);
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Clientes", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "Clientes");
// Form de exibição.
Form2 f = new Form2(ds, <arquivo>);
f.Show();Claro, se voce já tem uma tabela no seu aplicativo daquelas que são geradas pelo wizard, você pode passá-la também ao invés de fazer uma query como acima.
-
Junior Martins wrote: Mais uma vez valeu ... agora ja estou com bem menos problemas rsss valeu mesmo
Só mais uma coisa qdo se gera o DataSet para o relatorio com mais que uma tabela eu somente aponto as tabelas para o DataSet e na hora de criar o relatorio eu adiciono os campos do DataSource arrasto e solto mas os campos com valores numericos tipo SINGLE aparecem assim no relatorio
=Sum(Fields!Jan.Value, "DsRelContagemTempo_ContagemTempo") e qdo eu rodo o relatorio na hora de visualizar ele mostra um simbolo de erro no lugar do campo #ERRO vc teria ideia do que da isso e para as tabelas do relatorio eu criar alguma query especifica por estar usando duas tabelas ou nem precisa ...Angus valeu mesmo pela ajuda pois to apanhando um monte com esses relatórios mas devagar vai saindo valeu mesmo
O objeto Table tem que se referir a uma tabela específica já que não teria sentido exibir duas tabelas diferentes, que além do mais poderiam ter um número diferente de registros, no campo details. A tabela a que um determinado Table se refere é setada na propriedade DataSetName. Qualquer campo que venha de fora daquela tabela tem que ser agregado e no caso de um campo numérico a função SUM() é usada. Se fosse um campo string seria a função FIRST() etc. Selecione a tabela correta para o objeto Table.
-
Todas as Respostas
-
-
Então deixa eu ver se eu entendi ... eu tenho um arquivo app.config mas neste eu tenho que ter minha string de conexão completa nele ou somente o caminho do Banco de Dados ??? exemplo Provider .....
Mas qdo eu crio uma conexão via wizard eu não tenho como pegar o caminho do arquivo de configuração eu pego o caminho por exemplo c:\meu_projeto\Db\banco.mdb por exemplo e vc me disse que qdo eu instalar em outra maquina eu mudo a conexão no arquivo e o programa ja busca a base sem problemas ...
desculpa a pergunta novamente mas é que eu não entendi direito ... agradeço desde ja sua atenção
-
Quando você cria a conexão pelo Wizard, o Wizard já cria o código de leitura do arquivo de configuração. No arquivo designer do DataSet haverá uma linha mais ou menos assim para fazer a leitura:
this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.MeuBancoConnectionString;
No caso do Access, na segunda tela do Wizard você é perguntado se quer copiar o banco para o diretório do aplicativo etc., e responde *não*. Na tela seguinte você é perguntado qual é o nome do atributo para sua string de conexão a ser armazenado no arquivo de configuração, no exemplo acima "MeuBancoConnectionString" (o atributo completo é "WindowsApplication1.Properties.Settings.Default.MeuBancoConnectionString").
No arquivo de configuração haverá a entrada para a string. O conteúdo do arquivo será algo assim:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="WindowsApplication1.Properties.Settings.MeuBancoConnectionString"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MeuBanco.mdb"
providerName="System.Data.OleDb" />
</connectionStrings>
</configuration>O caminho do arquivo está no atributo "Data Source" da string de conexão, no exemplo "C:\MeuBanco.mdb". É esse valor que você deve alterar para conter a localização real do banco na máquina.
-
Opa valeu mesmo viu ... me ajudou bem agora eu entendi certinho valeu mesmo
Só mais uma coisa vc manja de ReportViewer ??? eu to com problemas com esse carinha rss eu tenho um form com um compeonente ReportViewer e os meus relatorios.rdlc eu quero abrir todos eles nesse form de qualquer form que eu chamar um relatorio eu vou chamar esse form que tem o reportviewer e abrir o relatorio dentro vc teria alguma dica sobre como fazer isso ... ja tentei de tudo e não consegui sempre da u erro de que o DataSet não foi encontrado e aparentemente esta tudo certo
Valeu mais uma vez
-
Você deve passar uma fonte de dados para o relatório.
Por exemplo, suponha que você tenha criado um relatório, e para exemplo suponha que tenha sido criado usando a tabela Clientes do banco de exemplo Northwind que vem com o Access (tabela Customers na versão em inglês), assim você pode reproduzir aí se quiser. No form em que você tem o ReportView modifique o construtor para receber um DataSet ou DataTable para os dados e uma uma variável string para receber o caminho em disco do arquivo do relatório; também declare duas variáveis no escopo do form para referenciar os objetos que você recebeu no construtor. Algo assim:
private DataSet m_ds;
private string m_arquivo;
public SeuForm(DataSet ds, string arquivo)
{
InitializeComponent();m_ds = ds;
m_arquivo = arquivo;
}No evento Load do form, carregue o relatório passando a fonte de dados e o caminho para o relatório. Algo assim:
Microsoft.Reporting.WinForms.ReportDataSource datasource = new Microsoft.Reporting.WinForms.ReportDataSource("NorthwindDataSet_Clientes", m_ds.Tables["Clientes"]);
reportViewer1.LocalReport.DataSources.Add(datasource);
reportViewer1.LocalReport.ReportPath = m_arquivo;
reportViewer1.RefreshReport();"NorthwindDataSet_Clientes" é o nome do DataSet que o Visual Studio cria quando se inclui a tabela Clientes do banco Northwind usando a janela "Data Sources". Se o nome da tabela fosse "Customers" (como na versão em inglês) o nome seria "NorthwindDataSet_Customers" e assim por diante. Você precisa dizer que o DataTable que você está usando como fonte de dados é para esse DataSet, como demonstarado acima, já que pode haver diversos DataSets por relatório. Esse dado também deve ser passado por parâmetro, só o incluí diretamente aqui para clareza no exemplo.
No form de onde você chama o form de exibição de relatório, você preencheria o DataSet e instanciaria o form de exibição passando os parâmetros. Algo assim:
OleDbConnection cnn = new OleDbConnection(<string de conexão>);
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Clientes", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "Clientes");
// Form de exibição.
Form2 f = new Form2(ds, <arquivo>);
f.Show();Claro, se voce já tem uma tabela no seu aplicativo daquelas que são geradas pelo wizard, você pode passá-la também ao invés de fazer uma query como acima.
-
-
Sem querer abusar rsssss mas é o seguinte meus dados a serem exibidos no relatorio tem que obedecer um filtro um Select <campos> From Tabela Inner Join .... Where CodSubs = And Ano = e no report há uma opção de parametros vc tem algum exemplo ou dica sobre como passar esses parametros para o relatorio pois qdo chamo o relatorio do meu form o relatorio teria que vir com os dados com esse filtro ...
Valeu novamente .... abraços
-
Os parâmetros são setados pelo método SetParameters() que passa um array de objetos ReportParameter.
Você pode passar esse array no construtor, junto com os parâmteros do exemplo anterior, ou criar uma propriedade no form de exibição para recebê-los.
Um exemplo criando-se uma propriedade. No form em que você exibe o relatório, declare esta propriedade:
private Microsoft.Reporting.WinForms.ReportParameter[] m_parameters;
public Microsoft.Reporting.WinForms.ReportParameter[] Parameters
{
get { return m_parameters; }
set { m_parameters = value; }
}No form em que você chama o form de exibição você passsaria os parâmetros à propriedade Parameters do form de exibição, assim:
SeuForm f = new SeuForm(ds, <arquivo de relatório>);
// Parâmetros.
Microsoft.Reporting.WinForms.ReportParameter[] param = new Microsoft.Reporting.WinForms.ReportParameter[2];
param[0] = new Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_0", "UmValorQualquer", false);
param[1] = new Microsoft.Reporting.WinForms.ReportParameter("Report_Parameter_1", DateTime.Now.ToString(), false);
// Passa parâmetros.
f.Parameters = param;
// Exibe form.
f.Show();O exemplo acima passa dois parâmetros. Os nomes dos parâmetros são os criados por padrão pelo designer do relatório. Você evidentemente deve trocar pelos nomes reais.
Finalmente, no form de exibição, onde você seta os valores para o relatório (evento Load no exemplo anterior), você criaria uma condição para verificar se a variável da propriedade que recebe os parâmetros é nula ou contém algum valor; se contiver algum valor, você passa os parãmetros ao relatório, do contrário, ignora:
Microsoft.Reporting.WinForms.ReportDataSource datasource = new Microsoft.Reporting.WinForms.ReportDataSource("NorthwindDataSet_Clientes", m_ds.Tables["Clientes"]);
reportViewer1.LocalReport.DataSources.Add(datasource);
reportViewer1.LocalReport.ReportPath = m_arquivo;
// Parâmetros
if (m_parameters != null)
reportViewer1.LocalReport.SetParameters(m_parameters);
reportViewer1.RefreshReport();É isso.
-
Mais uma vez valeu ... agora ja estou com bem menos problemas rsss valeu mesmo
Só mais uma coisa qdo se gera o DataSet para o relatorio com mais que uma tabela eu somente aponto as tabelas para o DataSet e na hora de criar o relatorio eu adiciono os campos do DataSource arrasto e solto mas os campos com valores numericos tipo SINGLE aparecem assim no relatorio
=Sum(Fields!Jan.Value, "DsRelContagemTempo_ContagemTempo") e qdo eu rodo o relatorio na hora de visualizar ele mostra um simbolo de erro no lugar do campo #ERRO vc teria ideia do que da isso e para as tabelas do relatorio eu criar alguma query especifica por estar usando duas tabelas ou nem precisa ...Angus valeu mesmo pela ajuda pois to apanhando um monte com esses relatórios mas devagar vai saindo valeu mesmo
-
Junior Martins wrote: Mais uma vez valeu ... agora ja estou com bem menos problemas rsss valeu mesmo
Só mais uma coisa qdo se gera o DataSet para o relatorio com mais que uma tabela eu somente aponto as tabelas para o DataSet e na hora de criar o relatorio eu adiciono os campos do DataSource arrasto e solto mas os campos com valores numericos tipo SINGLE aparecem assim no relatorio
=Sum(Fields!Jan.Value, "DsRelContagemTempo_ContagemTempo") e qdo eu rodo o relatorio na hora de visualizar ele mostra um simbolo de erro no lugar do campo #ERRO vc teria ideia do que da isso e para as tabelas do relatorio eu criar alguma query especifica por estar usando duas tabelas ou nem precisa ...Angus valeu mesmo pela ajuda pois to apanhando um monte com esses relatórios mas devagar vai saindo valeu mesmo
O objeto Table tem que se referir a uma tabela específica já que não teria sentido exibir duas tabelas diferentes, que além do mais poderiam ter um número diferente de registros, no campo details. A tabela a que um determinado Table se refere é setada na propriedade DataSetName. Qualquer campo que venha de fora daquela tabela tem que ser agregado e no caso de um campo numérico a função SUM() é usada. Se fosse um campo string seria a função FIRST() etc. Selecione a tabela correta para o objeto Table.
-
-
Bom dia amigos,
Acompanhei as respostas dessa thread e achei sensacional.
Uma dúvida.
Qual a diferença de se passar os parâmetros para o select ou para os parâmetros do relatório?
Ex.:
1º Seguir os passos acima e inserir reportViewer1.LocalReport.SetParameters(m_parameters); no relatório.
2º Ou inserir no select WHERE campo1 = 10 and campo2 = 5.
Penso que no segundo exemplo eu vou economizar evitando dados desnecessários. Por exemplo, se a minha tabela "Clientes" possuir milhares de registros, o 1º exemplo carregará todos os dados antes da execução do relatório enquanto o 2º trará apenas o que vou usar (Não sei se os dados são lidos na hora do da.Fill(ds, "Clientes");). -
Ola, então esse post realmente ficou interessante ale'm do mais me ajudou muito na epoca com a conexão e geração dos relatórios ... agora se se bem entendi é o seguinte
Quanto ao reportViewer1.LocalReport.SetParameters(m_parameters); essa linnha de comando eu a utilizo para passar valores para o relatório por exemplo valores que são passados do Form para um determinado campo dentro do relatório e este campo esta ligado a um parametro.
Agora para carregar os registros no relatório eu crio um DataTable via wizard do VS.Net com as colunas que eu utilizarei no relatorio e no meu form eu carrego esse DataTable com os dados que ja tenho em um DataSet carregado com o resultado de uma query ja devidamente construida somente com os dados necessários ou seja, seleciono somente os registros que preciso mesmo ... dai carrego esse DataTable com os dados e quando "chamo" meu relatório este é carregado com os dados do DataTable.
Espero ter respondido ...
Qualquer coisa estamos ai ... abraços
-
-
Isso mesmo os parametros são como no crystal reports ... bom pode até ser que tenham alguma outra funcionalidade mas pelo vi até hoje e usei sempre foi para passar valores da aplicação para o relatório
Agora aproveitando o amigo saberia me dizer se da para fazer relatorios com grupos no ReportViewer ....
Abraço
-
-
-
-
Cara até aqui foi tudo OK, mas agora num está mais funcionando olha o que acontece:
Microsoft.Reporting.WinForms.LocalProcessingException was unhandled
Message="An error occurred during local report processing."DuplicatareportViewer.LocalReport.SetParameters(Parametros);
Nessa linha da o erro...
E como faço para recuperar CADA parâmetro DENTRO do RDCL
tenho um txt Por exemplo dentro do relatório e quero que o "Report_Parameter_0" seja setado nesse text para ser exibido impresso etc...
obrigado
-
Bom se vc ja criou seu parametro dentro do Report por exemplo um parametro chamado Titulo_Relatorio que este receberá o titulo do relatorio por um TextBox da tela faça o seguinte:
// Cria a variavel para passagem de parametros
List
<ReportParameter> parameters = new List<ReportParameter>();// Primeiro parametro
parameters.Add(new ReportParameter("pNomeDiretora", vNomeDiretora));
// Segundo parametro
parameters.Add(new ReportParameter("pCorpo", vCorpo));
// Terceiro parametro
parameters.Add(new ReportParameter("pImagem", vImagem));
// Passagem dos parametros para o Report
fReport.rptViewer.LocalReport.SetParameters(parameters);
// Essa variavel fReort foi criada para chamar o Form com o ReportViewer e nesse momento passo o Titulo do Form pela //varaivel
fReport.Text = "Declaração";
Qualquer coisa estamos ai ... espero ter ajudado
Abraço
-
Não consegui..... posso estar sendo burro mas rsrs seguinte tenho o seguinte código
Tenho um form com um grid que carrego todas Notas que ainda não foram impressas....
Futuramente os parâmetros serão os dados corretos mas por enquanto quero testar e ver funcionar....
Botão de Imprimir
private void Imprimirbutton_Click(object sender, EventArgs e){
//Chamo o meu FORM que tem o ReportView, passando o Path do .rdlc e o DataSet Preenchido já!
// Parâmetros.
List<ReportParameter> arParametros = new List<ReportParameter>();arParametros.Add(
new ReportParameter("Teste", "BANANA"));// Passa os parâmetros.
frmImpressaoDuplicata.Parametros = arParametros;
// Exibe form do Relatório.
frmImpressaoDuplicata.Show();
}
//Form com o REPORTVIEW
Propriedade do Tipo lista para receber os parâmetros
private
List<ReportParameter> prParametros; public List<ReportParameter> Parametros{
get { return prParametros; } set { prParametros = value; }}
//Load do Form com o ReportView
private void DuplicataImprimir_Load(object sender, EventArgs e){
// Recebe os Parâmetros
if (Parametros != null)DuplicatareportViewer.LocalReport.SetParameters(
this.DuplicatareportViewer.RefreshReport();
}
-
E ai blza ... sofrendo um pouco rsss ... nossa eu tbm sofri ate com o ReportViewer rsss bom e creio que vou sofrer mais ainda rssss pois fiz coisas basicas ele só ...
Bom é um pouco complicado assim saber ao certo o que pode estar dando erro mas no Form que tenho o ReportViewer que eu mando carregar meus .rdlc eu tenho o seguinte codigo
// Qdo fecho o Form
private void FrmReport_FormClosed(object sender, FormClosedEventArgs e){
}
// Evento Load
private void FrmReport_Load(object sender, EventArgs e){
rptViewer.RefreshReport();
}
Bom eu uso somente este codigo no Form que tem o ReportViewer nada mais, eu vi que no seu tem um codigo com datasource e tudo mais mas esperimente inserir somente este codigo e ver no que da ... se vc inseriu nos parametros do relatorio os parametros e esta enviando via codigo os valores creio que dessa maneira não tenha problemas ...
Qualquer coisa estamos ai pode ir postando
Flwww
Abraço
-