Almacenamiento en buffer y tableupdate

2,098 views
Skip to first unread message

Arturo Ramos

unread,
Jul 6, 2011, 7:57:33 PM7/6/11
to publice...@googlegroups.com
Hola foro,

Me podrían ayudar con los conceptos de almacenamiento en buffer para entornos de trabajo compartido.

Alguna referencia, algún manual, algún documento, ejemplos, comentarios ??

Saludos.

Marco Plaza

unread,
Jul 6, 2011, 10:08:10 PM7/6/11
to Comunidad de Visual Foxpro en Español

Luis Mata

unread,
Jul 6, 2011, 10:20:07 PM7/6/11
to publice...@googlegroups.com
si estas recien empezando te recomiento usar motor de Base de Datos, MysQL,
Postgres o Sql Server

-----Mensaje original-----
From: Marco Plaza
Sent: Wednesday, July 06, 2011 9:08 PM
To: Comunidad de Visual Foxpro en Espa�ol
Subject: [vfp] Re: Almacenamiento en buffer y tableupdate

te recomiendo este art�culo:
http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=22&page=1


On Jul 6, 7:57 pm, Arturo Ramos <ircs...@gmail.com> wrote:
> Hola foro,
>

> Me podr�an ayudar con los conceptos de almacenamiento en buffer para
> entornos de trabajo compartido.
>
> Alguna referencia, alg�n manual, alg�n documento, ejemplos, comentarios ??
>
> Saludos.


José Luis

unread,
Jul 7, 2011, 12:11:04 AM7/7/11
to Comunidad de Visual Foxpro en Español
Buenas como estas. Creo que seria bueno que leas y pruebes el ejemplo
que nos Aporto el compañero Walter R. Ojeda Valiente, titulado con el
nombre SQL_DEMO.ZIP y el archivo puedes descargarlo desde:

http://www.mediafire.com/?qbb8b22cvx3ypvb
Peso: 1.87 MB

Yo en realidad no lo he probado debido a que estoy full de
complicaciones y falta de tiempo. ¿Pero cuanto deseo tengo de aprender
a trabajar con un motor de base de datos?

Saludos y exito amigo.

Antonio Meza

unread,
Jul 7, 2011, 12:11:49 AM7/7/11
to publice...@googlegroups.com
hola!!
 
Sobre que base de datos vas a aplicarlos, sobre dbc o algun motor en especial?
 
saludos!!!

Arturo Ramos

unread,
Jul 7, 2011, 2:29:57 AM7/7/11
to publice...@googlegroups.com
Gracias compañeros,

La aplicación ya está, son DBF.

Si es el objetivo pasar todas las aplicaciones a Firebird y MySQL, de hecho las últimas aplicaciones que hemos desarrollado ya son en MySQL+VFP9 y con la ayuda de Walter pronto Firebird;

Esto lo requiero para una aplicación antigua pero más que nada para comprender el concepto de una vez por todas.

Saludos.

Antonio Meza

unread,
Jul 7, 2011, 8:44:07 AM7/7/11
to publice...@googlegroups.com
en mi caso, tengo el sistema hecho con DBC y uso tableupdate y estoy desarrollando uno con mysql, de igual forma com mas tiempo usare firebird siguiendo los concejos de Walter!!
 
Pero como haces para usar mysql sin aplicar tableupdate en los programas que ya lo estas usando?
 
Por otro lado seria mas facil que te ayuden si preguntas algo mas especifico porq el tema es muy amplio.
 
Hace tiempo puse una clase DBVFP para conectarse con mysql y usa tableupdate, ya la tengo en produccion y hasta el momento no he tenido problemas, lo que hace es hacer un cursor actualizable, es decir mandas un sqlexec("select * from proveedores") y por medio de una funcion te lo hace actualizable, y por medio de tableupdate mandas a guardar o tablerevert deshacer los cambios,para mi gusto mejor que trabajar con vistas remotas de vfp o usar cursor adapter.
 
