Pergunta

Eu estou mantendo um acesso multiusuário 2000 DB ligado a um banco de dados MSSQL2000, não escrita por mim.

O projeto de banco de dados é muito pobre, então você tem que ter comigo.

No formulário 'Cliente' há campo de um 'Customer_ID' que por necessidades padrão para obter o próximo disponível ID do cliente, mas o usuário tem a opção de substituir essa escolha com um ID do cliente existente.

Agora, o campo Customer_ID não é a PK da tabela Cliente. Também não é único.

Se um cliente chama duas vezes para enviar uma tarefa, a tabela vai ter dois registros, cada um com a mesma informação ao cliente, e o mesmo ID do cliente.

Se um usuário cria um novo bilhete, Acesso faz uma pesquisa rápida para o próximo disponível ID do cliente e preenche-lo. Mas ele não salva o registro. Obviamente um problema -. Dois usuários editar tem que manter o controle de trabalho uns dos outros para que eles não enganar-se um ID de cliente

Então, eu quero modificar o botão "novo recorde" por isso poupa o direito bilhete depois de criar um novo.

O problema é que, quando eu testar a mudança, eu recebo "Este registro foi alterado por outro usuário desde que você começou a editá-lo".

Definitivamente não outros usuários no DB. O 'outro usuário' foi presumivelmente minha forçado salvar.

Todas as idéias?

Foi útil?

Solução

Dê uma olhada em sua tabela vinculada no SQL Server 2000. Será que ela tem um campo que contém o tipo de dados bit? Access irá dar-lhe esta mensagem de erro em um cenário tabela vinculada se você tem um campo de bits que não tem um valor padrão .

Não pode ser o que está errado no seu caso, mas eu experimentei o mesmo em um banco de dados Access 2007 e acompanhou o problema a um campo de bits com nenhum valor padrão.

Outras dicas

Eu vi esse comportamento antes e este fixa-lo para mim:

Tente adicionar um campo TimeStamp na tabela (basta adicionar esse campo e atualizar suas tabelas vinculadas. Você não precisa preencher esse campo com qualquer tipo de dados).

O erro que você está recebendo normalmente acontece quando:

  1. você está editando um registro em um formulário eo formulário está sujo (ou seja, não edições salvos),

e

  1. você executar o código que usa DAO ou ADO para executar SQL para atualizar o mesmo registro.

Para Jet, que é dois "usuários", porque são duas operações de edição diferentes. A tabela subjacente foi atualizado pela atualização SQL, enquanto os dados no buffer forma agora está fora de data.

A solução usual é forçar uma gravação antes de executar a atualização SQL:

  If Me.Dirty Then
     Me.Dirty = False
  End If
  [run your SQL update here]

Mas se você estiver usando formulários para editar o registro, você deve fazer todas as atualizações na forma, ao invés de recorrer a SQL para fazer a atualização.

A situação que você descreve com a geração de sua própria seqüência deve ser feito desta forma:

  1. user atinge botão novo registo.

  2. calc valor seguinte sequência e armazená-lo em uma variável.

  3. inserir um novo registro com o valor da seqüência através de um SQL INSERT.

4a. se o formulário está vinculado a todos os registros na tabela, repetir a consulta os dados editar forma (assumindo que o botão novo registro é sobre a forma em que os usuários editar os dados), e navegação utilização marcador para mover para o novo registro com o valor de sequência que você armazenado na variável no passo 2.

4b. Se o formulário é não obrigado a todos os registros (como não deve ser se é um banco de dados bem projetado), você teria apenas que mudar o OrigemDoRegistro do formulário para carregar apenas o novo registro.

Outra alternativa é evitar o INSERT SQL e repetir a consulta (ou redefinir o OrigemDoRegistro) e simplesmente adicionar um novo registro, na forma existente, defina o campo de sequência para o novo valor e imediatamente salvar o registro.

O ponto chave é que para que isso funcione em um ambiente multi-usuário, o registro tem de ser salvo, tão logo o valor da seqüência é atribuído a ele - você não pode deixar o registro pendurado lá fora, não salvo, porque isso significa que o valor seqüência idêntica está disponível para outros usuários, que é apenas a pedir um desastre.

Esta é uma velha questão, que eu me deparei do Google, por isso vou apresentar a minha resposta.

No driver ODBC, certifique-se de ativar a versão de linha. Se a tabela já está em Access, você vai ter que soltá-lo e re-link para a tabela de origem.

Você deve ser capaz de dizer se você tem versão de linha habilitada porque o Access deve adicionar uma coluna à tabela chamado xmin.

Gostaria de acompanhar se o usuário tiver substituído o novo customer_id com um valor próprio. Se eles não têm, então, a sua aplicação deve ser capaz de verificar a existência de um direito duplicado antes de salvar e apenas auto-incremento de novo, e o usuário não mente o padrão. Talvez até mesmo algum indicador para o usuário que você tivesse que escolher automaticamente um valor diferente.

Eu também tive mesmo problema. Eu estava tentando atualização em uma tabela usando Spring MVC e hibernação. No meu caso a coluna de versão na tabela contém um valor de mais de 1 (ou seja, 3) no entanto as informações de atualização na minha consulta de actualização teve valor da versão 1.

Os nossos problemas foi que o front-end de acesso estava tentando salvar um int (sim / não) em um campo mssql bit (0/1). Alterar o banco de dados MSSQL para campos int funcionou como um encanto.

Eu só veio em outra situação que gera este erro. Em uma tabela mysql eu tinha duas colunas de data que inicialmente tinha valor padrão '0000-00-00'. Mais tarde, foi alterada para NULL padrão, mas muitas linhas manteve o valor '0000-00-00'. Eu tive que reiniciar manualmente os valores para NULL para parar o erro.

Levou muito tempo para descobrir o que estava trigering o erro, HTH outra pessoa.

Este erro também pode ser acionada se a tabela do SQL Server contém uma coluna datetime2 (no meu caso com o valor padrão de sysdatetime ()). Alterar o tipo de dados de volta para datetime current_timestamp padrão pára o erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top