Fórum Duvidas com relarionamento mestre/detalhe e report builder? #376262
24/04/2010
0
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
Curtir tópico
+ 0Posts
03/05/2010
Sérgio Saibel
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
04/05/2010
Emerson Nascimento
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
04/05/2010
Adriano Dolce
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
11/09/2010
Adriano Dolce
Gostei + 0
30/04/2016
Victor Pereira
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)