Funcion para evitar conflictos en la red

750 views
Skip to first unread message

Carlos Alberto Cisneros Madrid

unread,
Feb 11, 2011, 12:05:36 PM2/11/11
to Comunidad Visual FoxPro
Hermanos se trata de un conflicto que estoy experimentando cuando derepente ambos usuarios intenan guardar el mismo codigo a la tabla
me emite un error del indice principal. algo asi como la unicidad del indice ha sido violada.... necesito ayuda, me dicen que use la funcion lock pero necestio un ejemplo.
 
Gracias.

Allan Raúl Acuña

unread,
Feb 11, 2011, 12:44:16 PM2/11/11
to publice...@googlegroups.com
Estimado trata de bloquear la tabla en con el posible conflicto
*------------------------------------------
Select PARAMETROS
Set Reprocess To 2 Seconds

Select PARAMETROS
lBloqueo = Lock([PARAMETROS])

Do While !lBloqueo
Wait Windows 'Desbloqueando Registros' Nowait Noclear
Messagebox('Hay otro usuario generando documentos, espere...',48,_Screen.Caption)
lBloqueo = Lock([PARAMETROS])
Enddo

Select PARAMETROS
Go Top In PARAMETROS
LNIDINC = PARAMETROS.numaviso+1
Replace PARAMETROS.numaviso With LNIDINC
Unlock In PARAMETROS

*------------------------------------------

Lic. Allan R. Acuña
Desarrollador Independiente
msn= allan...@hotmail.com
skype= niceasysoft
+(505) 8 831 8191
www.NicEasySoft.com
Nicaragua





From: ccis...@hotmail.com
To: publice...@googlegroups.com
Subject: [vfp] Funcion para evitar conflictos en la red
Date: Fri, 11 Feb 2011 11:05:36 -0600

Oscar Díaz

unread,
Feb 11, 2011, 12:55:58 PM2/11/11
to publice...@googlegroups.com
Estimado ccis...@hotmail.com

Para trabajar en multiusuario, yo resolví el problema así:

  SELECT 1  &&pacientes
  do while !flock(1)  &&se queda en el loop hasta que esté desbloqueado el archivo.
  enddo
  if modopaci="A"  &&agregar
    append blank
    regpaci=reccount()
  endif
  go regpaci
  GATHER memvar
  unlock in 1

Espero le sirva

Saludos desde Bogotá.co

Carlos Alberto Cisneros Madrid

unread,
Feb 11, 2011, 12:56:41 PM2/11/11
to Comunidad Visual FoxPro
excelente voy a probarlo
gracias
 

From: allan...@hotmail.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Funcion para evitar conflictos en la red
Date: Fri, 11 Feb 2011 17:44:16 +0000

Carlos Alberto Cisneros Madrid

unread,
Feb 11, 2011, 12:59:33 PM2/11/11
to Comunidad Visual FoxPro
Hermano me parece muy facil usar solo el ciclo
o sea que la funcion !flock(1) es para rectificar que se esta usando el indice principal en el acto.
 

Date: Fri, 11 Feb 2011 12:55:58 -0500
Subject: Re: [vfp] Funcion para evitar conflictos en la red
From: oscar...@gmail.com
To: publice...@googlegroups.com

Oscar Díaz

unread,
Feb 11, 2011, 1:10:18 PM2/11/11
to publice...@googlegroups.com
La función flock() lo que hace es bloquear el archivo mientras graba, y luego con el unlock lo desbloquea para que otro usuario utilice el archivo para grabar.

do while !flock() es igual a: do while .not. flock() que quiere decir: haga mientras NO esté bloqueado, está en un do while por que si está bloqueado por que alguien está grabando se queda ahi esperando (y NO sale el mensaje de que "Otro usuario lo está usando") hasta que el otro usuario grabe y lo desbloquee con unlock, en ese momento el usuario que estaba esperando bloquea el archivo, graba y lo desbloquea con unlock para darle permiso a otro usuario.

Este procedimiento lo he usado en maquila de datos (empresa donde se digita información de otras empresas) donde hay 40 usuarios grabando al tiempo en el mismo programa y en la misma tabla y NO ha presentado conflicto al grabar.

Espero le sirva,

Saludos desde Bogotá.co

Irlandes 1960

unread,
Feb 11, 2011, 1:40:10 PM2/11/11
to publice...@googlegroups.com
Hola, te adjunto la rutina que uso para blockear archivos.
En general uno graba varias tablas a la vez.
Cuando voy a agrabar, teniendo todo listo y armado, la invoco como
if !lockeo('tabla1,tabla2,laquesea')
     return
endif
esto permite gestionar el bloqueo de tantas tablas como se necesite, siempre igual, y si en alguna no lo puede bloquear, libera todas y vuelve.
La propia rutina de blockeo se encarga de explicar al usuario lo que sucedio, cual tabla le dio problemas, y lo invita a reintentar.
Es muuuuyyyyy raro que se de la colición de dos usuarios grabando simultaneamente para las mismas tablas, que solo permanencen bloquedas el mínimo tiempo para descargar los cambios. Si el ambiente es muy critico, hay tecnicas mas sofisticadas de bloqueo a nivel de registro, pero nunca tuve necesidad de usarlas, ya que las coliciones son tan escasas que se tornan anecdoticas.
es importante que antes de bloquearlas, tengas todo resuelto y validado, y muy importante, al terminar no omitas poner UNLOCK ALL
JK

rutinalockeo.rar

Fabricio

unread,
Feb 11, 2011, 4:41:31 PM2/11/11
to Comunidad de Visual Foxpro en Español
El problema se genera cuando dos usuarios diferentes hacen append
blank, ambos registros tienen la llave en blanco y son exactamente
iguales, eso viola la unicidad de las llaves, no importa si bloqueas o
no el registro la unicidad se viola.

