Page 1 of 1
Edición en Red
Posted: Thu Oct 30, 2008 11:57 pm
by rolando
Hola Amigos,
El sistema en cuestión trabaja en red y pretendo que cuando se edita un registro en la pc1, si este está siendo editado a su vez en la pc2, en ambas pc's puedan verse _ que se realizan en tiempo real.
Obviamente que la edición se realiza sobre variables y estás son grabadas al registro previo rlock(). Me interesan que cuando sean grabadas, en la otra pc el dato sea actualizado en la variable correspondiente y se visualice en la pantalla.
Probé con un timer pero no funciona como quiero.
¿Hay algún modo de hacerlo?. Gracias.
Rolando
Re: Edición en Red
Posted: Fri Oct 31, 2008 12:05 am
by FranciscoA
rolando wrote:Hola Amigos,
El sistema en cuestión trabaja en red y pretendo que cuando se edita un registro en la pc1, si este está siendo editado a su vez en la pc2, en ambas pc's puedan verse _ que se realizan en tiempo real.
Obviamente que la edición se realiza sobre variables y estás son grabadas al registro previo rlock(). Me interesan que cuando sean grabadas, en la otra pc el dato sea actualizado en la variable correspondiente y se visualice en la pantalla.
Probé con un timer pero no funciona como quiero.
¿Hay algún modo de hacerlo?. Gracias.
Rolando
Para que los demas usuarios puedan ver en pantalla (xbrowse u otro) un registro recién actualizado por otro, puedes mover el puntero utilizando Dbskip() ó DbSkip(-1), una vez grabado.
Saludos.
Posted: Fri Oct 31, 2008 1:02 am
by rolando
Gracias por responder, pero no edito directamente el registro.
Edito un conjunto de variables que inicialmente toman los valores de _ y, con un botón guardo _ y, en ese momento grabo las variables en el registro correspondiente.
Rolando
Posted: Fri Oct 31, 2008 8:07 am
by Ricardo Ramirez E.
Rolando...
Puedes usar la Clase TDatabase.. ella te crea "gratis" un array con los valores de _ :
Code: Select all
Use Test SHARED
DATABASE oDbf // aqui creas el objeto TDATABASE
para referirte a las campos
Code: Select all
oDbf:cCODIGO := "00001"
oDbf:cNOME := "TU NOMBRES"
al referirte a _.. realmente estas interactuando con un array una data de la TDatabase
Code: Select all
::aBuffer[ 1 ]
::aBuffer[ 2 ]
.
::aBuffer[n] //esto segun _ que tengas
Para grabar
Para un append
Cuando navegas por la
Code: Select all
oDbf ::oDbf:Skip(), oDbf:Gotop(), oDbf:GoBottom()
La TDATABASE actualiza automáticamente ::aBuffer con el metodo ::Load() y con ello
oDbf:cCODIGO , oDbf:cNOME
se actualiza tambien...
Lo mejor de esto es que la TDATABASE controla los bloqueos en red
por ti .... eso ayuda mucho....
Revisa los ejemplos
\samples\dbf01
\samples\dbf03
Revisando el codigo fuente de la classe veras tambien como trabaja.. realmente es genial
Espero poder haberte ayudado
Posted: Fri Oct 31, 2008 10:43 am
by rolando
Ricardo,
Ya tengo todo armado usando Alias pero voy a estudiar lo que me indicas y trataré de ver como funciona.
Muchas gracias.
Rolando
Posted: Fri Oct 31, 2008 11:58 am
by jose_murugosa
rolando wrote:Ricardo,
Ya tengo todo armado usando Alias pero voy a estudiar lo que me indicas y trataré de ver como funciona.
Muchas gracias.
Rolando
Cuidado!!
Si en tu terminal estás haciendo cambios en "_ de un registro" y en otra hacen cambios en _ del mismo registro y los guardan, al efectuar el Load() con la tdatabase cargas los datos grabados en la otra terminal, pero pierdes _ que tu realizaste, ya que se carga a las variables intermedias TODOS _ DEL REGISTRO y por lo tanto se reemplaza lo que hayas escrito por el contenido del registro en el momento del load.
Posted: Fri Oct 31, 2008 12:13 pm
by rolando
José,
Como tengo todo actualmente, edito el contenido de cada campo copiandolo previamente en una variable que es editada con un get, al salir del get, previo rlock(), grabo solo ese campo, o sea que si en otra pc editan otro/s campos, no influye. Esto está casi perfecto para lo que quiero (siempre hay un casi...).
La cuestión es que si en la otra pc actualizaron por ej. el campo NOMBRE mientras estoy editando el campo DOMICILIO, en mi pc no veo el cambio porque cuando accedí al registro copié _ en variables.
Lo que me interesa es una forma de actualizar las variables con los contenidos de _.
Por lo que explica Ricardo, usando TDATABASE, los objetos se actualizan solos, por lo que entendí, pudiera ser lo que necesito. Si edito el campo DOMICILIO y mientras en otra pc editan el campo NOMBRE y lo graban, el campo oDatabase:NOMBRE en mi pc, ¿Se actualiza solo?.
Gracias. Rolando
Posted: Fri Oct 31, 2008 12:20 pm
by jose_murugosa
rolando wrote:José,
Como tengo todo actualmente, edito el contenido de cada campo copiandolo previamente en una variable que es editada con un get, al salir del get, previo rlock(), grabo solo ese campo, o sea que si en otra pc editan otro/s campos, no influye. Esto está casi perfecto para lo que quiero (siempre hay un casi...).
La cuestión es que si en la otra pc actualizaron por ej. el campo NOMBRE mientras estoy editando el campo DOMICILIO, en mi pc no veo el cambio porque cuando accedí al registro copié _ en variables.
Lo que me interesa es una forma de actualizar las variables con los contenidos de _.
Por lo que explica Ricardo, usando TDATABASE, los objetos se actualizan solos, por lo que entendí, pudiera ser lo que necesito. Si edito el campo DOMICILIO y mientras en otra pc editan el campo NOMBRE y lo graban, el campo oDatabase:NOMBRE en mi pc, ¿Se actualiza solo?.
Gracias. Rolando
La Tdatabase no actualiza "sola" sino que tiene un método Load para recargar el registro.
El método load recargará todos _ del registro y no solamente los modificados por la otra terminal, con lo cual reemplazará lo que ingresaste en el campo que modificas tú con lo que había en la base de datos al instante del load()
Posted: Fri Oct 31, 2008 12:32 pm
by rolando
José,
O sea que estoy en lo mismo. No me sirve tampoco la TDATABASE.
Y Bue, seguíré intentando solucionarlo. Gracias.
Rolando
Posted: Fri Oct 31, 2008 12:43 pm
by Ricardo Ramirez E.
Rolando :
Para un tratamiendo "normal" .. digo asi, pq no es comun editar un registro al mismo tiempo (considera los bloqueos son a nivel de registro)
sigo pensando que la TDATABASE sirve
Dadas las cosideraciones y cuidados a tomar dichas por Jose
Puedes clonar un objeto TDATABASE con :
con el fin de que a la hora de grabar... puedas cargar los valores en la la oDbf clon y asi.. poder comparar com las datas de la oDbf padre..
osea que en oDbf:aBuffers[] tendrias tus cambios... y en oDbfClon:aBuffers[] _ de las posibles estaciones-- previo ::Load() manual
El metodo ::Load() es llamado x la propia clase.. osea es automático...
cuando creas el objeto el mismo es invocado
MAs en tu caso.. antes de grabar tendrias que llamarlo nuevamente
a fin de actulizarlo