Access: Resolver conflicto de escritura en tabla vinculada a SQL Server

Estándar

Trabajando con SQL Server es común programar una interfaz en Access dadas las posibilidades de hacer una aplicación en poco tiempo y con opciones suficientes para un amplio perfil de usuarios.

Al trabajar en Access sobre SQL Server siempre es interesante el hacerlo sobre tablas vinculadas y aunque no suelen dar problemas de vez en cuando surge el famoso conflicto de escritura, desde Damoin os ofrecemos dos posibles causas y opciones para resolver este problema.

Causa 1: Campos tipo bit no inicializados. En este caso el problema surge al introducir un campo bit en la tabla sql server y vincularlo en Access sin haberle puesto un valor predeterminado a 0 ó 1. En el caso de una tabla vacia el problema surgira el intertar meter cualquier registro y en el caso de una tabla ya usada anteriormente el error dara tanto en inserciones como en updates, tiene sentido ya que Access necesita mostrar un valor para ese campo y SQL no se lo puede dar (no lo tiene) con lo que intenta escribir los dos valores al mismo tiempo.

Solución: Asignarle un valor predeterminado al campo bit , hacer en SQL Server un UPDATE a toda la tabla con el valor que queramos(0/1) y por último volver a vincular la tabla o actualizar la vinculación desde Herramientas>>Administrador de tablas vinculadas.

Causa 2: Tablas con campos float ,real, decimal, etc con valores dependientes de formulas. Este es un error menos común que el anterior pero puede ocurrir.

El caso típico es el de una aplicación de gestión donde existe un campo calculado (cantidad*precio), al intentar escribir en otro campo del registro nos da el conflicto de escritura, en este caso dado que el campo calculado recoge el valor posteriormente al update si intentamos registrar cambios en otro campo access no sabe cual ha sido la primera modificacion.

Solución: Crear en la tabla afectada un campo de tipo TIMESTAMP, entendemos que este campo almacena información sobre el momento de la ultima actualización para evitar colisiones y detectar precisamente conflictos de escritura. Despues de crear el campo hay que actualizar la informacion de la tabla vinculada o volver a vincularla.

Dejad un comentario para saber si os ha servido de ayuda.

13 comentarios en “Access: Resolver conflicto de escritura en tabla vinculada a SQL Server

  1. Sergio Rios

    Gracias David, aunque trabajo en una base de datos de mysql vinculada por access, cometi el error que indicas en el Caso 1 y también me ocurrió en Caso 2. Ahora de corregir más tablas. Gracias nuevamente.

    • Me alegro que te haya servido, nunca he trabajado en Access contra MySQL pero entiendo que la problemática sobre los conflictos de escritura debe ser muy parecida.
      Gracias por tu comentario ¡¡

  2. Brrrr

    Pues nosotros hemos hecho tanto paso uno como paso 2 y sigue sin funcionar. El tema está en que a veces va a veces no va!

    También leí que hay que activar en el menú referencias en el Editor de Visual Basic la opción ActiveX Data Objects 2.x Library. He modificado la tabla Sql, he eliminado el campo timestamp varias veces, les he puesto el valor por defecto al único campo tyint que tengo, he hehco un update para que los registros queden actualizados e inicializados a la fecha que quiero….. pero cuando acceden al formulario, de vez en cuando, vuelve a aparecer el odioso mensaje!!

    Alguna opción más que no sea la desesperación?

    • ¿Puedes pegarnos la estructura de campos (o un pantallazo de la misma) de la tabla en el blog?, necesito mas datos para buscar la causa. Tambien indicame el motor de SQL y version de access que usas. Si quieres puedes escribirnos directamente a contacto@damoin.es

      Repite conmigo…ohhhhhmmmmmmm 😉

    • Héctor

      Creo que pasa, cuando la aplicación tiene TRIGGER activos en SQL, tanto UPDATE o DELETE. Se tiene que desactivar y funciona bién. Estoy investigando si es eficiente el borrado y puesta de nuevo de la Clave Principal.

  3. ROGER GALINDO

    Tenia un problema similar… no me permitia crear registros, tenia una tabla ligas desde access a Sql server express 2008, esto era porque en la tabla en la que queria crea nuevo… al momento de pasar la base de datos a sql server perdio la lleve primaria solo esa tabla. La solucion fue poner la llave primaria otra vez, y el problema se resolvio.

    • Gracias por aportar tu solución en nuestro blog, de esta forma se beneficiaran otros usuarios con el mismo problema. Al perder la clave primaria, Access no sabe que registro tiene que actualizar y por eso da el conflicto de escritura, es una de las cosas que tambien hay que revisar del diseño de la tabla antes de linkarla en Access.

  4. David E.

    Buenos días,

    Me encuentro trabajando también con una base de datos en Access 2007 con tablas vinculadas sobre MySQL.

    Por lo que he podido ver, el problema de “Conflicto de escritura” me surge cuando, en un campo que ya tenía un valor, se lo cambio, le devuelvo el valor inicial, y después salto de registro o guardo.

    Creo que, al encontrarse con que iba a haber un cambio, pero volver a ver el mismo valor, se “mosquea” y da ese error.

    ¿Se os ocurre alguna forma de solucionarlo?

    Yo había pensado en que en los eventos al entrar y al salir, evaluara si se había cambiado el valor inicial y, en tal caso, actualizar el registro y, en el contrario, no actualizarlo. Pero con los muchos campos que tengo, no me parece una solución demasiado eficiente, no¿?

    Muchas gracias por el blog y el seguimiento!!!

    Un saludo

  5. Mariana

    Tengo el siguiente problema. Estoy intentando vincular tablas access a sql server. Algunas tablas vienen con datos y otras vacias. Ej: la tabla compra que lleva un id_usuario viene completa con la columna id_usuario instanciada. Pero la tabla usuario viene en blanco. Me podrias ayudar con alguna sugerencia?? Desde ya muchas gracias.

  6. MAURICIO VIDAL

    EXCELENTE, ME AYUDO A REVISAR … PERO MI PROBLEMA ERA QUE ESTABA AGREGANDO UN REGISTRO Y EN EL EVENTO LOSTFOCUS (CUANDO SALIA DE LA VALOR) ESTABA MULTIPLICANDO UN CAMPO Y ENTREGANDO EL VALOR AL CONTROL TOTAL, EJECUTE LA MULTIPLICACION EN EL EVENTO AFTERINSERT Y SOLUCIONADO

Deja un comentario

Tu dirección de correo electrónico no será publicada.