saludos!!!

extremo

unread,
Jul 7, 2011, 11:48:34 AM7/7/11
to Comunidad de Visual Foxpro en Español
Cuando trabajas con motores de BD no necesitas utilizar los comandos
para manipular buffer ya que el mismo motor de BD tiene incorporada
esas funciones, ya que estan hechas para trabajar con multiples
conexiones. Lo que si debes controlar en los programas es la cantidad
de sesiones que estas abriendo al motor de BD porque cada sesion
abierta es memoria reservada en la BD y si abres muchisimas sesiones
puedes saturar la memoria de la BD.

Bendiciones

cho...@hotmail.com

unread,
Jul 7, 2011, 12:12:29 PM7/7/11
to Comunidad de Visual Foxpro en Español
Aprovechando que tratan el tema de la cantidad de sesiones en la Bd, y
que se puede saturar, de que dependería que mysql pueda saturarse al
abrir por ejemplo 100 sesiones ??.
Gracias

cho...@hotmail.com

unread,
Jul 7, 2011, 12:15:21 PM7/7/11
to Comunidad de Visual Foxpro en Español
Hola Antonio, no encuentro algun hilo donde estan los consejos de
Walter, me podrias hacer el favor de decirme el porque pasar al
firebird, cuales son las ventajas, Gracias.

Por cierto la clase DBVFP, se puede utilizar con varios cursores a la
vez o solo uno por pantalla.

extremo

unread,
Jul 7, 2011, 12:41:26 PM7/7/11
to Comunidad de Visual Foxpro en Español
En MySql existe una variable, que no recuerdo en este momento como se
llama la cual sirve para setear la cantidad maxima de sesiones
abiertas simultaneamente, la saturacion por memoria influye mucho como
este configurado el mySql y la maquina en la cual esta instalada. Con
100 usuarios conectados simultanemanete no tiene ningun problema con
una configuracion adecuada y bien seteada la cantidad maxima de
sesiones abierrtas. Otra cosa muy importante qe he visto en MySql es
que tambien se le puede dar una tiempo maximo de conexion a la sesion,
en eso hay que tener cuidado ya que en VFP las conexiones via ODBC a
la BD es permanente es necesario colocarle un tiempo mas que razonable
a la conexion, en mi caso el mysql lo configuro para que tenga un
maximo de 26 horas abierta. La razon por la cual tiene esta
configuracion el MySql es porque esta pensado para aplicaciones WEB
donde el cliente realiza una peticion al servidor, este habre una
sesion, entrega el resultado y cierra la sesion, si elusuario quiere
hacer otra accion sobre la pagina web, el MySQL hace nuevamente lo
mismo habres sesion, evia resultado, cierra la sesion, obviamente ese
control se hace a traves de programacion ejemplo PHP. Estos lenguajes
no necesitan tener una sesion que se encunetre permenentemente
conectada. Si no que se conectan cuando sea neceario.

Bendiciones
> > > saludos!!!- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Walter R. Ojeda Valiente

unread,
Jul 7, 2011, 12:41:36 PM7/7/11
to publice...@googlegroups.com
Puedes descargar el documento: "Visual FoxPro y Firebird SQL" de este enlace:

http://www.mediafire.com/?nb74e3oaf9g9l4j

y si quieres ver una aplicación completa, funcionando, con todos sus códigos fuente y un manual explicativo, puedes hacerlo desde:

http://www.mediafire.com/?dugbqkqt4tx6bdl

Saludos.

Walter.



> Date: Thu, 7 Jul 2011 09:15:21 -0700

> Subject: [vfp] Re: Almacenamiento en buffer y tableupdate

Arturo Ramos

unread,
Jul 7, 2011, 3:12:43 PM7/7/11
to publice...@googlegroups.com
Hola Antonio, gracias por tu tiempo...

