Fórum Query inteligente mas complexa, para mim. #45313

05/07/2004

0

Olá, o problema é o seguinte:

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

Tenil

Responder

Posts

05/07/2004

Beppe

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.


Responder

Gostei + 0

05/07/2004

Motta

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


Responder

Gostei + 0

05/07/2004

Afarias

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+


Responder

Gostei + 0

06/07/2004

Motta

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 !!


Responder

Gostei + 0

06/07/2004

Tenil

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.


Responder

Gostei + 0

06/07/2004

Tenil

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.


Responder

Gostei + 0

06/07/2004

Motta

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


Responder

Gostei + 0

06/07/2004

Tenil

E agora, não consegui fazer isto no interbase.

Alguém sabe se existe esta função no interbase?


Responder

Gostei + 0

06/07/2004

Gandalf.nho

Tente essa biblioteca UDF FREE, tem uma função equivalente lá, além de inúmeras outras úteis:

[url]http://rfunc.sourceforge.net/[/url]


Responder

Gostei + 0

06/07/2004

Tenil

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:


Responder

Gostei + 0

06/07/2004

Gandalf.nho

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.


Responder

Gostei + 0

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

Aceitar