Fórum Inadimplêntes #285796

22/06/2005

0

Olá, tudo bem?
Estou com alguma dúvida a respeito de uma consulta.
Eu tenho duas tabelas:

DOADORES
id
nome
endereco
telefone

PAGAMENTOS
id
id_doadores
valor
data

Eu gostaria de saber como eu faço para poder listar os clientes q não fizeram pagamento em um determinado período pesquisado. Fiz este SQL abaixo:
procedure Tfrm_doacoesporperiodo.RzBitBtn1Click(Sender: TObject);
Var
Inicio, Final : String;
Total : Double;
begin

If dataate.Date < datade.Date Then
   begin
      ShowMessage(´Intervalo de datas inválido, a data inicial é maior que a data final!´);
      dataate.Date := datade.Date;
   end
Else
   begin
      Inicio := DateToStr(datade.Date);
      Final := DateToStr(dataate.Date);
      dm.Rel_Doacao.Close;
      dm.Rel_Doacao.SelectSQL.Clear;
      dm.Rel_Doacao.SelectSQL.Text := ´select A.*, B.NOME from PAGAMENTO A, DOADORES B where PAGAMENTO.ID_DOADORES = DOADORES.ID and DATA>= :pInicial and DATA<= :pFinal´;
      dm.Rel_Doacao.ParamByName(´pInicial´).AsDateTime := StrToDate(Inicio);
      dm.Rel_Doacao.ParamByName(´pFinal´).AsDateTime := StrToDate(Final);
      dm.Rel_Doacao.Prepare;
      dm.Rel_Doacao.Open;
      QuickRep1.Preview;
   end;
end;

Esta consulta está funcionando perfeitamente, só que ele mostra pra mim todos os clientes q fizeram o pagamento em um determinado período mas o que eu gostaria de ter é todos os clientes que NÃO fizeram o pagamento. Por favor me ajudem....

Aguardo respostas,

Baco


Prof. Baco

Prof. Baco

Responder

Posts

23/06/2005

Motta

Qual bd ?

A tabela de pagamento só é gravada no ato do pagamento, não ?

Em Oracle 9 (suporta subqueries)


SELECT *
FROM DOADORES D
WHERE NOT EXISTS (SELECT NULL
                                FROM PAGAMANTOS P
                                WHERE P.ID_DOADORES = D.ID)

 


ALGUNS BD NAO ACEITAM ESTA SINTAXE

OU


SELECT ID FROM DOADORES
MINUS
SELECT ID_DOADORES FROM PAGAMENTO



ESTA É ANSI, CREIO.


Responder

Gostei + 0

23/06/2005

Prof. Baco

Olá Motta,

Consegui resolver o problema. O meu banco é o Interbase o código correto está embaixo:
procedure Tfrm_inadimplentes.RzBitBtn1Click(Sender: TObject);
Var
Inicio, Final, ordem : String;
begin
if RadioGroup1.ItemIndex = 0 then
   ordem := ´NOME´
else
   ordem := ´N_CARNE´;
If dataate.Date < datade.Date Then
   begin
      ShowMessage(´Intervalo de datas inválido, a data inicial é maior que a data final!´);
      dataate.Date := datade.Date;
   end
Else
   begin
      Inicio := DateToStr(datade.Date);
      Final := DateToStr(dataate.Date);
      dm.Rel_Doadores.Close;
      dm.Rel_Doadores.SelectSQL.Clear;
      dm.Rel_Doadores.SelectSQL.Text := ´SELECT * FROM DOADORES D WHERE NOT EXISTS (SELECT NULL FROM PAGAMENTO P WHERE P.ID_DOADORES = D.ID and P.DATA>= :pInicial and P.DATA<= :pFinal) order by ´+ordem;
      dm.Rel_Doadores.ParamByName(´pInicial´).AsDateTime := StrToDate(Inicio);
      dm.Rel_Doadores.ParamByName(´pFinal´).AsDateTime := StrToDate(Final);
      dm.Rel_Doadores.Prepare;
      dm.Rel_Doadores.Open;
      rel_filtro.Preview;
   end;
end;

Espero q venha ajudar outra pessoa...

Um Abraço....

Prof. Baco[/code]


Responder

Gostei + 0

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

Aceitar