Anda di halaman 1dari 16

Gerenciando Data Connections com Rave Reports

Data Connections possuem diversos eventos que podem ser utilizados para personalizar a forma como os dados so enviados para o relatrio. Nos casos de Data Connections ligados a banco de dados (RvDataSetConnection, RvTableConnection e RvQueryConnection), usamos basicamente o evento OnValidateRow para determinar se a informao deve ou no ser impressa. No caso do RvCustomConnection, devemos utilizar estes eventos para acessar os dados. Mesmo para um RvDataSetConnection, podemos obter um nvel maior de personalizao utilizando estes eventos Eles possuem duas propriedades do tipo Integer, DataIndex e DataRows: DataIndex: Determina a posio do cursor. A primeira linha 0 DataRows: Determina a quantidade de registros

Eventos
y y y y y y y y y y y

OnEOF OnFirst OnGetCols OnGetRow OnGetSorts OnNext OnOpen OnRestore OnSetFilter OnSetSort OnValidateRow

OnGetCols
OnGetCols o evento disparado quando o Rave necessita de informao de metadados. O manipulador do evento possui um parmetro chamado Connection, do tipo TRvCustomConnection, que representa o Data Connection atual. Normalmente fazemos uma chamada ao mtodo WriteField para cada campo a ser exibido. O mtodo WriteField definido da seguinte forma:
procedure WriteField(Name: string;

DataType: TRpDataType; Width: integer; FullName: string; Description: string);

Name representa o nome do campo e deve conter somente caracteres alfanumricos. DataType o tipo de dado que este campo representa e deve ser de um dos seguintes valores. dtString dtDate

dtInteger

dtTime

dtBoolean

dtDateTime

dtFloat

dtBlob

dtCurrency

dtMemo

dtBCD

dtGraphic

Width o comprimento do campo. FullName um nome mais descritivo do campo e pode conter espaos e outros caracteres. Description uma descrio do campo.
procedure TDataForm.CustomCXNGetCols(Connection: TRvCustomConnection); begin with Connection do begin WriteField('Index',dtInteger,8, 'Index Field','Description 1'); WriteField('Name',dtString,30, 'Name Field','Description 2'); WriteField('Amount',dtFloat,20, 'Amount Field','Description 3'); end; end;

OnOpen
Evento disparado na inicializao de uma sesso de dados. Neste evento podemos abrir arquivos de dados, inicializar variveis, etc.

procedure TDataForm.CustomCXNOpen(Connection: TRvCustomConnection); begin AssignFile( DataFile,'DATAFILE.DAT'); Reset(DataFile,1); end;

OnFirst
Evento chamado para posicionar o cursor na primeira linha de dados.
procedure TDataForm.CustomCXNFirst(Connection: TRvCustomConnection); begin Seek(DataFile,0); BlockRead(DataFile, DataRecord, SizeOf(DataRecord), DataRead); end;

OnNext
Evento chamado para mover o cursor para a prxima linha de dados.
procedure TDataForm.CustomCXNNext(Connection: TRvCustomConnection); begin BlockRead(DataFile, DataRecord, SizeOf(DataRecord),DataRead); end;

OnEOF
Evento utilizado para determinar se o cursor est alm de EOF.
procedure TMainForm.CustomCXNEOF(Connection: TRvCustomConnection; var EOF: Boolean); begin EOF := DataRead < SizeOf(DataRecord); end;

OnGetRow
Este evento chamado para recuperar os dados para a linha atual. Existem diversos mtodos utilizados para escrever os dados em um buffer especial utilizado Rave. A ordem e tipo dos campos devem coincidir com as definies criadas no evento OnGetCols.

WriteStrData(FormatData: string; NativeData: string) WriteIntData(FormatData: string; NativeData: Integer) WriteBoolData(FormatData: string; NativeData: Boolean) WriteFloatData(FormatData: string; NativeData: extended) WriteCurrData(FormatData: string; NativeData: Currency) WriteBCDData(FormatData: string; NativeData: Currency) WriteDateTimeData(FormatData: string; NativeData: TDateTime) WriteBlobData(var Buffer; Len: LongInt) WriteNullData

Como dito, a ordem em que os dados so passados deve coincidir com a ordem dos campos no evento OnGetCols;
procedure TDataForm.CustomCXNGetRow(Connection: TRvCustomConnection); begin with Connection do begin WriteIntData('',DataRecord.IntField); WriteStrData('',DataRecord.StrField); WriteFloatData('',DataRecord.FloatField); end; end;

OnValidateRow
Para cada linha de dado, o evento OnValidateRow chamado. Permite controlar se a linha atual deve ser includa ou no no relatrio. Geralmente, nos Data Connections ligados a dados, o nico evento a ser personalizado.
procedure TDataForm.CustomCXNValidateRow( Connection: TRvCustomConnection; var ValidRow: Boolean); begin ValidRow := DataRecord.FloatField >= 0.0; end;

OnRestore

O evento OnRestore chamado para encerrar uma sesso e a retornar ao estado anterior. Aqui podemos fechar um arquivo, liberar recursos, etc.
procedure TDataForm.CustomCXNRestore(Connection: TRvCustomConnection); begin CloseFile(DataFile); end;

Relatrios com Grfico usando CustomDataSet's Crie uma aplicao Win32 no RAD Studio. Adicione os seguintes componentes:

Componente TDBChart TSQLConnection TSQLDataSet TdataSetProvider TClientDataSet

Nome DBChartGrafico Conexao SdsSales DspSales CdsSales

No CommandText adicione a seguinte instruo SQL: select c.CUST_NO, c.CUSTOMER, s.CUST_NO, s.ORDER_DATE, s.TOTAL_VALUE from CUSTOMER c, SALES s where s.CUST_NO = c.CUST_NO

Com base que a conexo com o banco de dados esta realizada. V no DBChart clique com o boto direito, selecione a opo EditChar.

Com a aba Chart selecionada escolha a aba interna Series e clique no boto Add, escolha Pie e clique Ok:

Selecione a aba Series, aba interna DataSource e configure como na figura:

Para criar uma conexo com o Rave adicione o componente RVCustomConnection e renomeie para rvccChart. No podemos utilizar o RvDataSetConnection, pois os dados vem do grfico do form, no de um DataSet. Todo trabalho ser feito em cdigo, pois no existe nenhuma propriedade a ser ligada. Adicione a clusula uses a unit RPTChart, v no componente no rvccChart, nos eventos OnGetCols e OnGetRow para inserimos os seguintes cdigos respectivamente.
procedure TForm1.rvccChartGetCols(Connection: TRvCustomConnection); begin Connection.Write Field( 'Grafico', dtGraphic, 0, EmptyStr, EmptyStr); end;

Estamos criando um campo do tipo dtGraphic chamado Grafico que ser importado em um DataView do Rave.
procedure TForm1.rvccChartGetRow(Connection: TRvCustomConnection); begin WriteChartData( Connection, DBChartGrafico); end;

Para importar os dados no Rave necessrio que a aplicao esteja em execuo e o DataSet ativado. Ento deixa sua aplicao em execuo e v para o Rave. Crie um novo projeto de relatrios. Adicione um DataView, selecione o DirectDataView. Ser exibido o componente adicionado no delphi como na figura abaixo .

Adicione a Region e um Band no seu relatrio. Nesta Band adicione um MetaFile.

Selecione o MetaFile e Configure da seguinte forma:

Execute o relatrio e confira os resultados.

Gerando Relatrios de Arquivos XML Neste exemplo usaremos o arquivo Customer.xml que se encontra na pasta c:\Arquivos de programas\Arquivos comuns\CodeGear Shared\Data (supondo que tenha sido feita a instalao padro) ou (C:\Program Files\Common Files\CodeGear Shared\Data), copie este arquivo para a pasta onde est salvo o projeto. A estrutura do arquivo Customer.xml pode ser visualizada pelo exame de um de seus ns:
<Customer> <CUSTOMER>Kauai Dive Shoppe</CUSTOMER> <CITY>Kapaa Kauai</CITY> <COUNTRY>US</COUNTRY> </Customer>

Existem alguns ns Customer (raiz) com trs ns aninhados: CUSTOMER, CITY e COUNTRY, no exemplo varreremos o arquivo enviando para o relatrio os dados nele contidos. Adicione um componente TXMLDocument aplicao, nenhuma configurao necessria, adicione tambm um componente RvCustomConnection. Declare um campo Node do tipo IXMLNode na sesso Private do form/DataModule. Vamos programar o manipulador do evento OnOpen do RvCustomConnection:
XMLDocument1.LoadFromFile('Customer.xml'); XMLDocument1.Active := true; Node := XMLDocument1.DocumentElement.ChildNodes.FindNode('Customer');

O arquivo carregado no XMLDocument que ento ativado, atribumos o contedo do N Customer ao campo Node. No evento OnEOF do RvCustomConnection informamos ao Rave que o fim chegou quando o campo Node no contiver mais nenhum objeto instanciado: Eof := not Assigned(Node); No evento OnGetCols criamos os trs campos que sero enviados ao Rave:
Connection.WriteField('CUSTOMER', dtString, 60, EmptyStr, EmptyStr); Connection.WriteField('CITY', dtString, 30, EmptyStr, EmptyStr); Connection.WriteField('COUNTRY', dtString, 30, EmptyStr, EmptyStr);

No evento OnGetRow utilizamos o mtodo WriteStrData do RvCustomConnection para informar ao Rave os valores que devem ser passados aos campos criados no evento OnGetCols, observe que os dados devem seguir a ordem da criao dos campos.
Connection.Wri teStrData(EmptyStr, Node.ChildNodes.Nodes[0].Text); Connection.WriteStrData(EmptyStr, Node.ChildNodes.Nodes[1].Text); Connection.WriteStrData(EmptyStr, Node.ChildNodes.Nodes[2].Text);

Node := Node.NextSibling;

Com a aplicao em execuo importe o DataView no Rave e crie o relatrio.

Concluso O Rave Reports possui diversos recursos avanados que so pouco explorados. Aqui mostrei apenas um exemplo. Melhore, extenda e compartilhe. At a prxima.
Adilson Jr adilsonjr@tdstecnologia.com.br

Diretor de Tecnologia da TDS, centro de treinamentos oficiais CodeGear/Borland/Embarcadero no Rio de Janeiro. Professor, palestrante, conferencista, certificado CodeGear RAD Studio 2007, StarTeam e CaliberRM. Atua como Arquiteto, na rea de anlise e desenvolvimento orientado a objetos em C# h 2 anos e em Delphi h mais de 12 anos. Atualmente trabalha com treinamentos, consultoria e desenvolvimento de solues para as plataformas Win32 e .NET.

Nomeando um relatrio no spool de impresso do windows

{Inclua na seo uses: Printers Antes de enviar seu relatrio, faa assim:}

Printer.Title := ' Nome do relatrio ';

{Esta soluo aplica -se perfeitamente aos relatrios feitos usando o objeto Printer. Nos casos de geradores de relatrios, estes provavelmente possuem uma propriedade equivalente. }

de entender o Rave... tarefa no to fcil, visto que existem alguns "macetes" para fazer isso!!

ave - usando select com parmetros Com o Delphi 7 veio a necessidade

Quando comecei a usar o Rave, me deparei com um problema... ele funcionava bem quando tinha que fazer um SELECT da tabela inteira, mais dava erro todas as vezes que eu tentava usar um SELECT com parmetros... Fiz vrias peguntas em vrios Fruns e ningum soube me dizer como solucionar esse problema...Ento resolvi es crever sobre, para ajudar algum que possa ter o mesmo problema que eu!!

Eu usava a conexo via ADO no Delphi, um RvDataSetConnection e um Rvproject no form, ento eu definia o Dataset do RvDataSetConnection e o ProjectFile do Rvproject, eu colocava o c digo SQL que queria na propriedade SQL do ADOQuery, no prrpio object inspector... ento abria o Rave criava um Direct Data View e pronto, l estavam meus campos e eu podia montar o meu relatrio apenas arrastando os campos para os Bands e DataBands...(se gurando o CTRL).

Mais o que fazer quando o SELECT era apenas de um certo cdigo e eu precisava usar parametros dentro do SELECT???

No dava certo por nada... o Rave no reconhecia o parmetro que era passado via cdigo pelo Delphi...Alis ele no re conhecia nem mesmo o SELECT se esse fosse passado para a ADOQuery por cdigo (fora da propriedade SQL do object inspector).

A Soluo!!

Continuei usando a Conexo ADO no Delphi, um RvDataSetConnection e um Rvproject no form... mais eu coloquei o cdi go SQL em um boto que seria usado para executar o relatrio... fiz tudo normal como estava acostumada...

coloquei o cdigo SQL no boto: depois defini o DataSet do RvDataSetConnection: dados.ADOQuery1.SQL.Clear; dados.ADOQuery1.SQL.Add(' select * fro m tabela where codigo=:cod '); dados.ADOQuery1.Parameters[0].Name:=' cod'; dados.ADOQuery1.Parameters[0].Value:=edit1.Text; dados.ADOQuery1.Open; rvdatasetconnection1.DataSet:=dados.ADOQuery1;

Ai vem o detalhe...

Execute a aplicao e clique no boto que executa o cdigo acima ... ento abra o rave e crie a sua Direct Data View e pronto, l estaro os campos e vc pode montar o relatrio apenas arrastando os campos para os Bands e DataBands...(segurando o CTRL). Imp ortante! vc precisa manter a Aplicao executando enquanto monta o Relatrio.