Trabajo con MySQL sin tableupdate... trabajo con SQLPT, abro la sesión con SQLCONNECT(), mando comandos con SQLEXEC() y cierro la sesión... la base de datos se encarga de lo demás.

Si, si estoy de acuerdo que la pregunta es muy abierta y el tema muy extenso por eso mi intención era más que una respuesta directa, alguna referencia a manuales, ayuda, ejemplos, algo un poco más masticado... perdón si me paso de abusado--- =)

Saludos.

Marco Plaza

unread,
Jul 7, 2011, 4:02:13 PM7/7/11
to Comunidad de Visual Foxpro en Español
Hola Arturo, arriba te dejé el link donde explica todo acerca del
manejo de buffering de tablas en VFP, es un excelente artículo acerca
del concepto. Por lo que dices vas a usar tablas de VFP, así que bueno
ahí está.
Ahora si vas a usar un motor de base de datos necesitarás las
funciones de tableupdate/tablerevert sólo si usas vistas remotas. Si
usas sqlPassThrough tienes todo el control de lo que se hace o no en
la base de datos, no necesitas preocuparde del buffering. El buffering
se aplica para que cuando le pides a VFP que actualiza la data remota
con la data de la vista usando tableupdate , dependiendo del
resultado que te devuelta tableupdate puedes crear una rutina para
manejar los conflictos entre los registros locales y los remotos en
caso de que otro usuario haya modificado la data mientras que el
usuario editaba la vista. Supon lo siguiente:
creas una vista que tenga nombre,apellido y región,
el usuario a y el usuario b leen la data de un registro al mismo
tiempo ( ej juan gonzales region x )
ambos la editan
a cambia el apellido por 'perez' y envía sus cambios
b también lo hace pero cuando vfp envía el tableupdate tendrás un
conflicto, pues el valor actual ( curval) de apellido no es el mismo
que vió el usuario ( oldval ) cuando trajo la data.
Usar Sql pass nos hace olvidar que esto puede ocurrir y pocos manejan
los conflictos con rutinas de este tipo, porque en aplicaciones
pequeñas es baja la probabilidad ( metodo optimista ) pero es algo
que se debe hacer, hay que alertar al usuario si la data ha sido
cambiada mientras el la editaba y preguntarle que acción tomar
( descartar, leer de nuevo, mostrar el cambio )
espero que te sirva.

Saludos.

Arturo Ramos

unread,
Jul 7, 2011, 11:36:24 PM7/7/11
to publice...@googlegroups.com
Gracias por tu tiempo Marco,

Bueno para manejar este posible conflicto de datos yo utilizo en las tablas un campo timestamp que se actualiza a la hora minuto y segundo automaticamente en cada modificación al registro (esto lo hace la base de datos) así que antes de actualizar un registro que este en la vista del usuario se compra el valor del campo en la base de datos con la del usuario; si hay un cambio indica que el registro fue modificado por otro usuario, deshace los cambios y muestra los valores actuales.

Gracias por la referencia.

Saludos.

Antonio Meza

unread,
Jul 8, 2011, 9:26:53 AM7/8/11
to publice...@googlegroups.com
Hola, la clase DBVFP la puedes usar con los cursores que necesites, ya agrege nuevas funciones este prox. lunes la subo a internet porq ya agrege transacciones y tambien bloqueos a tablas para asignar folios unicos, estuve leyendo mucho sobre el tema de los bloqueos, en el mismo FAQ de Mysql recomiendan mas un bloqueo a nivel tabla que a nivel registro porq ocupa menos memoria del servidor y realiza menos procesos.
 
Tambien modifique para que puedas guardar la tabla principal que te devuelve el ID y por medio de otra funcion guardar las tablas hijas para asignarle el ID nuevo,
 
