PRIMEIROS PASSOS CRYSTAL REPORT
Amigos bom dia. Continuo na saga de colocar imagem dinâmica no relatório (Logotipo do Cliente)
Como a sugestão do Nilson não deu certo, minha versão Crystal 2008 (v.10.5) não tem o recurso necessário, parti para testar outros códigos da Web. Nenhum funcionou até agora.
Achei esse http://murilodev.blogspot.com.br/2009/08/adicionando-imagens-no-crystal-report.html, posso ter feito algo errado, mas deu um erro em runtime (the data source object inválido) na linha:
O que fiz (sequência):
1) criei uma nova classe entidade com os campos para um cabeçalho padrão
2) Criei um novo relatório, somente com a seção Cabeçalho de relatório (ocultei todos os demais) depois troquei testando somente a seção Detalhes, mas o erro ocorreu em ambos os casos(nas duas seções).
3) Adicionei no Database fields do relatório, a classe entidade criada. Arrastei os campos para a seção.
Nota: após arrastar, vi que o nome de cada campo incluÃdo no relatório, foi acrescido de 1 ao final. Eu alterei manualmente o nome de cada campo no relatório, para ficar igual a classe (retirando o número 1), Eu testei das duas formas e o problema é o mesmo.
4) No relatório Principal, incluà na seção cabeçalho de página, um subrelatório com este relatório de cabeçalho que criei. [txt-color=#e80000](aqui não sei se é preciso fazer alguma codificação especÃfica, ou alterar alguma propriedade para integrar o relatório com o sub).[/txt-color]
5) No form que chama o relatório fiz assim:
Alguém sabe o que pode estar errado?
Nota: Depois retirei os outros atributos da classe entidade, deixando só a imagem e deu o mesmo erro, então o problema é nos dados carregados da imagem e passados ao Crystal. Num artigo do Macoratti falava de criar um DataSet com um campo type base64Binary, mas no VS 2008 não existe esse tipo de campo só Byte[] e outros, ou seja, o mesmo que usei nesse exemplo com classe.
Como a sugestão do Nilson não deu certo, minha versão Crystal 2008 (v.10.5) não tem o recurso necessário, parti para testar outros códigos da Web. Nenhum funcionou até agora.
Achei esse http://murilodev.blogspot.com.br/2009/08/adicionando-imagens-no-crystal-report.html, posso ter feito algo errado, mas deu um erro em runtime (the data source object inválido) na linha:
rltcabecalho.SetDataSource(myCabecalho);
O que fiz (sequência):
1) criei uma nova classe entidade com os campos para um cabeçalho padrão
namespace myAPP{
public class CabecalhoDados
{
private byte[] _imagem;
public byte[] imagem
{
get { return _imagem; }
set { _imagem = value; }
}
private string _titulo;
public string titulo
{
get { return _titulo; }
set { _titulo = value; }
}
private string _subtitulo;
public string subtitulo
{
get { return _subtitulo; }
set { _subtitulo = value; }
}
private string _periodo;
public string periodo
{
get { return _periodo; }
set { _periodo = value; }
}
}
}
2) Criei um novo relatório, somente com a seção Cabeçalho de relatório (ocultei todos os demais) depois troquei testando somente a seção Detalhes, mas o erro ocorreu em ambos os casos(nas duas seções).
3) Adicionei no Database fields do relatório, a classe entidade criada. Arrastei os campos para a seção.
Nota: após arrastar, vi que o nome de cada campo incluÃdo no relatório, foi acrescido de 1 ao final. Eu alterei manualmente o nome de cada campo no relatório, para ficar igual a classe (retirando o número 1), Eu testei das duas formas e o problema é o mesmo.
4) No relatório Principal, incluà na seção cabeçalho de página, um subrelatório com este relatório de cabeçalho que criei. [txt-color=#e80000](aqui não sei se é preciso fazer alguma codificação especÃfica, ou alterar alguma propriedade para integrar o relatório com o sub).[/txt-color]
5) No form que chama o relatório fiz assim:
private void frmRelatorioCadCausaFalhaListagemView_Load(object sender, EventArgs e)
{
CausaDaFalhaDAL objCausa = new CausaDaFalhaDAL(); //Objeto acessa DAL para dados relatório principal
List<CausaDaFalhaModelo> listCausas = new List<CausaDaFalhaModelo>(); //Objeto estrutura dos dados (lista com dados do relatório)
listCausas = objCausa.MontaGridViewCausaDaFalha(VariaveisAmbiente.SituacaoRegistro); //Pesquisa dados no banco
cadCausaDaFalhaList cr = new cadCausaDaFalhaList(); //instanciando o relatório de listagem
cr.SetDataSource(listCausas.ToList()); //Passa dados do banco ao relatório
rltCabecalho rltcabecalho = new rltCabecalho(); //relatório cabeçalho
CabecalhoDados myCabecalho = new CabecalhoDados(); //classe modelo entidade cabecalho
//carrega imagem do disco
FileStream stream = new FileStream(@[Ô]C:\OlhoBrasil.jpg[Ô], FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(stream);
myCabecalho.imagem = reader.ReadBytes(Convert.ToInt32(stream.Length));
reader.Close();
stream.Close();
//Preenche demais dados do cabeçalho
myCabecalho.titulo = [Ô]Relatório TÃtulo Teste[Ô];
myCabecalho.subtitulo = [Ô]SubtÃtulo Teste[Ô];
myCabecalho.periodo = [Ô]Dia de Hoje[Ô];
//vinculando dados no subrelatório de cabeçalho
rltcabecalho.SetDataSource(myCabecalho); [txt-color=#e80000]// AQUI OCORRE O ERRO[/txt-color]
//mudo o texto de um campo rodapé do relatório principal versão do programa
CrystalDecisions.CrystalReports.Engine.TextObject myCampo = null;
myCampo = (CrystalDecisions.CrystalReports.Engine.TextObject)cr.ReportDefinition.ReportObjects[[Ô]myVersao[Ô]];
myCampo.Text = [Ô]v. [Ô] + Program.myVersao.ToString();
crystalReportViewer1.ReportSource = cr; //Passo relatório principal ao view do crystal
crystalReportViewer1.Show();
listCausas = null;
objCausa = null;
}
Alguém sabe o que pode estar errado?
Nota: Depois retirei os outros atributos da classe entidade, deixando só a imagem e deu o mesmo erro, então o problema é nos dados carregados da imagem e passados ao Crystal. Num artigo do Macoratti falava de criar um DataSet com um campo type base64Binary, mas no VS 2008 não existe esse tipo de campo só Byte[] e outros, ou seja, o mesmo que usei nesse exemplo com classe.
Finalmente consegui amigos, tinha um segredinho. O Crystal não aceita a passagem direta de um objeto com arrays de bytes, então se tem que montar um dataset e criar a estrutura passando a sequencia assim:
Cria o DataSet, o DataTable e os campos que quer depois inclui normalmente no relatório (Nota Crystal v.10.5)
Agora no form que vai exibir o relatório (com o view) coloca isso como chamada:
Agora é só criar a função que faz tudo:
Como mágica funcionou. Afff......
Obrigado a todos pela ajuda.
Cria o DataSet, o DataTable e os campos que quer depois inclui normalmente no relatório (Nota Crystal v.10.5)
Agora no form que vai exibir o relatório (com o view) coloca isso como chamada:
cr.Database.Tables[[Ô]NomeTabelaDataSet[Ô]].SetDataSource(LogotipoCliente(caminho_imagemEmpresaLicenciada));
Agora é só criar a função que faz tudo:
public static DataTable LogotipoCliente(string ImageFile)
{
DataTable data = new DataTable();//cria um datatable
DataRow row;// cria row
data.TableName = [Ô]DataTable[Ô]; // [Ô]aqui vai o nome EXATO do DataTable q ta no relatorio[Ô];
data.Columns.Add([Ô]imagem[Ô], System.Type.GetType([Ô]System.Byte[][Ô])); //[Ô]aqui vai o nome EXATO da coluna do DataTable[Ô]
FileStream fs = new FileStream(ImageFile, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
row = data.NewRow();
row[0] = br.ReadBytes(int.Parse(br.BaseStream.Length.ToString()));
data.Rows.Add(row);
br = null;
fs.Close();
fs = null;
return data;
}
Como mágica funcionou. Afff......
Obrigado a todos pela ajuda.
Tópico encerrado , respostas não são mais permitidas