Peíodos cruzados

3 respostas
Iceguy

Olá, fiz um MDB em Access, mudei pra ANSI-92 e comecei a criá-lo. Nas validações encontrei um problema, no meu banco estou colocando uma tabela com metas para os indicadores. Cada indicador tem a sua meta e ela vale por um período. Como faço um CHECK que verifique se a data inserida no início e no final do período não esteja contido por outro período?

tentei algo ± assim:

ALTER TABLE meta ADD CONSTRAINT chk_periodoSobreposto CHECK( 'OPA!' NOT IN( SELECT 'OPA!' AS result FROM meta WHERE meta.codigoIndicador = codigoIndicador AND ( inicio BETWEEN meta.inicio AND meta.fim OR fim BETWEEN meta.inicio AND meta.fim ) ) )

Nesse código da erro, pois ele compara “ele com ele mesmo”, mas se eu fizer com os valores de entrada fixos ele funciona. Queria que meta.codigoIndicador fossem os dados já gravados e codigoIndicador fosse o que está sendo inserido

Alguma ideia de como resolver isso sem ser validar na aplicação ou usar trigger? M$Access só tem trigger se mudar o projeto pra ADP e rodar no SQL Server :confused:

3 Respostas

daveiga

Para fazer o que você deseja, vai ser preciso usar um "sub-select"
Algo assim:

ALTER TABLE meta ADD CONSTRAINT chk_periodoSobreposto CHECK( 'OPA!' NOT IN( SELECT 'OPA!' AS result FROM meta WHERE meta.codigoIndicador = (SELECT sub.codigoIndicador FROM meta sub WHERE sub.inicio BETWEEN meta.inicio AND meta.fim OR sub.fim BETWEEN meta.inicio AND meta.fim limt 1 ) ) )

Iceguy

SUB-SELECT não é permitida na cláusula CHECK, nem STORED PROCEDURE :?

daveiga

Desculpe-me, tinha a impressão que já havia feito isso.
Tentou um JOIN com a mesma tabela? É pouco elegante, mas talvez resolva.

Criado 27 de fevereiro de 2012
Ultima resposta 27 de fev. de 2012
Respostas 3
Participantes 2