Artigo: 128809 - Última revisão: sexta-feira, 19 de Setembro de 2003 - Revisão: 2.1

ACC: Erros do tipo "#Eliminado" com tabelas ODBC ligadas

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Sempre que obtém, insere ou actualiza registos numa tabela ODBC ligada, cada campo de um registo contém a mensagem de erro "#Eliminado" ("#Deleted"). Quando obtém, insere ou actualiza registos utilizando um código, recebe a mensagem de erro "O registo foi eliminado" ("Record is deleted").

Causa

O motor de bases de dados Microsoft Jet foi concebido com base num modelo controlado por um conjunto de chaves. Isto significa que os dados são obtidos, inseridos e actualizados com base em valores de chaves (no caso de uma tabela ODBC ligada, o índice exclusivo de uma tabela).

Depois de o Microsoft Access efectuar uma inserção ou actualização de uma tabela ODBC ligada, utiliza um critério "onde" para seleccionar novamente o registo para verificação da inserção ou da actualização. O critério "onde" baseia-se no índice exclusivo. Embora inúmeros factores possam fazer com que o comando select não devolva registos, na maioria das vezes isto deve-se ao facto de o valor da chave que o Microsoft Access colocou na cache não ser igual ao valor real da chave na tabela ODBC. Seguem-se outras causas possíveis:
  • Existência de um activador de actualizações ou inserções na tabela, que modifica o valor da chave.
  • Basear o índice exclusivo num valor do tipo "float".
  • Utilizar um campo de texto de comprimento fixo que possa ser acrescentado o número de espaços correctos, no servidor.
  • Ter uma tabela ODBC ligada com valores nulos em qualquer um dos campos que formam o índice exclusivo.
Estes factores não provocam directamente a mensagem de erro "#Eliminado" ("#Deleted"). Em vez disso, fazem com que o Microsoft Access avance para o passo seguinte da manutenção dos valores das chaves, que consiste em seleccionar novamente o registo, mas com o critério baseado em todos os outros campos do registo. Se este passo devolver mais do que um registo, o Microsoft Access devolve a mensagem "#Eliminado" ("#Deleted") porque não tem um valor de chave fiável com que trabalhar. Se fechar e reabrir a tabela ou optar por Mostrar todos os registos (Show All Records) a partir do menu Registos (Records), os erros de "#Eliminado" ("#Deleted") serão removidos.

O Microsoft Access utiliza um processo semelhante para obter registos de uma tabela ODBC ligada. Em primeiro lugar, obtém os valores das chaves e, em seguida, o restantes campos que correspondem aos valores das chaves. Se o Microsoft Access não conseguir localizar novamente esse valor quando tentar localizar o resto do registo, assumirá que o registo foi eliminado.

Resolução

Seguem-se algumas estratégias que pode utilizar para evitar este comportamento:
  • Evite introduzir registos exactamente iguais, excepto em relação ao índice exclusivo.
  • Evite uma actualização que active actualizações do índice exclusivo e de outro campo.
  • Não utilize um campo do tipo "float" como índice exclusivo nem como parte de um índice exclusivo, devido aos problemas inerentes ao arredondamento deste tipo de dados.
  • Efectue todas as actualizações e inserções utilizando consultas SQL pass-through, para que saiba exactamente o que é enviado para a origem dos dados ODBC.
  • Obtenha registos com uma consulta SQL pass-through. Uma consulta SQL pass-through não é actualizável e, portanto, não provoca erros "#Eliminar" ("#Delete").
  • Evite armazenar valores nulos em qualquer campo que forme o índice exclusivo da tabela ODBC ligada.

Mais Informação

Nota: no Microsoft Access 2.0, as tabelas ligadas designavam-se por tabelas anexadas.

Passos para reproduzir o comportamento


  1. Abra a base de dados de exemplo Adamastor.mdb (ou NWIND.MDB, no Microsoft Access 2.0)
  2. Utilize as ferramentas de conversão para converter a tabela Transitários (Shippers).

    NOTA: esta tabela contém um campo de numeração automática (ou de contador no Microsoft Access 2.0) que é convertido no SQL Server, pelas ferramentas de conversão, para um activador que emula um contador.
  3. Abra a tabela Transitários (Shippers) ligada e introduza um novo registo. Certifique-se de que o registo que introduziu tem os mesmos dados no campo do nome da empresa que o registo anterior.
  4. Prima a tecla TAB para ir para um novo registo. Repare que o erro "#Eliminado" ("#Deleted") preenche o registo que introduziu.
  5. Feche e reabra a tabela. Repare que o registo está correcto.

A informação contida neste artigo aplica-se a:
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palavras-chave: 
kberrmsg kbinterop kbprb KB128809
Retired KB ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.