quarta-feira, 27 de janeiro de 2010

Sub Relatório no crystal C#

Tive certa vez um problema ao abrir um relatorio com sub relatório, e por mais que tentava não conseguia mudar.
Mas tudo mudou ao alterar a ordem e forma das chamadas dos subrelatórios.
Segue abaixo o codigo contido dentro de um form proprio para gerar RPT, onde envio os selects para a geração dos mesmos através do form que os chama.

using System;
using System.Collections.Generic;
using System.ComponentModel;

using System.Data;
using System.Data.SqlClient;

using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

using System.IO;

using xxx.Camada_Logica;

namespace xxx
{
public partial class frmVisualisaRelatorio : Form
{
ClsComponentes Comp = new ClsComponentes();
public string strSQL,nomeForm, strReportPath, strTable;
public bool PossuiFoto = false, PossuiSub = false;


public frmVisualisaRelatorio()
{
InitializeComponent();
}

private void frmVisualisaRelatorio_Load(object sender, EventArgs e)
{
ListaProdutos();
}

private void ListaProdutos()
{
ReportDocument reportDocument = new ReportDocument();
SqlConnection oConn = new SqlConnection();
DataSet oDataSet = new DataSet();
clsImagem Imagem = new clsImagem();
byte[] imagem1, imagem2;
oConn.ConnectionString = Comp.Conexao1;
oConn.Open();
try
{
SqlDataAdapter oDA = new SqlDataAdapter(strSQL, oConn);
oDA.Fill(oDataSet);
if (PossuiFoto)
{
for (int i = 0; i <>
{
if (File.Exists(Convert.ToString(oDataSet.Tables[0].Rows[i]["ProdFoto1"])))
{
imagem1 = imagem2 = Imagem.GetArrayFromImagen(Image.FromFile(Convert.ToString(oDataSet.Tables[0].Rows[i]["ProdFoto1"])));
}
else
imagem1 = null;//Imagem.GetArrayFromImagen(Image.FromFile(this.strReportPath.Replace("\\bin\\Debug", "") + "\\Resources\\NoPhoto.jpg"));

if (File.Exists(Convert.ToString(oDataSet.Tables[0].Rows[i]["ProdFoto2"])))
{
imagem2 = Imagem.GetArrayFromImagen(Image.FromFile(Convert.ToString(oDataSet.Tables[0].Rows[i]["ProdFoto2"])));
}
else
imagem2 = null;// Imagem.GetArrayFromImagen(Image.FromFile(this.strReportPath.Replace("\\bin\\Debug", "") + "\\Resources\\NoPhoto.jpg"));

oDataSet.Tables[0].Rows[i]["Imagem1"] = imagem1;
oDataSet.Tables[0].Rows[i]["Imagem2"] = imagem2;
}
}

reportDocument.Load(strReportPath);
//libera acesso quando for dns, não usando dataset para a criação do realtorio
reportDocument.SetDatabaseLogon("sa", "bigboss");
if (PossuiSub)
{
//1ª forma de chamar onde estava dando erro
//SubreportDocument1 = reportDocument.OpenSubreport("crtProdutoEstoque.rpt");
//SubreportDocument2 = reportDocument.OpenSubreport("crtProdutoEstrutura.rpt");
//SubreportDocument1.Database.Tables[0].SetDataSource(oDataSet.Tables[1]);
//SubreportDocument2.Database.Tables[0].SetDataSource(oDataSet.Tables[2]);
//2ª forma de chamar onde rodou corretamente no caso de haver subrelatorios
switch (nomeForm)
{
case "Produto":
reportDocument.Subreports["crtProdutoEstoque.rpt"].Database.Tables[0].SetDataSource(oDataSet.Tables[1]);
reportDocument.Subreports["crtProdutoEstrutura.rpt"].Database.Tables[0].SetDataSource(oDataSet.Tables[2]);
break;
case "Estagio":
reportDocument.Subreports["crtEstagioProducao.rpt"].Database.Tables[0].SetDataSource(oDataSet.Tables[1]);
reportDocument.Subreports["crtEstagioProduto.rpt"].Database.Tables[0].SetDataSource(oDataSet.Tables[2]);
reportDocument.Subreports["crtEstagioServico.rpt"].Database.Tables[0].SetDataSource(oDataSet.Tables[3]);
break;
}
}
//3 passo: definir o DataSource do relatório
//reportDocument.SetDataSource(oDataSet);
//define a tabela para atualização depois de ter criado os subrelatorios caso haja
reportDocument.Database.Tables[0].SetDataSource(oDataSet.Tables[0]);
//4 passo: visualizar o relatório
crystalReportViewer1.DisplayGroupTree = false;
crystalReportViewer1.ReportSource = reportDocument;
}
catch (Exception ex)
{
MessageBox.Show("Erro na geração deste relatório!");
this.Close();
System.Diagnostics.Debug.WriteLine(ex.Message);
}

finally
{
//liberando os objetos
oConn.Dispose();
oDataSet.Dispose();
oConn = null;
oDataSet = null;
}
}
}
}

Nenhum comentário:

Postar um comentário