Para resolverlo, en lugar de hacer un append blank debes hacer un
insert into, al menos con los campos que conforman tu llave, de esta
manera tu tabla nunca tendrá un registro con la llave en blanco.

Saludos

Fabricio


On 11 feb, 11:05, Carlos Alberto Cisneros Madrid

Irlandes 1960

unread,
Feb 11, 2011, 4:55:09 PM2/11/11
to publice...@googlegroups.com
Cierto, usar un append blank directamente contra la tabla real es fuente de problemas, y es una tecnica mas depurada insertar el registro con los campos de la clave ya calculados, pero en realidad, ¿para que incorporar el registro antes de tiempo?
Me parece que primero deberias trabajar todo en algun tipo de cursor auxiliar, y recien al terminar, si el operador realmente confirma la operacion, en ese momento insertar el registro. Si no, te estas comprando un problema de que el operador no termine, o cambie de idea, o se estrelle un aeroplano contra el edificio (no se olviden que el 2012 esta a la vuelta de la esquina, y ahi se acaba el mundo...)
Son raras las ocasiones en que se justifica insertar el registro nuevo al comienzo.
Te sugiero orientar el desarrolllo trabajando en alguna forma de cursor o tabla auxiliar, y recien al terminar y verificar todo, buscar el bloqueo de la tabla principal y la insercion del nuevo registro.
tambien dale una miradita al concepto de BEGIN TRANSACTION / END TRANSACTION que se supone previene actualizaciones parciales al grabar multiples registros en multiples tablas.
Y no olvides liberar todo con UNLOCK ALL
Suerte, JK

ibania blanco

unread,
Feb 15, 2011, 5:33:31 PM2/15/11
to Comunidad de Visual Foxpro en Español
yo utilizo esto

sele mitabla
appen blank
if rlock()
replace next 1 fecha with m.fecha
unlock
endif



On 11 feb, 15:55, Irlandes 1960 <irlandes1...@gmail.com> wrote:
> Cierto, usar un append blank directamente contra la tabla real es fuente de
> problemas, y es una tecnica mas depurada insertar el registro con los campos
> de la clave ya calculados, pero en realidad, ¿para que incorporar el
> registro antes de tiempo?
> Me parece que primero deberias trabajar todo en algun tipo de cursor
> auxiliar, y recien al terminar, si el operador realmente confirma la
> operacion, en ese momento insertar el registro. Si no, te estas comprando un
> problema de que el operador no termine, o cambie de idea, o se estrelle un
> aeroplano contra el edificio (no se olviden que el 2012 esta a la vuelta de
> la esquina, y ahi se acaba el mundo...)
> Son raras las ocasiones en que se justifica insertar el registro nuevo al
> comienzo.
> Te sugiero orientar el desarrolllo trabajando en alguna forma de cursor o
> tabla auxiliar, y recien al terminar y verificar todo, buscar el bloqueo de
> la tabla principal y la insercion del nuevo registro.
> tambien dale una miradita al concepto de BEGIN TRANSACTION / END TRANSACTION
> que se supone previene actualizaciones parciales al grabar multiples
> registros en multiples tablas.
> Y no olvides liberar todo con UNLOCK ALL
> Suerte, JK
>
> El 11 de febrero de 2011 18:41, Fabricio
> <fabricio.sando...@hotmail.com>escribió:
>
>
>
> > El problema se genera  cuando dos usuarios diferentes hacen append
> > blank, ambos registros tienen la llave en blanco y son exactamente
> > iguales, eso viola la unicidad de las llaves, no importa si bloqueas o
> > no el registro la unicidad se viola.
>
> > Para resolverlo, en lugar de hacer un append blank debes hacer un
> > insert into, al menos con los campos que conforman tu llave, de esta
> > manera tu tabla nunca tendrá un registro con la llave en blanco.
>
> > Saludos
>
> > Fabricio
>
> > On 11 feb, 11:05, Carlos Alberto Cisneros Madrid
> >  <ccisn...@hotmail.com> wrote:
> > > Hermanos se trata de un conflicto que estoy experimentando cuando
> > derepente ambos usuarios intenan guardar el mismo codigo a la tabla
> > > me emite un error del indice principal. algo asi como la unicidad del
> > indice ha sido violada.... necesito ayuda, me dicen que use la funcion lock
> > pero necestio un ejemplo.
>
> > > Gracias.- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Carlos Miguel FARIAS

unread,
Feb 16, 2011, 1:38:24 PM2/16/11
to publice...@googlegroups.com
ell append blank casi te garantiza problemas en la red, si tenes clave primaria no autoincremental, y varios intentan agregar registros a la vez, lo mas probable que algunos les de clave duplicada.
Lo aconsejable es usar insert into, disponible aun en fox dos

GeoSys Diseño de Software

unread,
Feb 16, 2011, 4:30:42 PM2/16/11
to publice...@googlegroups.com
Claro es mejor usar las instrucciones SQL aunque sea con las tablas dbfs:

Ejemplo Agregar:

        INSERT INTO enteros (fecha, codigo, producto, cantidad, descripcio, tipomovi);
         values(fecha1, codigo1, producto1, cantidad1, descripcio1, tipomovi1)


Ejemplo Modificar:

            UPDATE productos SET entradas = (productos.entradas+cantidad1), ;
             actual = (productos.anterior+productos.entradas) - (productos.salidas) - (productos.vendidos);
             WHERE productos.codigo = codigo1

Ejemplo Eliminar:

DELETE FROM enteros WHERE enteros.codigo == thisform.codi.Value

Saludos

Anthony Contreras Peralta

Costa Rica.
Reply all
Reply to author
Forward
0 new messages