Duvida sobre integridade referencial
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.
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
Curtidas 0
Respostas
Weber
16/06/2009
Dependendo do banco de dados você pode usar FK ou trigger
GOSTEI 0
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
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
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
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
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
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
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
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