Fórum Duvida sobre integridade referencial #371266

16/06/2009

0

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

Responder

Posts

16/06/2009

Weber

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


Responder

Gostei + 0

17/06/2009

Aprendiz_ce

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.


Responder

Gostei + 0

26/06/2009

Aprendiz_ce

[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.


Responder

Gostei + 0

03/07/2009

Lightshine

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


Responder

Gostei + 0

05/07/2009

Aprendiz_ce

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.


Responder

Gostei + 0

05/07/2009

Lightshine

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


Responder

Gostei + 0

07/07/2009

Aprendiz_ce

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar