Chave Estrangeira com Firebird 2.1

Delphi

10/10/2008

Olá a todos... novamente!

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

Microbios

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

10/10/2008

1 - Tabela OS (chave primária => OS)
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
Microbios

Microbios

10/10/2008

Ok, emerson.en;

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
Paulo

Paulo

10/10/2008

Pode ser a sua sequncia de gravação que está dando esse erro. Como você tem FK, as tabelas que possuem FK dever ser gravadas após a tabela principal, ou seja, a integridade deve ser mantida. No exemplo do emerson, deve-se gravar primeiro a OS, commitar para depois gravar as demais. Se você inverter essa sequência, vai dar Violação de Integridade da Constraint. Outra coisa, chaves estrangeiras podem ser repetidas sim na tabela, senão não teria nenhuma utilidade. O exemplo do emerson está bom, acho que deve seguir ele.

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
Microbios

Microbios

10/10/2008

Paulo,

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
Emerson Nascimento

Emerson Nascimento

10/10/2008

isso que você exemplificou é usado em 100¬ dos casos de pedidos, notas fiscais e tudo que tenha mestre-detalhe, como na sua OS.

quando você efetuar ´o procedimento de fechamento´, grave primeiro a OS e depois as outras tabelas.


GOSTEI 0
Paulo

Paulo

10/10/2008

Como o colega emerson falou e eu disse acima, primeiro a principal e depois a as FK´s.
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
Microbios

Microbios

10/10/2008

Caros Paulo e Emerson.en;

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
POSTAR