Edición en Red

Edición en Red

Postby rolando » Thu Oct 30, 2008 11:57 pm

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 los cambios 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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Edición en Red

Postby FranciscoA » Fri Oct 31, 2008 12:05 am

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 los cambios 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 :D


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.
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Postby rolando » Fri Oct 31, 2008 1:02 am

Gracias por responder, pero no edito directamente el registro.

Edito un conjunto de variables que inicialmente toman los valores de los campos y, con un botón guardo los cambios y, en ese momento grabo las variables en el registro correspondiente.

Rolando
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Ricardo Ramirez E. » Fri Oct 31, 2008 8:07 am

Rolando...

Puedes usar la Clase TDatabase.. ella te crea "gratis" un array con los valores de los campos :

Code: Select all  Expand view
Use Test SHARED
DATABASE oDbf  // aqui creas el objeto TDATABASE

para referirte a las campos
Code: Select all  Expand view
oDbf:cCODIGO := "00001"
oDbf:cNOME     := "TU NOMBRES"

al referirte a los campos.. realmente estas interactuando con un array una data de la TDatabase
Code: Select all  Expand view
::aBuffer[ 1 ]
::aBuffer[ 2 ]
.
::aBuffer[n]  //esto segun  los campos que tengas

Para grabar
Code: Select all  Expand view
::oDbf:Save()

Para un append
Code: Select all  Expand view
::oDbf:Append()

Cuando navegas por la
Code: Select all  Expand view
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 :)
Saludos
Ricardo R.
xHarbour 1.1.0 Simplex , Microsoft Visual Studio 2008, Bcc55, Fwh Build. 9.01
User avatar
Ricardo Ramirez E.
 
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde

Postby rolando » Fri Oct 31, 2008 10:43 am

Ricardo,

Ya tengo todo armado usando Alias pero voy a estudiar lo que me indicas y trataré de ver como funciona.

Muchas gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby jose_murugosa » Fri Oct 31, 2008 11:58 am

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 :D


Cuidado!!

Si en tu terminal estás haciendo cambios en "ciertos campos de un registro" y en otra hacen cambios en otros campos del mismo registro y los guardan, al efectuar el Load() con la tdatabase cargas los datos grabados en la otra terminal, pero pierdes los cambios que tu realizaste, ya que se carga a las variables intermedias TODOS LOS CAMPOS DEL REGISTRO y por lo tanto se reemplaza lo que hayas escrito por el contenido del registro en el momento del load.
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
jose_murugosa
 
Posts: 1144
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Postby rolando » Fri Oct 31, 2008 12:13 pm

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é los campos en variables.

Lo que me interesa es una forma de actualizar las variables con los contenidos de los campos.

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 :roll:
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby jose_murugosa » Fri Oct 31, 2008 12:20 pm

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é los campos en variables.

Lo que me interesa es una forma de actualizar las variables con los contenidos de los campos.

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 :roll:


La Tdatabase no actualiza "sola" sino que tiene un método Load para recargar el registro.
El método load recargará todos los campos 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()
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
jose_murugosa
 
Posts: 1144
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay

Postby rolando » Fri Oct 31, 2008 12:32 pm

José,

O sea que estoy en lo mismo. No me sirve tampoco la TDATABASE.

Y Bue, seguíré intentando solucionarlo. Gracias.

Rolando :(
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Ricardo Ramirez E. » Fri Oct 31, 2008 12:43 pm

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 :
Code: Select all  Expand view
oDbfClon := oClone (oDbf)


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[] los cambios 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 :lol:
Saludos
Ricardo R.
xHarbour 1.1.0 Simplex , Microsoft Visual Studio 2008, Bcc55, Fwh Build. 9.01
User avatar
Ricardo Ramirez E.
 
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 11 guests

cron