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").
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.
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.
Nota: no Microsoft Access 2.0, as tabelas ligadas designavam-se por tabelas anexadas.
Passos para reproduzir o comportamento
- Abra a base de dados de exemplo Adamastor.mdb (ou NWIND.MDB, no Microsoft Access 2.0)
- 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.
- 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.
- Prima a tecla TAB para ir para um novo registo. Repare que o erro "#Eliminado" ("#Deleted") preenche o registo que introduziu.
- Feche e reabra a tabela. Repare que o registo está correcto.