Damoin Web Services

Blog de Social Media y Desarrollo Web

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

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.

Buscar objetos en SQL Server 2000 (Procedimientos, funciones, etc)

Con esta select conseguimos buscar todos los objetos en una base de datos SQL SERVER 2000

SELECT     TOP 100 PERCENT OBJETOS.xtype, COMMENTS.text, OBJETOS.name
FROM         basededatos.dbo.syscomments COMMENTS INNER JOIN
basededatos.dbo.sysobjects OBJETOS ON COMMENTS.id = OBJETOS.id
WHERE   ((OBJETOS.xtype = ‘p’) AND (OBJETOS.status >= 0) OR
(OBJETOS.xtype = ‘fn’) AND (OBJETOS.status >= 0) OR
(OBJETOS.xtype = ‘u’) AND (OBJETOS.status >= 0) OR
(OBJETOS.xtype = ‘tr’) AND (OBJETOS.status >= 0) OR
(OBJETOS.xtype = ‘v’) AND (OBJETOS.status >= 0)) AND
( COMMENTS.text LIKE N’%’ + @TEXTO + ‘%’)

FETCH API_CURSOR y bloqueos en IIS

Recientemente hemos sufrido un problema en un servidor IIS 6 , por el cual se bloqueaba la pagina web y un proceso de SQL Server 2005 aparecia con un comando en espera “FETCH API_CURSOR”.

Inicialmente achacabamos el problema al propio servidor SQL Server y hemos intentado dilucidar sin éxito el causante del problema, hemos revisado Procedimientos, Funciones, tiempos de espera, etc, sin conseguir ningun resultado aparente.

Si te interesa, sigue leyendo…

Bucles while en SQL Server

Para hacer un bucle while en SQL Server usaremos un cursor y la orden FETCH

En este ejemplo vamos a sacar un select html desde la tabla de provincias y lo devolvemos

DECLARE @resp varchar(2000)
DECLARE @provincia varchar(50)
DECLARE @CP_PROVINCIA INT

El cursor lo declaramos y le asignamos la consulta de la cual queremos recorrer los registros o valores

DECLARE @cursor cursor
SET @cursor = CURSOR FOR
SELECT nombre_provincia, CP_PROVINCIA
FROM provincias

Abrimos el cursor y con la orden fetch seleccionamos el primer registro para el bucle,
por cada campo de la consulta que queramos usar en el bucle debemos declarar una variable (los hemos señalado en naranja)

OPEN @cursor – Abre cursor
FETCH NEXT FROM @cursor – Primera fila
INTO @provincia , @CP_PROVINCIA
SELECT @resp = ”

Mientras haya registros en el cursor

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @resp = @resp + ‘<option value=’ + cast(@CP_PROVINCIA as varchar(50)) + ‘ >’ + @provincia  + ‘</option>’

Para evaluar el siguiente registro volvemos al fecth

FETCH NEXT FROM @cursor INTO @provincia , @CP_PROVINCIA
END
RETURN @resp

Podemos devolver el valor (si es una funcion) , en el caso de un procedimiento dentro del BEGIN podriamos haber realizado cualquier operacion (INSERT, UPDATE, DELETE, SP_ , ETC)

Si necesitas un experto en bases de datos [click aquí]