Fórum Chave Estrangeira com Firebird 2.1 #364873
10/10/2008
0
Colegas, como posso fazer chaves estrangeiras em tabelas usando Firebird 2.1 nas seguintes tabelas abaixo relacionadas:
1 - Tabela OS (chave primária => OS)
2 - Tabela OSPECAS (chave primária ?) *
3 - Tabela OSSERVICOS (chave primaria ?) *
Sendo que:
* Se eu colocar uma chave primária na tabela, nao vou poder incluir mais de uma peca ou servicos para a mesma OS. Tenho o campo OS nas duas tablelas que é o número da OS respectivamente.
Minha dúvida é, como é que eu vou fazer chave estrangeira e/ou relacionamento dessas tabelas se a chave primária OS em todas elas impede a duplicaçao dos registros, no caso nas tabelas OSPECAS e OSSERVICOS?
Obrigado por qualquer dica, pontapé, tapa na orelha... porque eu acho que é eu que nao tou sabendo fazer.... :oops:
:lol:
Microbios
Curtir tópico
+ 0Posts
10/10/2008
Emerson Nascimento
2 - Tabela OSPECAS (chave primária ?) *
3 - Tabela OSSERVICOS (chave primaria ?) *
OS
---
ID_OS (PK)
NUMERO
DATA
CLIENTE
etc
OSPECAS
-----------
ID_OSPECAS (PK)
ID_OS (FK)
ID_PECA -- id_peca pode ser UK
QUANTIDADE
etc
OSSERVICOS
----------------
ID_OSSERVICOS (PK)
ID_OS (FK)
SERVICO
etc
Gostei + 0
10/10/2008
Microbios
Eu vi que estava criando as FK no lugar errado e agora consegui criá-las a contento, porém ao executar minha aplicação e tentar inserir um registro numa das tabelas, retornou o seguinte erro:
SQL ERROR: violation of FOREIGN KEY constraint ´FK_OSSERVICOS_1´ on table ´OSSERVICOS´ Foreign Key reference target dos not exist. Error code -530. violation of FOREIGN KEY constraint ´´.
Daí, se não tem nenhuma foreign key, insere normalmente. Ah, um detalhe, pelo IBEXPERT inserindo dados manualmente não dá esse erro.
Estou usando ZEOS + DELPHI 7 e o já falado FIREBIRD 2.1 :?
Gostei + 0
11/10/2008
Paulo
Você só pode ter uma FK se ela existir na tabela Principal, logo, a tabela Principal deve ser gravada antes de tudo. Qualquer coisa poste aí.
Gostei + 0
11/10/2008
Microbios
Na minha aplicação a ordem de gravação, como você descreveu, não é obedecida. Eu abro uma OS e tenho no formulário a parte de PEÇAS e SERVIÇOS (gravadas em tabelas separadas) que podem ser digitadas no momento da abertura. Seria como um serviço rápido, por exemplo. Abre-se a OS e já se digita o serviço realizado e as peças gastas logo após dá-se o procedimento de fechamento da mesma. Sendo assim, a OS está aberta, não comitada e eu tou tentando entrar com peças/serviços (em FK´s) e tá dando erro! Mesmo que eu passe o número da OS para as tabelas auxiliares (como no meu modelo sem usar FK´s) o erro persiste. Acho que não tem muita solução não, concorda? :wink:
Gostei + 0
11/10/2008
Emerson Nascimento
quando você efetuar ´o procedimento de fechamento´, grave primeiro a OS e depois as outras tabelas.
Gostei + 0
11/10/2008
Paulo
Uma chave estrangeira se faz necessário para manter a integridade dos dados e evitar a repetição de informações que podem ser ´desnecessárias´. Sendo assim, você não pode gravar o que não existe. Não é só copiar o numero da OS e jogar na FK. A integridade se faz a nível de banco e não do aplicativo. Na empresa em que eu trabalho, sempre que abro uma OS eu gravo logo o numero dela(commito). Caso seja necessário cancelar, então tenho funções para deletar a OS e etc. Esses passos devem ser seguidos sim. OS e depois as FK´s, não tem como ser diferente e é mais seguro para a sua aplicação ela se torna mais consistente.
Gostei + 0
13/10/2008
Microbios
Faz sentido o que disseram e as explicações dadas por vocês foram de muita utilidade. Realmente eu estava tentando comitar um ´serviço´ antes de comitar a OS. Ia dar pau até o resto da vida... :lol:
Muito Obrigado pela ajuda. Espero um dia poder contribuir com os amigos em qualquer dúvida.
Valeu!
:D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)