Pergunta

Eu tenho uma tabela que representa os parâmetros de um contrato - incluindo a sua mudança ao longo do tempo através de adendos. O primeiro aditamento é um adendo "especial" que representa os parâmetros quando o contrato foi assinado pela primeira vez.

Aqui está como a tabela deve ser semelhante a:

ID ProjectID BeginDate   DeadlineMonths DeadlineDate
1  20        20-12-2006  24             <computed= 20-12-2006 + 24 months>
2  23        12-03-2007  12             <computed= 12-03-2007 + 12 months>
3  20        06-09-2007  36             <computed= **20-12-2006** + 36 months>

ProjectID é uma FK para a tabela de projetos cuja chave primária também é chamado ProjectID.

Eu quero DeadlineDate ser um campo calculado, calculado assim:

DeadlineDate COMPUTE BY ((
    select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
    from addendums contract
    where contract.projectid = projectid
    order by contract.BeginDate ))

O problema é que, em contract.projectid = projectid o segundo ProjectID tem a referência a linha atual que está sendo calculado, não a linha atual na instrução SELECT (que é o mesmo que contract.projectid).

Eu estou usando Firebird. Eu preciso da coluna na tabela e não em uma instrução SELECT por causa de problemas ORM no aplicativo usando o banco de dados.

Foi útil?

Solução

Apenas prefixar o campo com o nome da tabela da tabela atual:

DeadlineDate COMPUTED BY ((
select first 1 AddMonth(contract.BeginDate, DeadlineMonths)
from addendums contract
where contract.projectid = projects.projectid
order by contract.BeginDate ))

Outras dicas

Você pode criar uma vista sobre sua consulta e usá-lo na ORM?

CREATE VIEW v_addendums
AS
SELECT  ID, ProjectID, BeginDate, DeadlineMonths, 
        (
        SELECT  first 1 AddMonth(contract.BeginDate, DeadlineMonths)
        FROM    addendums contract
        WHERE   contract.projectid = a.projectid
        ORDER BY
                contract.BeginDate
        )
FROM    addendums a
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top