Query inteligente mas complexa, para mim.
Olá, o problema é o seguinte:
Tenho duas tabelas (CARNÊ e CARNÊ PRESTAÇÕES):
O carnê pode ter qualquer número de prestações. Preciso fazer uma query que relacione quais carnês estão com a data de pagamento atrasada.
Obrigado
Tenho duas tabelas (CARNÊ e CARNÊ PRESTAÇÕES):
CREATE TABLE CARNE ( ID_CARNE INTEGER NOT NULL, NU_CARNE INTEGER NOT NULL, NU_VALOR NUMERIC(9,2) NOT NULL, DT_AQUISICAO DATE DEFAULT CURRENT_DATE NOT NULL ST_NOME VARCHAR(50) NOT NULL COLLATE PXW_INTL850, NU_PRESTACOES SMALLINT DEFAULT 12 NOT NULL );
CREATE TABLE CARNE_PRESTACAO ( ID_CARNE INTEGER NOT NULL, DT_PAGAMENTO DATE DEFAULT CURRENT_DATE NOT NULL, NU_VALOR_PAGO NUMERIC(9,2) NOT NULL, NU_PRESTACAO SMALLINT DEFAULT 1 NOT NULL ); ALTER TABLE CARNE_PRESTACAO ADD CONSTRAINT FK_CARNE_PRESTACAO FOREIGN KEY (ID_CARNE) REFERENCES CARNE (ID_CARNE) ON DELETE CASCADE ON UPDATE CASCADE;
O carnê pode ter qualquer número de prestações. Preciso fazer uma query que relacione quais carnês estão com a data de pagamento atrasada.
Obrigado
Tenil
Curtidas 0
Respostas
Beppe
05/07/2004
A sugestão que minha vasta experiência pode pode lhe proporcionar é:
1) Adicione um novo campo(BO_PAGO INTEGER NOT NULL) em CARNE_PRESTACAO;
2) A sua query pegará as linhas com BO_PAGO = 0 e DT_PAGAMENTO < data atual.
Boa sorte.
1) Adicione um novo campo(BO_PAGO INTEGER NOT NULL) em CARNE_PRESTACAO;
2) A sua query pegará as linhas com BO_PAGO = 0 e DT_PAGAMENTO < data atual.
Boa sorte.
GOSTEI 0
Motta
05/07/2004
ACHO QUE SEU MODELO ESTÁ ERRADO !!
DT_PAGAMENTO DATE DEFAULT CURRENT_DATE NOT NULL,
NOT NULL ? É SE NÃO FOR PAGO
ACHO QUE FALTA UMA DATA DE VENCIMENTO EM PRESTACAO POIS O DIA DO VENCIMENTO PODE VARIAR , SABADOS DOMINGOS FERIADOS
COM ESTE MODELO A QUERY FICA SEM DIFICIL POIS VC TERÁ QUE CALCULAR TODA A DATA DE VENCIMENTO ...
DT_PAGAMENTO DATE DEFAULT CURRENT_DATE NOT NULL,
NOT NULL ? É SE NÃO FOR PAGO
ACHO QUE FALTA UMA DATA DE VENCIMENTO EM PRESTACAO POIS O DIA DO VENCIMENTO PODE VARIAR , SABADOS DOMINGOS FERIADOS
COM ESTE MODELO A QUERY FICA SEM DIFICIL POIS VC TERÁ QUE CALCULAR TODA A DATA DE VENCIMENTO ...
GOSTEI 0
Afarias
05/07/2004
DT_PAGAMENTO DATE DEFAULT CURRENT_DATE NOT NULL,
NOT NULL ? É SE NÃO FOR PAGO
Acredito Motta, que esta é a data de VENCIMENTO (quando deve ser paga a prestação) e não da data de efetivação do pagamento :)
Dentro do q o Beppe falou fica beleza! Ou como vc colocou, usando + 1 campo para conter a data do pagamento pelo cliente.
T+
GOSTEI 0
Motta
05/07/2004
eu faria ...
CREATE TABLE CARNE_PRESTACAO (
ID_CARNE INTEGER NOT NULL,
dt_vencimento date not null
DT_PAGAMENTO DATE NULL,
NU_VALOR_PAGO NUMERIC(9,2) NOT NULL,
NU_PRESTACAO SMALLINT DEFAULT 1 NOT NULL
);
cada prestação poderia ter um dia de vencimento diferente, sab/dom/feriados etc.
para ver atrasos
select *
from carne_prestacao
where dt_pagamento is null or
dt_pagamento > dt_vencimento
existem outras soluções claro !!
CREATE TABLE CARNE_PRESTACAO (
ID_CARNE INTEGER NOT NULL,
dt_vencimento date not null
DT_PAGAMENTO DATE NULL,
NU_VALOR_PAGO NUMERIC(9,2) NOT NULL,
NU_PRESTACAO SMALLINT DEFAULT 1 NOT NULL
);
cada prestação poderia ter um dia de vencimento diferente, sab/dom/feriados etc.
para ver atrasos
select *
from carne_prestacao
where dt_pagamento is null or
dt_pagamento > dt_vencimento
existem outras soluções claro !!
GOSTEI 0
Tenil
05/07/2004
A data de vencimento da 1ª prestação é 1 mês após a data de aquisição.
A data de vencimento da 2ª prestação é 2 mêses após a data de aquisição.
A data de vencimento da 3ª prestação é 3 mêses após a data de aquisição.
E por aí vai.
A data de vencimento da 2ª prestação é 2 mêses após a data de aquisição.
A data de vencimento da 3ª prestação é 3 mêses após a data de aquisição.
E por aí vai.
GOSTEI 0
Tenil
05/07/2004
ACHO QUE SEU MODELO ESTÁ ERRADO !!
DT_PAGAMENTO DATE DEFAULT CURRENT_DATE NOT NULL,
NOT NULL ? É SE NÃO FOR PAGO
Eu acho que o modelo não está errado, não está é muito prático.
Não, toda vez que uma prestação é paga, cria-se na tabela filha (CARNE_PRESTACAO) um registro. Por isso a DT_PAGAMENTO é NOT NULL.
ACHO QUE FALTA UMA DATA DE VENCIMENTO EM PRESTACAO POIS O DIA DO VENCIMENTO PODE VARIAR , SABADOS DOMINGOS FERIADOS
COM ESTE MODELO A QUERY FICA SEM DIFICIL POIS VC TERÁ QUE CALCULAR TODA A DATA DE VENCIMENTO ...
As datas de vencimento são como fiz no post anterior.
Mas vc tem razão, não está nada prático. Por favor, continue me ajudando.
GOSTEI 0
Motta
05/07/2004
tudo bem, aí o não pagamento se dá pela inexistencia do registro da prestacao, nao sei o sql do interbase mas no racle temos
add_months , funcao que soma x meses a uma data
not exists - indica se tal registre existe
select *
from carne c
where not exists (select null
_______________from carne_prestacao cp
_______________where cp.id = c.id
_______________and add_months(c.dt_aquis,x) = cp.dt_pagamento)
x é o nº da prestacao (x-1 se vencer a primeira na data ...)
o problema e a function add_months no caso
espero ter ajudado
add_months , funcao que soma x meses a uma data
not exists - indica se tal registre existe
select *
from carne c
where not exists (select null
_______________from carne_prestacao cp
_______________where cp.id = c.id
_______________and add_months(c.dt_aquis,x) = cp.dt_pagamento)
x é o nº da prestacao (x-1 se vencer a primeira na data ...)
o problema e a function add_months no caso
espero ter ajudado
GOSTEI 0
Tenil
05/07/2004
E agora, não consegui fazer isto no interbase.
Alguém sabe se existe esta função no interbase?
Alguém sabe se existe esta função no interbase?
GOSTEI 0
Gandalf.nho
05/07/2004
Tente essa biblioteca UDF FREE, tem uma função equivalente lá, além de inúmeras outras úteis:
[url]http://rfunc.sourceforge.net/[/url]
[url]http://rfunc.sourceforge.net/[/url]
GOSTEI 0
Tenil
05/07/2004
Tente essa biblioteca UDF FREE, tem uma função equivalente lá, além de inúmeras outras úteis:
[url]http://rfunc.sourceforge.net/[/url]
Muito legal, tem muitas funções úteis mesmo.
Mas como é que se usa?
Fiz o download mas fiquei boiando... :oops:
GOSTEI 0
Gandalf.nho
05/07/2004
Coloque a DLL na pasta UDF do Interbase/Firebird e para usar a função desejada, você deve declará-la no seu banco de dados. Depois basta usá-la como qualquer outra função interna do banco. Consulte a documentação de SQL do Interbase para ver como se declara uma função externa ao banco.
GOSTEI 0