Duvida sobre integridade referencial

Delphi

16/06/2009

Como é que eu posso manter a integridade referencial no seguinte caso?

Exemplo:

TABELA - A (PRODUÇÃO)
qtd procuto
1000 001 (biscoito)

TABELA - B (PRODUTO)
codigo descricao
001 biscoito

TABELA - C (MATERIA PRIMA)
codigo descricao
001 - leite
002 - ovos
003 - açucar
004 - farinha de trigo

TABELA - C (COMPOSIÇÃO DO PRODUTO)
produto composição qtd
001 001 1.000
001 002 0.500
001 003 2.000
001 004 0.300

Não quero que o usuário do sistema altere/exclua os itens de composição de um produto se o mesmo já tiver tido movimentação de produção.

Obrigado a todo e aguardo qualquer ajudar.


Aprendiz_ce

Aprendiz_ce

Curtidas 0

Respostas

Weber

Weber

16/06/2009

Dependendo do banco de dados você pode usar FK ou trigger


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

16/06/2009

Dependendo do banco de dados você pode usar FK ou trigger


Olá,

Estou utilizando INTERBASE/FIREBIRD, mas gostaria de algo mais abrangente que fosse independente do banco de dados em sí...

Será que você poderia me dar uma exemplo de como fazer isso? Pelo menos utilizando FK mesmo, pois estou um pouco atrapalhado com isso.

Obrigado e aguardo retorno.

Abraço.


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

16/06/2009

[quote:b8927ee2ad=´Weber´]Dependendo do banco de dados você pode usar FK ou trigger


Olá,

Estou utilizando INTERBASE/FIREBIRD, mas gostaria de algo mais abrangente que fosse independente do banco de dados em sí...

Será que você poderia me dar uma exemplo de como fazer isso? Pelo menos utilizando FK mesmo, pois estou um pouco atrapalhado com isso.

Obrigado e aguardo retorno.

Abraço.[/quote:b8927ee2ad]

Alguem poderia me dar uma força???

Obrigado.


GOSTEI 0
Lightshine

Lightshine

16/06/2009

Aprendiz_CE,

Você pode declarar uma função que verifica se há ou não movimentação na Tabela A (Produção).
Se houver movimentação, não permite a exclusão/alteração.
Se não houver movimentação, permite a exclusão/alteração.

Ex:

function Movimentacao(Prod: Integer): Boolean;
begin
// Verifica-se se o produto tem movimentação na Tabela A
Dataset1.close;
Dataset1.SelectSQL.Clear;
Dataset1.SelectSQL.Add(´Select * from TABELA_A´);
Dataset1.SelectSQL.Add(´Where Produto = :Produto´);
Dataset1.ParamByName(´Produto´).AsInteger := Prod;
Dataset1.Open;

if Dataset1.IsEmpty then
Movimentacao := False
else
Movimentacao := True;

end;



No botão Excluir

if Movimentacao(Nº do Produto) = False then
begin
// Não há movimentação na Tabela A - Pode excluir
end else
begin
//Há movimentação na tabela A - Não pode excluir
end;

No botão Editar a lógica é a mesma. Neste exemplo simulei com componentes da paleta Interbase, mas você pode adaptar facilmente para os componentes que estiver utilizando.

Essa é uma dica, mas há inúmeras outras formas de você fazer isso... Porém acredito que essa é uma das mais simples e fáceis de implementar.

Lightshine


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

16/06/2009

Aprendiz_CE, Você pode declarar uma função que verifica se há ou não movimentação na Tabela A (Produção). Se houver movimentação, não permite a exclusão/alteração. Se não houver movimentação, permite a exclusão/alteração. Ex: function Movimentacao(Prod: Integer): Boolean; begin // Verifica-se se o produto tem movimentação na Tabela A Dataset1.close; Dataset1.SelectSQL.Clear; Dataset1.SelectSQL.Add(´Select * from TABELA_A´); Dataset1.SelectSQL.Add(´Where Produto = :Produto´); Dataset1.ParamByName(´Produto´).AsInteger := Prod; Dataset1.Open; if Dataset1.IsEmpty then Movimentacao := False else Movimentacao := True; end; No botão Excluir if Movimentacao(Nº do Produto) = False then begin // Não há movimentação na Tabela A - Pode excluir end else begin //Há movimentação na tabela A - Não pode excluir end; No botão Editar a lógica é a mesma. Neste exemplo simulei com componentes da paleta Interbase, mas você pode adaptar facilmente para os componentes que estiver utilizando. Essa é uma dica, mas há inúmeras outras formas de você fazer isso... Porém acredito que essa é uma das mais simples e fáceis de implementar. Lightshine


Beleza, dessa forma eu não tenho dúvidas não. Apenas achei que o próprio banco de dados já poderia fazer esse verificação utilizando algum recurso próprio.

Obrigado pela sua valiosa atenção.

Abraço.


GOSTEI 0
Lightshine

Lightshine

16/06/2009

Aprendi_CE,

Desculpe, eu havia entendido que vc gostaria de fazer essa verificação fora do banco.

Pelo próprio banco, vc pode garantir a integridade referencial através de chaves estrangeiras.

Desta forma vc faria uma alteração na tabela da seguinte forma:

alter table TABELA_C
add constraint FK_TABELA_C
foreign key (PRODUTO)
references TABELA_A(PRODUTO)
ON UPDATE CASCADE
ON DELETE NO ACTION

Definindo no ON DELETE NO ACTION não será possivel excluir um item da tabela C enquanto houver algum registro relacionado na Tabela A.

Duvidas é so postar.

Lightshine


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

16/06/2009

Aprendi_CE, Desculpe, eu havia entendido que vc gostaria de fazer essa verificação fora do banco. Pelo próprio banco, vc pode garantir a integridade referencial através de chaves estrangeiras. Desta forma vc faria uma alteração na tabela da seguinte forma: alter table TABELA_C add constraint FK_TABELA_C foreign key (PRODUTO) references TABELA_A(PRODUTO) ON UPDATE CASCADE ON DELETE NO ACTION Definindo no ON DELETE NO ACTION não será possivel excluir um item da tabela C enquanto houver algum registro relacionado na Tabela A. Duvidas é so postar. Lightshine


Olá,

Agora parece que ficou como eu queria. Mas nesse caso aí, só não deletará se já houver movimentos, é isso?

Muitissímo obrigado pela sua atenção.


GOSTEI 0
POSTAR