Todo funciona con SPT, te conectas al servidor mysql y permaneces conectado, es como trabajar con una DBC nativa, lo que hace es crear un cursor actualizable lo mismo que hace una vista remota de vfp, pero con mas control por parte del usuario, ya depende tu codigo en que momento inicias la transaccion, en mi caso cuando el usuario le da EDITAR registro.
 
saludos!!!
Antonio Meza

Antonio Meza

unread,
Jul 8, 2011, 9:30:01 AM7/8/11
to publice...@googlegroups.com
Hola Arturo!!
 
Me llamo la atencion porq uso lo mismo que tu pero tambien el tableupdate y tablerevert para deshacer los cambios en el cursor local y de otra forma como le haces tu para que el usuario vea revertidos los cambios o actualizados los cambios? o quizas usas SqlExec("Update ....") ?
 
Te pregunto porq mi intension es ir mejorando la clase que tengo, ya la tengo en produccion en un sistema de inventarios con mas de 3,000 registros por dia y no ha tenido problemas!!!

Arturo Ramos

unread,
Jul 8, 2011, 2:03:25 PM7/8/11
to publice...@googlegroups.com
Antonio,

Es que todo se trabaja con cursores, los datos que quiere el usuario editar los tiene en un cursor, las operaciones las controlo con tansacciones, antes de hacer un cambio, o agregar un registro inicio una transacción (begin transaccion), si todo sale bien termino la transacción (end transaccion) si se requiere revertir por un error o por gusto del usuario hace un rollback.

Así lo tengo en varios sistemas con diferentes volúmenes de información.

Te recomiendo, y a todo el grupo el libro: MySQL client-server applications with Visual FoxPro de Hentzenwerke http://www.hentzenwerke.com/catalog/mysqlvfp.htm

Saludos.

Antonio Meza

unread,
Jul 8, 2011, 2:37:32 PM7/8/11
to publice...@googlegroups.com
Hola!!
 
Ahh ok, creo que ya entendi tu usas las transacciones nativas de vfp? en mi caso uso la de mysql, por eso cuando tu le das deshacer los cambios el rollback lo hace al cursor local y al servidor, si estoy correcto? y en mi caso primero aplico un tablerevert para el cursor local y luego un ROLLBACK; pero por medio de un SQLEXEC al servidor. o un tableupdate al cursor local y un COMMIT; al servidor.
 
saludos!!

Arturo Ramos

unread,
Jul 10, 2011, 12:18:34 PM7/10/11
to publice...@googlegroups.com
No, no, no.... al servidor sólo llega lo que el usuario acepta guardar, ya que en cada proceso abro una conexión, ejecuto el comando en mysql, y cierro la conexión... hasta antes de que el usuario decida guardar sus cambios, guardar un registro nuevo o borrar, hasta ese momento trabajo con mysql, mientras tanto todo se hace en cursores en la computadora del usuario, si el usuario esta guardando un registro nuevo en el cursor y decide deshacer, solo hago rollback en su cursor y ya, si decide guardar, hago el proceso en mysql, si todo sale bien al final termino la transacción en el cursor del cliente (no es transacción de la base de datos, es la transacción en el cursor) y si algo sale mal entonces dependiendo puedo hacer rollback o regresar el control al usuario para que repare el problama, por ejemplo una clave repetida, un usuario duplicado, o algo así, en todo momento el cliente puede deshacer sus cambios mientras no los guarde en muysql... si me explico ??

Saludos.

Arturo Ramos
www.ircsasoftware.com.mx
Cancún, México.

Antonio Meza

unread,
Jul 11, 2011, 3:01:50 PM7/11/11
to publice...@googlegroups.com
Hola arturo!!
 
Creo que tu envias instrucciones sql Update? por eso puedes trabajar con cursores locales en la forma que me comentas!! en mi caso hago un cursor actualizable, por eso requiero aplicar primero el tableupdate o tablerevert y luego la transaccion!!!
 
saludos!!!
Reply all
Reply to author
Forward
0 new messages