Fórum Duvida sobre integridade referencial #371266
16/06/2009
0
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
Curtir tópico
+ 0Posts
16/06/2009
Weber
Gostei + 0
17/06/2009
Aprendiz_ce
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
26/06/2009
Aprendiz_ce
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
03/07/2009
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
05/07/2009
Aprendiz_ce
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
05/07/2009
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
07/07/2009
Aprendiz_ce
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
Clique aqui para fazer login e interagir na Comunidade :)