PRIMEIROS PASSOS CRYSTAL REPORT

LUIS.HERRERA 07/03/2014 08:55:35
#435636
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:
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.
LUIS.HERRERA 10/03/2014 16:31:39
#435787
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:

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.
Página 4 de 4 [32 registro(s)]
Tópico encerrado , respostas não são mais permitidas