Fórum Consulta SQL, furo de parcela. #309397
17/01/2006
0
Bom, quero fazer uma consulta em sql, que me mostre furos de pagamento. Ex. tenho o cliente que paga rigorosamente em dia, porem a 11 meses atras ele esqueceu de pagar aquela parcela. Como faco um relatorio que me mostre quais sao os clientes que tem esse tipo de furo nas parcelas ?
Obrigado.
Geisonc
Curtir tópico
+ 0Posts
17/01/2006
Motta
mas supondo seria algo assim :
SELECT C.NOME,P.DT_VENC,P.VALOR
FROM CLIENTES C,PARCELAS P
WHERE C.COD = P.CODCLI
AND P.DT_PGTO IS NULL
Gostei + 0
17/01/2006
Geisonc
Quero tirar um relatorio dos clientes que estao a 10 dias em atraso.
Até ai tudo bem, eu consegui, porem...
Porem se o cliente está devendo os 10 dias que eu estipulei e mais algum mes que nao foi pago ele, nao deve constar no relatorio.
A instrucao SQL está assim:
DataModule1.QProcCobranca.SQL.Clear; DataModule1.QProcCobranca.SQL.Add(´select * from arq_Hist where (grupo = :grupo) and(paga is null) and (venc between :data1 and :data2) order by venc´); Datamodule1.QProcCobranca.ParamByName(´grupo´).AsString:=ecidade.Items[ecidade.itemindex]; Datamodule1.QProcCobranca.ParamByName(´data1´).Asdate:=data1; Datamodule1.QProcCobranca.ParamByName(´data2´).Asdate:=data2; DataModule1.QProcCobranca.Open;
Nesta instrucao ele me mostra os clientes que estao devendo em um certo periodo...
mas eu quero que ele me motre somente dakele periodo, caso ele tenha outra parcela nao paga em outro mes, ele nao entre no relatorio.
Gostei + 0
17/01/2006
Motta
select * from parcelas p1 where ..... and not exists (select null from parcelas p2 where p2.chave = p1.chave and p2.data_parcela <> p1.data_parcela and p2.data_pgto is null)
Gostei + 0
17/01/2006
Geisonc
eu uso interbase/firebird...suporta sub-select ?
o que seriam esses P1 e P2 ? :oops:
Gostei + 0
17/01/2006
Host
from parcelas p1
where .....
and not exists (select null
from parcelas p2
where p2.chave = p1.chave
and p2.data_parcela <> p1.data_parcela
and p2.data_pgto is null) ´
Esta sql do nosso amigo MOTTA parece resolver teu problema. E o firebird suporta tranquilamente esta sql , ja a respeito do P1 e P2 , seriam como alias da tabela....
Ao inves de ter q digitar : parcelas.data_parcela
vc digitaria o alias da tabela no sql: p1.data_parcela
so que esta pesquisa ficaria meio lenta pq ele pesquisaria duas vezes na mesma tabela, mas vai ai testa , brinca um pouco com a sql, e mede a velocidade , ñ sei se o firebird deixa criar um ´view´ , seria interessante pois seriam bufers diferentes de pesquisa... poderiamos criar um post com esta discussão!!!Dois buffers um pra tabela e outro pro view... sei la... to falando mas nem sei se da de fazer view no interbase!!!
Vou ver isto!
Mas testa a solução do Motta , q dependendo da tua estrutura dará certo!
Desculpe a ignorancia, mas só pra mim entender o codigo...
eu uso interbase/firebird...suporta sub-select ?
o que seriam esses P1 e P2 ?
Gostei + 0
17/01/2006
Geisonc
Testando . . . .
Gostei + 0
17/01/2006
Motta
A melhor solução que vejo é um sub-select
select * from arq_Hist a1 where (grupo = :grupo) and (paga is null) and (venc between :data1 and :data2) and not exists (select * from arq_Hist a2 where (a2.grupo = a1.grupo) and (a2.paga is null) and (a2.venc <> a1.venc))
Gostei + 0
18/01/2006
Geisonc
tenho 200 000 registros na tabela...
alguma sugestao ?
Gostei + 0
18/01/2006
Motta
Gostei + 0
18/01/2006
Geisonc
A tabela arq_hist do GDB está assim:
"GRUPO" VARCHAR(5), "REFER" VARCHAR(5), "TIPODEB" VARCHAR(3), "VALOR" NUMERIC(5, 2), "VENC" DATE, "PAGA" DATE, "LANC" VARCHAR(1), "VALOR_PAGO"NUMERIC(12, 0), "USUARIO"VARCHAR(10), "VENCSEQ"DATE, "SEQ_LOC"NUMERIC(9, 0), "VALOR_GAR"NUMERIC(6, 0), "ORDEM" NUMERIC(4, 0), "CODCOBR"VARCHAR(3), "CANC_ALTZ"VARCHAR(1), "DATA" DATE, "EXPORTA"DATE, "DATAAUX"DATE, "VALOR_AUX"NUMERIC(12, 0), "SEQUENCIA"INTEGER, "INSCRICAO"FLOAT, "USUARIOSAF"VARCHAR(30), "EMUSO" VARCHAR(1)
Gostei + 0
18/01/2006
Motta
A demora deva ser talvez a falta de indices, dificil saber.
Gostei + 0
18/01/2006
Geisonc
Estou certo ?
Obrigado pela ajuda !
Gostei + 0
18/01/2006
Motta
Assim a tabela deve ter vinculo do cliente.
Gostei + 0
18/01/2006
Geisonc
este codigo:
select * from arq_hist a1 where (venc between :data1 and :data2) and (paga is null) and (grupo = :grupo) and not exists (select * from arq_hist a2 where (a2.paga is null) and (a2.inscricao = a1.inscricao) and (a2.venc <> a1.venc))
Como nao tem inscrição no primeiro select, ele verifica mesmo assim a inscricao ? pois se eu colocar para consultar a inscricao no primeiro select ele vai me trazer apenas a que eu colocar e nao todos o clientes... e colocando no segundo select, tenho duvidas se ele procura ...
bom, mesmo assim, neste caso ele ainda mostra clientes com varias parcelas em atraso...
Agradeço o empenho para me ajudar !
Gostei + 0
18/01/2006
Motta
select * from arq_hist a1 where (venc between :data1 and :data2) and (paga is null) and (grupo = :grupo) and (:DTHOJE - A1.VENC) >= :NUMDIAS not exists (select * from arq_hist a2 where (a2.paga is null) and (a2.inscricao = a1.inscricao) and (a2.venc <> a1.venc))
:DTHOJE - DATA DO DIA (EXISTE UMA FUNCTION PARA ISTO PROVALVEMENTE)
:NUMDIAS - NUM DE DIAS QUE VC QUER FILTRAR
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)