Ento quando o relatrio estiver pronto voc define a propriedade ProjectFile do RvProject e inclui o seguinte cdigo no boto:

RvProject1.Execute;

e pronto seu relatrio est funcionando...

Giselle Alves gisaalvesdasilva@hotmail.com


Rave report - como acessar valores nos eventos internos

O Rave Reports possui eventos internos visveis somente dentro de sua prpria IDE, eventos estes que trabalham com uma linguagem prpria de scripts, a qual at o momento ainda no encontramos documentao a respeito, contudo, em cima de testes estamos conseguindo desvendar o caminho das pedras. Por exemplo, para acessar um determinado valor no evento OnBeforePrint de uma banda do Rave, bastar acessar diretamente via campo gerado pelo DataView:

if DataView1VendorName.AsString = Cacor Corporation then Text2.Text := DataView1VendorName.AsString; end if;


Rave report - evento ongetgroup da band - if num campo da dataview

If DataView1VendorName.AsString = 'Cacor Corporation ' then Text2.Text := DataView1VendorName.AsString; end if;

Rave report - passando parmetros para o relatrio

Para criar um parmetro dentro do Rave faa o seguinte:

Selecione a pgina do relatrio e acesse a propriedade Parameters, dentro desta propriedade escreva o nome do seu parmetro, exemplo PAnoMes.

Depois coloque um componente DataText e na propriedade DataField clique no boto (...). Agora no combo Project Parameters selecione o

parmetro que foi criado e pressione o boto Insert Parameter. Pronto o parmetro ser impresso neste componente DataText.

Para passar o valor do

Delphi

para o Rave utilize o seguinte comando:

Rpt_Projeto.Open; { Passa parametro para o relatrio para DataText do cabealho } Rpt_Projeto.SetParam(PAnoMes, Mes.Text+/+Ano.Text); Rpt_Projeto.ExecuteReport(RelFat ); Rpt_Projeto.Close;
imprimir

no

Rave reports mandar dados prontos pro relatorio

{Pela limitao do rave ou pela dificuldade em fazer novos cdigos vc pode aproveitar os clculos j prontos no delphi ou textos q vc deseja repetir no relatrio, e jogar prontos pro rave O Rave fornece um componente chamado TrvCustomConnection que resolve esses problemas.}

//Ponha um TRvCustomConnection em um formulrio

//Adicione estas variaveis globais var Arr_nfcod: array[0..2,0..2] of string; i: byte;

// Evento OnOpen do rvCustomConnection (valores pros campos):

procedure TForm1.RvCustomConnection1Open(Connection: TRvCustomConnection); begin

Arr_nfcod[0,0] := ' 123'; Arr_nfcod[0,1] := ' 1001'; Arr_nfcod[0,2] := ' UN'; Arr_nfcod[1,0] := ' 124'; Arr_nfcod[1,1] := ' 1002'; Arr_nfcod[1,2] := ' UN'; end;

// Evento OnGetCols do rvCustomConnection (campos):

procedure TForm1.RvCustomConnection1GetCols( Connection: TRvCustomConnection); begin Connection.WriteField(' Coluna1',dtString, 10,'',''); Connection.WriteField(' Coluna2',dtString, 10,'',''); Connection.WriteField(' Coluna3',dtString, 10,'',''); end;

// Evento OnGeRows do rvCustomConnection (dados):

procedure TForm1.RvCustomConnection1GetRow(Connection: TRvCustomConnection); begin Connection.WriteStrData('', Arr_nfcod[i,0]); Connection.WriteStrData('', Arr_nfcod[i,1]); Connection.WriteStrData('', Arr_nfcod[i,2]); Inc(i); end;

// Evento OnEof do rvCustomConnection (quando a

hora

de parar ?):

procedure TForm1.RvCustomConnection1EOF(Connection: TRvCustomConnection; var Eof: Boolean); begin Eof := i = Length(Arr_nfcod); if Eof then i := 0; end;

//Visualizao do relatrio:

procedure TForm1.btnVisualizarRelatorioClick(Sender: TObject); begin RvProject1.Execute end;

{Ateno: Para que o Rave possa pegar as informaes dos dados, necessrio que a aplicao esteja em execuo Agora abra o designer do Rave e crie um Data Object, selecione um Direct DataView, selecione seu RvCustomConnection e pronto! Todas as colunas do array p rontas para serem utilizadas no relatrio.}

Anda mungkin juga menyukai