Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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?
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
Alguém sabe onde posso achar os fontes do Rave, pra mim tentar debugar por ele?