Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucascolferai

[Resolvido] Problema ao executar relatório do RAVE

Recommended Posts

Olá pessoal,

 

Estou com o seguinte problema. Na hora de chamar um relatório, ocorre um erro de "access violation". O erro ocorre na linha do Execute, do código abaixo:

if ibqAux.RecordCount > 0 then
  begin
	try
	  // LOG
	  insereLog ('Emitiu o Relatório de Clientes em Débito que Continuam Comprando.');

	  rpjRelatorio.Execute;
	except
	  MessageDlg('Um erro aconteceu na hora de visualizar o relatório. Por favor tente novamente.',mtError,[mbOK],0);
	  CriarLogErro(datadosistema, horadosistema, sExceptionAcao, 'Tentou visualizar o Relatório de Clientes em Débito que Continuam Comprando.');
	end;

	ibqAux.Close;
  end else
  begin
	ShowMessage ('Nenhum Registro Encontrado.');
  end;
O ibqAux (do tipo TIBQuery) é alimentado via SQL, que segue abaixo:

// ---------------------------------------------------------------------------
  // MONTA A SQL PARA AS PROMISSÓRIAS
  // Parte Inicial
  ibqAux.SQL.Text :=
	'SELECT PROMISSORIAS.PROCODIGO, PROMISSORIAS.PESCODIGO, PROMISSORIAS.PRODATEMI, PROMISSORIAS.PRODATVEN, '+
	'	   PROMISSORIAS.PRODATPAG, PROMISSORIAS.PRONPARCE, PROMISSORIAS.PROVALOR,  PROMISSORIAS.PROOBSERV, '+
	'	   PROMISSORIAS.PROPROMISSORIAATRASADA, PESSOAS.PESNOME, MODULO.MODNOME, MODULO.MODLOGIN '+
	'FROM PROMISSORIAS '+
	'LEFT JOIN PESSOAS ON (PROMISSORIAS.PESCODIGO = PESSOAS.PESCODIGO) '+
	'LEFT JOIN MODULO ON (PROMISSORIAS.MODCODIGO = MODULO.MODCODIGO) ';

  // Monta o WHERE
  ibqAux.SQL.Text := ibqAux.SQL.Text +
	'WHERE (PROMISSORIAS.PROPROMISSORIAATRASADA = '+QuotedStr('S')+') ';

  if (edtDatIni.Text <> '  /  /	') then
  begin
	ibqAux.SQL.Text := ibqAux.SQL.Text +
	  ' AND (PROMISSORIAS.PRODATEMI BETWEEN '+QuotedStr(FormatDateTime('mm/dd/yyyy',StrToDate(edtDatIni.Text)))+' AND '+QuotedStr(FormatDateTime('mm/dd/yyyy',StrToDate(edtDatFin.Text)))+') ';
  end;

  if (cbxModulo.ItemIndex <> -1) and (cbxModulo.ItemIndex <> 0) then
  begin
	ibqAux.SQL.Text := ibqAux.SQL.Text +
	  ' AND (MODULO.MODLOGIN = '+QuotedStr(cbxModulo.Items[cbxModulo.ItemIndex])+') ';
  end;

  if (iCodigo <> 0) then
  begin
	ibqAux.SQL.Text := ibqAux.SQL.Text +
	  ' AND (PROMISSORIAS.PESCODIGO = '+QuotedStr(IntToStr(iCodigo))+') ';
  end;

  // Finaliza a SQL
  ibqAux.SQL.Text := ibqAux.SQL.Text +
	'ORDER BY PROMISSORIAS.PESCODIGO, PROMISSORIAS.PROCODIGO ';

  ibqAux.Open;
  ibqAux.First;
  ibqAux.FetchAll;
Já tentei colocar uma DBGrid no form pra ver se a SQL gerava os dados corretamente e está tudo OK. Percebi que o erro acontece depois daquela telinha de preview, ou seja, exatamente na hora de carregar o relatório. Alias, criei o relatório via componente TRvProject, usando o designer dele. Nesse relatório tenho um agrupamento. Também adicionei um Direct DataView, que carregou os campos pré-existentes no TIBQuery do form (os quais criei manualmente). Seguem os campos:

TIBQuery

ibqAuxPROCODIGO: TIntegerField

FieldName = 'PROCODIGO'

ibqAuxPESCODIGO: TIntegerField

FieldName = 'PESCODIGO'

ibqAuxPRODATEMI: TDateField

FieldName = 'PRODATEMI'

ibqAuxPRODATVEN: TDateField

FieldName = 'PRODATVEN'

ibqAuxPRODATPAG: TDateField

FieldName = 'PRODATPAG'

ibqAuxPRONPARCE: TIntegerField

FieldName = 'PRONPARCE'

ibqAuxPROOBSERV: TStringField

FieldName = 'PROOBSERV'

Size = 255

ibqAuxPROPROMISSORIAATRASADA: TStringField

FieldName = 'PROPROMISSORIAATRASADA'

Size = 1

ibqAuxPESNOME: TStringField

FieldName = 'PESNOME'

Size = 50

ibqAuxMODNOME: TStringField

FieldName = 'MODNOME'

Size = 60

ibqAuxMODLOGIN: TStringField

FieldName = 'MODLOGIN'

Size = 30

ibqAuxPROVALOR: TIBBCDField

FieldName = 'PROVALOR'

Precision = 8

Size = 2

Eu já virei a Internet atrás de uma resposta, procurei aqui no fórum, em outros fóruns, em manuais do Rave, baixei video-aulas e nada. Simplesmente dá erro na hora de carregar o relatório. E a mensagem de erro não me dá nenhum informação a mais.

 

Penso que deve ser um erro elementar, pois estou dando os primeiros passos com o Rave Report, apesar de já ter trabalhado com outros geradores de relatórios da mesma categoria (como o ReportBuilder).

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na maioria das vezes, erros de Acess Violation significam objetos que estão sendo referenciados, porém não foram criados.

 

Clicando em cima do rpjRelatorio com o "Control" pressionado, não abre as classes do componente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, descoberto e resolvido o problema.

 

Costumo usar sempre nos meus projetos, um template inicial para os forms, onde eu encapsulo questões como Reconcile Error, manipulação de transações, gravação de logs, etc, além de criar uma padronização visual para as telas que são parecidas (como as de cadastro). Para o form do meu relatório, não é diferente. Tenho uma unit chamada untTplRelatorio, da qual herdo algumas características visuais e herdava também os componentes Rave já pré-configurados.

 

O problema é que o Rave considera como se existisse dois componentes TRvDataSetConnection, por causa da herança. E pior, os dois com o mesmo nome, por isso aparecia a mensage "Warning! Duplicate Design-time Data Connections found with name 'rdsRelatorio'". Mesmo abrindo apenas um form, a untTplRelatorio era carregada automaticamente, por motivos óbvios.

 

A solução: apaguei os componentes Rave da untTplRelatorio e coloquei apenas no novo form. E pronto. Funcionou como mágica. Tentei apenas renomear os componentes no form filho, mas o Delphi não me deixou fazer isso, pois eles já terem sido nomeados no form pai (template).

 

Na minha modesta opinião, trata-se de bug um do Rave, já que é muito comum o uso de templates, devido a facilidade de manutenção que eles proporcionam, etc, etc, etc. :)

 

Obrigado port3r pela opinião. Obrigado também aos que leram o post, mesmo sem ter emitido opinião.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.