Duvidas com relarionamento mestre/detalhe e report builder?
Pessoal, tenho um select que uso para criar um cabeçalho no report builder assim
e outro select (detalhe) para trazer os vales dos condutores assim
esta tabela esta relacionada com a tabela acima através das propriedade MASTERFIELD = IDCONDUTOR e LINKEDFIELD = IDFUNCIONARIO
Que é o Id do funcionario.
Bom o meu problema é que preciso que no report builder emitir o relatorio independente se o condutor tem ou não VALE durante o periodo do filtro.
No subreport do report builder trago todos os vales dentro do ppdetails.
Eu chamo assim no aplicativo (aqui monta o filtro da primeira query zeos)
E aqui chamo a segunda query zeos aonde tem a tabela detalhe)
Tentei uma gambiarra na parte em vermelho pra ver se funcionava, mais não da certo.
Preciso saber como faço isso sem precisar criar mais de um relatório, usando apenas este relatório.
Obrigado
select td.idcondutor, td.nomecondutor, sum(xd.kms) Total_KM, count(xd.descrserv) Quantidade_Servicos, coalesce(sum(xd.vrlcondutor),0) Total_Codutor, (select case when (HORA/3600) < 10 then '0'||(HORA/3600) else (HORA/3600) end ||':'|| case when ((HORA-((HORA)/3600)*3600)/60) < 10 then '0'||((HORA-((HORA)/3600)*3600)/60) else ((HORA-((HORA)/3600)*3600)/60) end from ( select cast(sum( extract( hour from xd.horatotal ) * 3600 + extract( minute from xd.horatotal ) * 60 + extract( second from xd.horatotal ) ) as integer) as hora from servicos xd where td.idordem = xd.idordem and td.nomecondutor = xd.nomecondutor))as Total_Horas, (select coalesce(sum(vl.valor),0) from vale vl where td.idcondutor = vl.idfunciona and coalesce(vl.fechamov,'',null) <> 'F')as Total_Despesa from ordemserv td inner join servicos xd on td.idordem = xd.idordem and td.nomecondutor = xd.nomecondutor where td.nomecondutor = xd.nomecondutor and td.idcondutor between :idCondIni and :idCondFin and td.nomecondutor is not null and td.idordem = xd.idordem and td.emissao between :tddataini and :tddatafin group by td.idcondutor, td.nomecondutor
e outro select (detalhe) para trazer os vales dos condutores assim
select * from vale where idfunciona between :idcondutorini and :idcondutorfin and dtemissao between :xdataini and :xdatafin and coalesce(fechamov,'',null) <> 'F' order by dtemissao
esta tabela esta relacionada com a tabela acima através das propriedade MASTERFIELD = IDCONDUTOR e LINKEDFIELD = IDFUNCIONARIO
Que é o Id do funcionario.
Bom o meu problema é que preciso que no report builder emitir o relatorio independente se o condutor tem ou não VALE durante o periodo do filtro.
No subreport do report builder trago todos os vales dentro do ppdetails.
Eu chamo assim no aplicativo (aqui monta o filtro da primeira query zeos)
procedure TfrmFecha_Mov_Condutor._montaSQLFecha_Condutor;
begin
{Monta a tabela mestre baseado nos dados para o relatorio}
with qryFechaCond do
begin
close;
Params.ParamByName('idCondIni').asinteger := StrToInt( IDIni.Text );
Params.ParamByName('idCondFin').asinteger := StrToInt( IDFin.Text );
Params.ParamByName('tddataini').asdate := StrToDate( dtIni.Text );
Params.ParamByName('tddatafin').asdate := StrToDate( dtFin.Text );
open;
end;
end;E aqui chamo a segunda query zeos aonde tem a tabela detalhe)
procedure TfrmFecha_Mov_Condutor.btnsinteticoClick(Sender: TObject);
begin
if (radiogroup3.ItemIndex <> 0) then
begin
Pt_MessageDlg('Atenção! Para esta operação, selecione o Tipo de Movimentação '+#10#13+'Receita/Despesa Condutor para impressão do sintético.', mtInformation,[mbOK],0);
exit;
end else
begin
if dtIni.Date > dtFin.Date then
begin
Pt_MessageDlg('Data inicial não pode ser maior que a data final', mtError,[mbok],0);
dtIni.SetFocus;
exit;
end;
if (trim(dtIni.Text) = '') or (trim(dtFin.Text) = '') then
Pt_MessageDlg('Erro! Data em branco. Por favor complete com uma data válida.', mtError,[mbok],0)
else
{Monta a tabela mestre baseado nos dados para o relatorio}
_montaSQLFecha_Condutor;
{ Chama a tabela detalhe exatamente como esta na tabela mestre}
with qryValesFunc do
begin
close;
params[0].asInteger := StrToInt( IDIni.Text );
params[1].asInteger := StrToInt( IDFin.Text );
params[2].asDate := StrToDate( dtIni.Text );
params[3].asDate := StrToDate( dtFin.Text );
open;
if IsEmpty then
begin
_montaSQLFecha_Condutor;
ppReportFechaCondutor.PrintReport;
end else
begin
ppReportFechaCondutor.PrintReport;
end;
end;
end;
end;Tentei uma gambiarra na parte em vermelho pra ver se funcionava, mais não da certo.
Preciso saber como faço isso sem precisar criar mais de um relatório, usando apenas este relatório.
Obrigado
Adriano Dolce
Curtidas 0
Respostas
Sérgio Saibel
24/04/2010
Ola...
Já deu uma olhada em http://www.digital-metaphors.com:8080/
Existem muitos exemplos de aplicação para o RB. Também estou com problemas em encontrar respostas para dúvidas sobre o assunto, mas pelo visto temos que nos virar com o que temos, ali encontrei muita coisa.
Espero ter ajudado.
Já deu uma olhada em http://www.digital-metaphors.com:8080/
Existem muitos exemplos de aplicação para o RB. Também estou com problemas em encontrar respostas para dúvidas sobre o assunto, mas pelo visto temos que nos virar com o que temos, ali encontrei muita coisa.
Espero ter ajudado.
GOSTEI 0
Emerson Nascimento
24/04/2010
avaliando somente a tabela mestre não funciona?
procedure TfrmFecha_Mov_Condutor.btnsinteticoClick(Sender: TObject);
begin
if (radiogroup3.ItemIndex <> 0) then
Pt_MessageDlg('Atenção! Para esta operação, selecione o Tipo de Movimentação '+#10#13+'Receita/Despesa Condutor para impressão do sintético.', mtInformation,[mbOK],0)
else
begin
if (trim(dtIni.Text) = '') or (trim(dtFin.Text) = '') then
Pt_MessageDlg('Erro! Data em branco. Por favor complete com uma data válida.', mtError,[mbok],0)
else
if dtIni.Date > dtFin.Date then
begin
Pt_MessageDlg('Data inicial não pode ser maior que a data final', mtError,[mbok],0);
dtIni.SetFocus;
end
else
begin
{Monta a tabela mestre baseado nos dados para o relatorio}
_montaSQLFecha_Condutor;
{ Chama a tabela detalhe exatamente como esta na tabela mestre}
with qryValesFunc do
begin
close;
params[0].asInteger := StrToInt( IDIni.Text );
params[1].asInteger := StrToInt( IDFin.Text );
params[2].asDate := StrToDate( dtIni.Text );
params[3].asDate := StrToDate( dtFin.Text );
open;
end;
if not qryFechaCond.IsEmpty then
ppReportFechaCondutor.PrintReport;
end;
end;
end;
procedure TfrmFecha_Mov_Condutor.btnsinteticoClick(Sender: TObject);
begin
if (radiogroup3.ItemIndex <> 0) then
Pt_MessageDlg('Atenção! Para esta operação, selecione o Tipo de Movimentação '+#10#13+'Receita/Despesa Condutor para impressão do sintético.', mtInformation,[mbOK],0)
else
begin
if (trim(dtIni.Text) = '') or (trim(dtFin.Text) = '') then
Pt_MessageDlg('Erro! Data em branco. Por favor complete com uma data válida.', mtError,[mbok],0)
else
if dtIni.Date > dtFin.Date then
begin
Pt_MessageDlg('Data inicial não pode ser maior que a data final', mtError,[mbok],0);
dtIni.SetFocus;
end
else
begin
{Monta a tabela mestre baseado nos dados para o relatorio}
_montaSQLFecha_Condutor;
{ Chama a tabela detalhe exatamente como esta na tabela mestre}
with qryValesFunc do
begin
close;
params[0].asInteger := StrToInt( IDIni.Text );
params[1].asInteger := StrToInt( IDFin.Text );
params[2].asDate := StrToDate( dtIni.Text );
params[3].asDate := StrToDate( dtFin.Text );
open;
end;
if not qryFechaCond.IsEmpty then
ppReportFechaCondutor.PrintReport;
end;
end;
end;
GOSTEI 0
Adriano Dolce
24/04/2010
Ola pessoal, ainda não deu certo..Fiz como o Emerson falou, mais o report builder só mostra se tiver dados na tabela RECEITA e VALES do condutor. Se for só receita ele não mostra nada.
Nota: Este radiobutton dizendo se esta concluido ou não do forum não esta funcionando
procedure TfrmFecha_Mov_Condutor._Monta_ParamsSQL(aQry: TZQuery; aidCondIni, aidCondFin: Integer; aDataIni, aDataFin: TDateTime); begin with aQry do begin close; Params[0].AsInteger := aidCondIni; Params[1].AsInteger := aidCondFin; Params[2].AsDate := aDataIni; Params[3].AsDate := aDataFin; open; end; end;
procedure TfrmFecha_Mov_Condutor.btnsinteticoClick(Sender: TObject);
begin
if (radiogroup3.ItemIndex <> 0) then
Pt_MessageDlg('Atenção! Para esta operação, selecione o Tipo de Movimentação '+#10#13+'Receita/Despesa Condutor para impressão do sintético.', mtInformation,[mbOK],0)
else
begin
if (trim(dtIni.Text) = '') or (trim(dtFin.Text) = '') then
Pt_MessageDlg('Erro! Data em branco. Por favor complete com uma data válida.', mtError,[mbok],0)
else
if dtIni.Date > dtFin.Date then
begin
Pt_MessageDlg('Data inicial não pode ser maior que a data final', mtError,[mbok],0);
dtIni.SetFocus;
end
else
begin
{Monta a tabela mestre baseado nos dados para o relatorio}
_Monta_ParamsSQL(qryFechaCond,StrToInt( IDIni.Text ),StrToInt( IDFin.Text ),StrToDate( dtIni.Text ),StrToDate( dtFin.Text ));
{ Chama a tabela detalhe exatamente como esta na tabela mestre}
_Monta_ParamsSQL(qryValesFunc,StrToInt( IDIni.Text ),StrToInt( IDFin.Text ),StrToDate( dtIni.Text ),StrToDate( dtFin.Text ));
if not qryFechaCond.IsEmpty then
ppReportFechaCondutor.PrintReport;
end;
end;
end;Nota: Este radiobutton dizendo se esta concluido ou não do forum não esta funcionando
GOSTEI 0
Adriano Dolce
24/04/2010
Não resolvido ainda
GOSTEI 0
Victor Pereira
24/04/2010
Acho que quem postou já deve ter resolvido, mas para quem passou, como eu, por este problema, no pipeline do detalhe tem a propriedade SkipWhenNoRecords é só deixar ela como false.
GOSTEI 0