Fórum Duvidas com relarionamento mestre/detalhe e report builder? #376262

24/04/2010

0

Pessoal, tenho um select que uso para criar um cabeçalho no report builder assim
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

Adriano Dolce

Responder

Posts

03/05/2010

Sérgio Saibel

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.
Responder

Gostei + 0

04/05/2010

Emerson Nascimento

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;
Responder

Gostei + 0

04/05/2010

Adriano Dolce

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.

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

Responder

Gostei + 0

11/09/2010

Adriano Dolce

Não resolvido ainda
Responder

Gostei + 0

30/04/2016

Victor Pereira

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar