Array
(
)

CONSULTA DE CONTRATOS QUITADO NO PERÍODO

Marlos Silva
   - 14 fev 2015

quero fazer uma busca com a tabela de parcelas para mostrar quais os contratos foram terminado de ser quitados por completos em um período.
Lembrando que quero o resultado da ultima parcela se a situação da mesma = 'L' de Liquidada e a data de pgto seja a mesma data
do filtro que escolhi.
dados da tabela caso queiram criar a mesma:
CREATE TABLE TB_PARCELA (
PAR_CODIGO INTEGER NOT NULL,
VEN_CODIGO INTEGER,
CLI_CODIGO INTEGER,
CLI_NOME VARCHAR(30),
PAR_QTDEPARC INTEGER,
PAR_VALORPARC NUMERIC(15,2),
PAR_NUMPARCELA INTEGER,
PAR_VALORNOTA NUMERIC(15,2),
PAR_HAVER NUMERIC(15,2),
PAR_SITUACAO CHAR(1) DEFAULT 'A',
PAR_DTPGTO DATE,
PAR_DTVENC DATE
);

Alimentação da tabela caso queiram alimentar a mesma:
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (1, 1, 10, 'JOAO FULANO', 5, 50, 1, 250, 0, 'L', '2014-06-01', '2014-09-01');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (2, 1, 10, 'JOAO FULANO', 5, 50, 2, 250, 0, 'L', '2014-07-01', '2014-10-01');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (3, 1, 10, 'JOAO FULANO', 5, 50, 3, 250, 0, 'L', '2014-07-01', '2014-11-01');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (4, 1, 10, 'JOAO FULANO', 5, 50, 4, 250, 0, 'L', '2014-09-01', '2014-12-01');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (6, 5, 5, 'SENHOR BEUTRANO', 3, 100, 1, 300, 0, 'L', '2014-12-01', '2014-12-10');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (7, 5, 5, 'SENHOR BEUTRANO', 3, 100, 2, 300, 0, 'L', '2014-12-01', '2015-02-05');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (8, 10, 25, 'SICRANO DA SILVA', 3, 25, 1, 25, 0, 'L', '2014-12-01', '2015-01-02');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (5, 1, 10, 'JOAO FULANO', 5, 50, 5, 250, 0, 'L', '2014-12-01', '2015-01-01');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (11, 5, 5, 'SENHOR BEUTRANO', 3, 100, 3, 300, 0, 'A', NULL, NULL);
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (9, 10, 25, 'SICRANO DA SILVA', 3, 25, 2, 25, 0, 'L', '2014-12-01', '2015-02-05');
INSERT INTO TB_PARCELA (PAR_CODIGO, VEN_CODIGO, CLI_CODIGO, CLI_NOME, PAR_QTDEPARC, PAR_VALORPARC, PAR_NUMPARCELA, PAR_VALORNOTA, PAR_HAVER, PAR_SITUACAO, PAR_DTPGTO, PAR_DTVENC) VALUES (10, 10, 25, 'SICRANO DA SILVA', 3, 25, 3, 25, 0, 'A', NULL, '2015-03-06');
a tabela criada e alimentada ficará mais ou menos desse jeito.
tabela criada e preenchida (Clique na imagem para abrir em uma nova janela)

faço meu código mais ele traz apenas algumas parcelas ex:

SQL usado na minha pesquisa e esta saindo diferente do resultado que quero  (Clique na imagem para abrir em uma nova janela)
Resultado que mostra (Clique na imagem para abrir em uma nova janela)

Marisiana
   - 14 fev 2015

Olá Marlos!
Não entendi porque utilizastes o NOT EXISTS no teu SELECT....
Pelo que descrevestes, um SELECT como esse resolveria:
#Código

SELECT P.VEN_CODIGO,
      P.CLI_CODIGO,
      P.CLI_NOME,
      P.PAR_NUMPARCELA,
      P.PAR_SITUACAO,
      MAX(PAR_DTPGTO) AS DATA_PGTO,
      MAX(P.PAR_NUMPARCELA) AS PAR_NUMPARCELA
FROM TB_PARCELA P
WHERE P.PAR_SITUACAO = 'L'
AND P.PAR_DTPGTO =:DATA
GROUP BY P.VEN_CODIGO,
      P.CLI_CODIGO,
      P.CLI_NOME,
      P.PAR_NUMPARCELA,
      P.PAR_SITUACAO

Não cheguei a testar o código... me avise se é isso ou não..

Marlos Silva
   - 14 fev 2015

obrigado pela sua ajuda!
o código de funcionar, funciona...
só que o resultado dele não pega apenas a ultima parcela que o meu caso, e nem mostra se a ultima parcela foi pago de fato no sistema...

ex: tenho duas parcelas 01 e 02 ambas pagas no mesmo dia.

preciso que ele me mostre apenas a segunda, mesmo que exista outras parcelas do mesmo contrato com as datas de pagamentos iguais.

Marisiana
   - 19 fev 2015

Estranho porque eu fiz um teste aqui em uma base semelhante e funcionou...

Rrubinho
   - 19 fev 2015

Conseguiu resolver, Marlos ?

O comando funcionou da forma que você quer tirando o P.PAR_NUMPARCELA da lista de campos e do group by, sem a necessidade do sub-select.
Acho que é isso, veja:

#Código

SELECT P.VEN_CODIGO,
      P.CLI_CODIGO,
      P.CLI_NOME,
      P.PAR_SITUACAO,
      MAX(PAR_DTPGTO) AS DATA_PGTO,
      MAX(P.PAR_NUMPARCELA) AS PAR_NUMPARCELA
FROM TB_PARCELA P
WHERE P.PAR_SITUACAO = 'L'
AND P.PAR_DTPGTO =:DATA
GROUP BY P.VEN_CODIGO,
      P.CLI_CODIGO,
      P.CLI_NOME,
      P.PAR_SITUACAO