Por que a integridade referencial do Access não funciona no meu BD?

Anônima
2012-01-28T01:56:55+00:00

Por favor, alguem me ajude.

Estou programando  um banco de dados com as seguintes características:

15 tabelas, cada uma com um formulário próprio para a entrada de dados. Todos os formulários estão relacionados com suas respectivas tabelas através da propriedade Fonte de Registro, com uma linha como esta:

"SELECT [Tab02 -  Caract_Viagem].* FROM [Tab02 -  Caract_Viagem];" (sem as aspas).

Em todos os formulários há um campo"Quest", sem formato definido, cuja fonte de dados é o campo com o mesmo nome no primeiro questionário.

Em cada tabela há um campo chamado "Quest" que é a chave primária, sempre com dados do tipo inteiro longo, indexado com duplicação não autorizada. Não há campos de numeração automática nem na primeira tabela. Para criar as relações, incluí um campo denominado "NQuest", formatado como inteiro longo, sem indexação. É a chave estrangeira e só não existe na tabela de origem.

Os relacionamentos são um-para-muitos e estão armados da seguinte forma: a primeira tabela é a origem (o lado esquerdo). Sua chave primária é ligada à chave estrangeira da segunda tabela. A chave primária desta é ligada à chave estrangeira da terceira tabela e assim por diante, até a 15ª tabela, onde termina o encadeamento. Todas as relações têm integridade relacional programada para propagar atualização e exclusão dos campos e registros relacionados. Só que não está funcionando. Por exemplo: um número do campo Quest da primeira tabela não aparece nas outras; se algum registro na primeira tabela é excluído, não é excluído das outras; se um número do campo Quest da primeira tabela é alterado, nada acontece com as outras, até porque a relação não está funcionando.

A única relação que acontece é entre os dados do campo Quest dos formulários, mas porque têm uma fonte única de dados, que é o mesmo campo no primeiro formulário. Só que estes valores nào aparecem nas respectivas tabelas. E, aí, ao mudar a apresentação de um formulário para layout ou design, recebo uma mensagem dizendo que um índice ou chave primária não pode ter um valor Null.

Alguém pode me ajudar? Estou precisando resolver este problema urgentemente.

Microsoft 365 e Office | Access | Para uso doméstico | Windows

Pergunta bloqueada. Essa pergunta foi migrada da Comunidade de Suporte da Microsoft. É possível votar se é útil, mas não é possível adicionar comentários ou respostas ou seguir a pergunta.

0 comentários Sem comentários

Resposta aceita pelo autor da pergunta

Anônima
2012-01-29T03:03:25+00:00

Olá Hélvio,

o que vou colocar aqui não achei referência em lugar algum, nem no Google, é fruto de um estudo que acabei de fazer.

O campo grbit da MSysRelationships é formado por uma soma:

0 para relacionamento com integridade referencial

256 para propagação de atualização

4096 para propagação de exclusão

16777216 para relacionamento Left Join

entre outros.

Assim, um relacionamento com integridade referencial, propagação de atualização e exclusão será 0 + 256 + 4096 = 4352

Vi que você tem número ímpar em alguns relacionamentos, portanto na composição do grbit existe um número 1.

Nos testes que fiz aqui para descobrir o que poderia ser o número 1, a única situação que me levou a ele foi o relacionamento 1 para 1, quando a chave primária de uma tabela é relacionada à chave primária de outra tabela.

Assim, creio que estes relacionamentos com valor 4353 estejam sendo entendidos pelo Access como sendo 1 para 1 (e não 1 para muitos, como você supõe que sejam), com integridade referencial e propagação de atualização e exclusão: 1 + 256 + 4096 = 4353

Esta resposta foi útil?

0 comentários Sem comentários

3 respostas adicionais

Classificar por: Mais útil
  1. Anônima
    2012-01-30T13:20:14+00:00

    OK. Muito obrigado. Ajudou muito.

    Esta resposta foi útil?

    0 comentários Sem comentários
  2. Anônima
    2012-01-28T20:18:49+00:00

    Obrigado Luiz Cláudio.

    Abri a tabela MSysRelationships. Alguns relacionamentos têm grbit de 4352. Outros têm 4353. Mas em todos eles a integridade referencial, com propagação de atualizações e exclusões está selecionada na caixa de edição dos relacionamentos. O que isto significa? Se estiver errado, como modifico? Na própria tabela?

    Hélvio.

    Esta resposta foi útil?

    0 comentários Sem comentários
  3. Anônima
    2012-01-28T14:04:54+00:00

    Um primeiro passo é abrir a tabela de sistema MSysRelationships para ver se os relacionamentos que você criou estão listados lá. Se os relacionamentos foram criados com integridade referencial, propagação de atualização e de exclusão, o campo grbit deverá ter o valor de 4352.

    Com relação ao funcionamento esperado, se você inserir um novo registro na tabela 1, ele não será propagado às demais tabelas, pois não existe propagação de inserção. Você até consegue criar algo neste sentido, com o Access 2010, por meio de macro de dados (macro de tabelas).

    Já se você editar ou excluir um registro na tabela 1, aí sim a propagação deverá acontecer, desde que o valor da chave primária na tabela 1 tenha chave estrangeira correspondente nas demais tabelas.

    Esta resposta foi útil?

    0 comentários Sem comentários