"Programación Multiusiario" Conflicto en la inserción y actualizacion de registr

angel negro
25 de Octubre del 2004
Hola:
Me llamo pablo y soy Analista Programador de Sist. y me he encontrado con un pequeño gran problema
con el tema de inserción y actualizacion de registron en una tabla.La situacion es la sig.:estoy programando
en Visual FoxPro 6.0, el sist. que estoy diseñando funciona en red, para ello defino un origen de datos
el cual luego es reflejado en cada maquina por una "Vista Remota", para volcar las actualizaciones al origen de
datos(Base de Datos, que se encuentra en otra maquina), utilizo almacenamineto en buffer(CURSORSETPROP("Buffering",3)),
con (SET MULTILOCKS ON) y Set Exclusive off, por medio del comando (unlock in -tabla-) logro volcar
el contenido de la vista remota al origen de datos, hasta aca todo joya, el problema es cuando
tengo un conflicto, es decir, dos usuario acceden al mismo registro a la ves, no puedo administrar los conflictos
ya me canse de leer la maldita ayuda que dicha sea de paso esta muy buena pero en esto se lavo un poco las manos.
ufff!!!.Por medio de una rutina ON ERROR puedo controlar que el exe no me tire errores pero el conflicto
internamento sucede igual lo que desemboca en que ya no se pueda usar dicha vista remota en esa maquina, lo mas cercano
que he encontrado para detectar un conflicto y que no suceda es set reprocess automatic y una funcion SYS(2011) pero no me
han side de utilidad para mi problema o bien no las he sabido interpretar de la ayuda de fox. Seguido va la rutina que uso
para entre comillas administar los conflictos haber si alguin me da una GRAN MANO ya que en realidad la estoy necesitando
en este problema que me esta volviendo pelotudo, estupido, y ya empieso a ver a la cpu como a mi mina, y eso ya es grabe,
jajaja ;), ah por las duda yo trabajo solo con las vistas remotas y por tanto las funciones lock(), rlock() y demas que sirven para trabajar con tablas no me
funcionan con las vistas, al menos es lo que creo me ha estado sucediendo, desde ya a quien se tome el trabajo de leer al menos
este texto le doy muchisimas gracias.-


****** Procedimiento Active del Formulario **************************
close all
SET MULTILOCKS ON
set exclusive off
open databases datos_colegio.dbc **Base de datos que contiene las vistas remotas
select 1
use v_tincrem_cod **Vista Remota
CURSORSETPROP("Buffering",3)
************ fin procedimineto Active *******************************


****** Procedimiento Click del comando del Formulario ****************

on error retry
select v_tincrem_cod
requery() **Recupero los datos de la tabla(Origen de Datos)
set reprocess to automatic
update datos_colegio!v_tincrem_cod set cont_curso=cont_curso+1
unlock in v_tincrem_cod **Vuelco el contenido del buffer a la tabla
*tableupdate(1,.t.,"v_tincrem_cod") **Vuelco el contenido del buffer a la tabla forzando a que lo haga
on error

************ fin procedimineto Click *********************************

"EL PROBLEMA SE PRESENTA CUANDO DOS USUARIO EJECUTAN ESTE MISMO CODIGO AL MISMO TIEMPO"
************************************************************************************************

emilsonpineda
25 de Octubre del 2004
Veo que trabajas con formularios pero no con el DataEnvironment del Formulario mmmm..... creo que deberias de cambiar un poco la programación ya que VFP es orientado a Objetos y estas tratando de manipular la data como que si estuvieras en FoxPro para D.O.S con comandos de VFP..... suele suceder..... tiene una vista local la abres pero segun la ayuda el CursorSetProp() solo es para tablas y cursores no mensiona Vistas Locales.... pero bueno... yo no lo e utilizando en Vistas Locales y hasta el momento no e tenido la necesidad de usar vistas locales..... dime! para que la utilizas pueda ser que no sea necesario crear una vista local para la captura o midifcacion de datos que quieres hacer.... talves lo que quieras hacer no se puede hacer de esa forma....... otra utiliza el DataEnvironment para abrir la Vista y no por medio de comandos y en el Metodo BeforeOpenTables del DataEnvironment puedes colocar los Set.... para ayudarte mejor.... dime que pretendes hacer talves teniendo una mejor visión de lo que deseas te puedo ayudar y talves no sea necesaria la Vista Local.... te parece.... bueno con gusto te ayudare.... pero para salir de dudas hare lo mismo que tu quieres hacer haber como se comporta.....

emilsonpineda
25 de Octubre del 2004
hice las pruebas q' te dije el error de conflicto esta en cuando tu marcas el Registro Key para ser modificado si no lo marcas para ser modificado no genera el error de conflicto osea no es error de multiusuario, segundo el tableupdate no funciona en la vista local lo prove y no actualiza nada cierto si tu haces un brow dentro del mismo formulario muestra los datos actualizados pero si cierras el formulario y vas a la tabla o a la vista veras que los cambios no fueron actualizados..... solución para actualizar la vista local cuando la estas creando en la pestaña de "UpDate Criteria" hay una check Box que dice "Send SQL Update" deberas marcarla para q' las actualizaciones se almacenen y no tendras que utilizar el tableupdate() ni el cursorsetprop().... tercero actualize como 800 registro y se volvio lenteja para almacenar los cambios en la tabla osea que si lo utilizas sera mejor que lo hagas para actualizar pocos registro porque de lo contrario se tardara una eternidad para actualizar la tabla ah! la prueba que hice la hice utilizando el DataEnvironment del formulario es mucho + facil colocarlo como tu lo estavas asiendo en el metodo Active del formulario cuando este el usuario pierda el enfoque del formulario y se vuelva a colocar en el este metodo se vuelve a ejecutar y te perderia cerraria la vista y volveria a comenzar osea no se debe de colocar ahi.......... bueno tengo q' ir a desayunar luego continuo... cualquier cosas no dudes en preguntar