CursorAdapter...

1,014 views
Skip to first unread message

Francisco

unread,
Dec 5, 2012, 12:39:14 PM12/5/12
to publice...@googlegroups.com
Bueno, he empezado a hacer unas pruebas sobre este tipo de objeto y tengo algunas dudas. Mi intención es en principio hacer clases de cursoradapter para usarlas en los forms en principio simplemente enlazar con tablas de BBDD fox para mas tarde empleando esas mismas clases poder cambiar a MySQL o cualquier otro motor sin necesidad de muchas complicaciones. Asi que de momento me estoy centrando en CursorAdapter para BBDD y tablas vFox. La cuestión que me planteo es si usar o no el entorno de datos o simplemente hacerlo manualmente en el beforeopentables... y si alguien tiene un ejemplo de esto.

Francisco

unread,
Dec 5, 2012, 1:00:14 PM12/5/12
to publice...@googlegroups.com
Bueno ejemplo ya veo muchos en este foro, simplemente quiero que me comenten si es buena forma de comenzar el emplear cursoradapter para hacer la aplicación más rápida en red y poder asi saltar de ahí a mysql o cualquier otro... o el camino ese no me llevará a optimizar nada....

Víctor Hugo Espínola Domínguez

unread,
Dec 5, 2012, 2:23:03 PM12/5/12
to publicesvfoxpro
Hola Francisco

MIra este artículo y otros del mismo autor: http://www.universalthread.com/ViewPageArticle.aspx?ID=830

A mi parecer cursor adapter es lo mejor para desarrollar sistemas CS. Puedes adaptar tu sistema de un motor de BD a otro en tiempo record, casi sin ningún cambio en tu código VFP.
Otros colegas opinan que es mejor usar al máximo los procedimientos almacenados para la modificación de la BD, esto facilitaría el cambio de VFP a otro lenguaje para la capa de cliente, pero complicaría el cambio de motor de BD.
En cuanto a si conviene o no usar el entorno de datos en los formularios, aparte de ser una cuestión de gustos, tiene la ventaja de que es más fácil y rápido confeccionar los forms. Con el uso de una clase genérica tienes más flexibilidad, puedes ir haciendo pruebas en la ventana de comandos, etc...

Adicionalmente puedes leer los aportes de Miguel Antúnez C.





Saludos.
Víctor.



--
 
 

Francisco

unread,
Dec 10, 2012, 1:16:11 PM12/10/12
to publice...@googlegroups.com
Hola, he estado practicando al vuelo un poco el CursorAdapter y cuando realizo el tableupdate me salta el siguiente error pese a haber definido dicho cursoradapter con buffer 5.¿Que puede ser? 

pd: Thisform.tablamadre contiene el nombre del CA.



El miércoles, 5 de diciembre de 2012 18:39:14 UTC+1, Francisco escribió:

Víctor Hugo Espínola Domínguez

unread,
Dec 10, 2012, 1:43:47 PM12/10/12
to publicesvfoxpro
Hola Francisco

El parámetro de TABLEUPDATE() debe ser el alias de la tabla que quieres actualizar.

Saludos.
Víctor.



--
 
 

Fox Learner

unread,
Dec 10, 2012, 1:51:53 PM12/10/12
to publice...@googlegroups.com
Francisco,

El mensaje es muy claro:

La función requiere el modo de buffering de registros o tablas.

Revisa la ayuda de como activar el sistema de buffering.

Creo que era la funcion CursorSetProp()

Debes poner un valor que active el buffering para registros o tablas que puede ser a partir del 2-5 creo.

Saludos!

Francisco

unread,
Dec 11, 2012, 1:07:33 PM12/11/12
to publice...@googlegroups.com
En thisform.tablamadre le paso el nombre de dicho alias. Y obviamente el CA esta con buffer=5

Víctor Hugo Espínola Domínguez

unread,
Dec 11, 2012, 3:06:13 PM12/11/12
to publicesvfoxpro
Hola Francisco

Envíanos tu código para poder analizarlo.

Saludos.
Víctor.



--
 
 

Francisco

unread,
Dec 12, 2012, 11:18:59 AM12/12/12
to publice...@googlegroups.com
Bueno, no hay mucho código simplemente he añadido en el Entorno de Datos de forma gráfica un CA con las siguientes propiedades:

Alias="tipos_via"
Buffermodeoverride=5
CursorSchema=CODIGO C(2), DESCRIPCIO C(30)
Datasourcetype=Native
Name="CAtipos_via"
SelectCmd=select TOP 1 * from TIPOS_VIA order by codigo
Tables=TIPOS_VIA

en el form esta puesto un boton guardar que tiene este codigo:

TABLEUPDATE(1,.T.,THISFORM.TABLAMADRE)

Donde la propiedad tablamadre del form contiene "tipos_via"

No sé donde está el problema... no lo veo.

Víctor Hugo Espínola Domínguez

unread,
Dec 12, 2012, 12:22:37 PM12/12/12
to publicesvfoxpro
Hola Francisco

Están faltando propiedades muy importantes:
  • SendUpdates (if set to .T. saves the data, if set to .F., data will not be saved
  • UpdateNameList (list the names of the cursor fields to be updated and their corresponding base table names)
  • UpdatableFieldList (the list of all fields to be updated)

Mira este artículo: http://www.universalthread.com/ViewPageArticle.aspx?ID=817

Saludos.
Víctor.



--
 
 

Víctor Hugo Espínola Domínguez

unread,
Dec 12, 2012, 3:35:45 PM12/12/12
to publicesvfoxpro
Hola Francisco

Este artículo es muy didáctico: http://www.devx.com/codemag/Article/15699

Saludos.
Víctor.



El 12 de diciembre de 2012 12:18, Francisco <dire...@informatica-apliges.com> escribió:
--
 
 

Francisco

unread,
Dec 13, 2012, 10:42:48 AM12/13/12
to publice...@googlegroups.com
Muchas gracias me ha servido de muchísimo. Solo tengo 2 dudas.

1º) Si traigo todos los registros al CA, con select * from tal.... no estaré cometiendo el mismo pecado que al abrir directamente las tablas de la BD. O al utilizar una conexion a servidor MySql el gestiona la cantidad de registros que completara mi CA.

2º) Es recomendable hacer esto para tener indices? O es mejor cambiar la manera de trabajar... y olvidar el seek
SELECT (oCatalogo.alias) 
=CURSORSETPROP("Buffering",3,oCatalogo.Alias) 
INDEX ON codigo TAG codigo 
INDEX ON descrip TAG descrip 
=CURSORSETPROP("Buffering",5,oCatalogo.Alias) 

3º) Como implemento botones de desplazamiento anterior y siguiente con CA?

Saludos.

Francisco

unread,
Dec 17, 2012, 5:35:24 AM12/17/12
to publice...@googlegroups.com
Muchas gracias me ha servido de muchísimo. Solo tengo 3 dudas.

1º) Si traigo todos los registros al CA, con select * from tal.... no estaré cometiendo el mismo pecado que al abrir directamente las tablas de la BD. O al utilizar una conexion a servidor MySql el gestiona la cantidad de registros que completara mi CA.

2º) Es recomendable hacer esto para tener indices? O es mejor cambiar la manera de trabajar... y olvidar el seek
SELECT (oCatalogo.alias) 
=CURSORSETPROP("Buffering",3,oCatalogo.Alias) 
INDEX ON codigo TAG codigo 
INDEX ON descrip TAG descrip 
=CURSORSETPROP("Buffering",5,oCatalogo.Alias) 

3º) Como implemento botones de desplazamiento anterior y siguiente con CA?

Saludos.

tomcrux

unread,
Dec 17, 2012, 7:14:43 AM12/17/12
to publice...@googlegroups.com
 
Francisco,
como estas?
Te paso algunas ideas que se me ocurren sobre tus ultimas preguntas por su numero:
 
1) Seria conveniente traer desde la BD solo los registros necesarios. Traer la tabla completa puede generar lentitud del sistema. Sin duda esto repercutira con la performance de tu aplicación, mas si tienes en cuenta que con el paso del tiempo esta tabla podria crecer. Colocar select *, tambien no es conveniente a menos que sea estrictamente necesario, solo traer los campos que se requieran mencionandolos uno a uno en el select.
 
2) Crear indices cuando traes los registros puede repercutir en la performance de tu aplicacion. Revisar que tan necesario es hacerlo, no siempre es conveniente.
 
3) Si haces un formulario en donde el usuario se desplace registro por registro con los botones: primer registro/anterior registro/siguiente registro/ultimo registro, pues como sugerencia se me ocurre que el Cursor Adapter solo traiga un registro. Por cada vez que se mueva a un registro traer desde la tabla el que corresponda, sea siguiente, anterior, primero o último. De esta forma al recibir esta informacion desde la BD actualizas los controles del formulario.
 
Quizas lo comentado en el punto 3 te ayude para los puntos 1 y 2. Ya que no es necesario traer toda la tabla a memoria ni tampoco indexarla. Si el usuario quiere realizar una busqueda, entonces envias con un CA la busqueda a la BD y recibes la informacion para completar tu formulario. Esto hace que el trabajo de busqueda se ejecute en el servidor y no en el cliente, respetando el esquema que lleva justamente ese nombre "Cliente/Servidor".
 
Espero estos comentarios te sirvan para decidir como encarar tu dudas, quizas exista alguna manera aun mejor.
 
Saludos desde
Córdoba, Argentina
 
Tomás Cruz.

Víctor Hugo Espínola Domínguez

unread,
Dec 17, 2012, 11:38:53 PM12/17/12
to publicesvfoxpro
Hola Francisco

1) Solamente con tablas pequeñas puedes traer todos los datos del servidor, por ejemplo: Paises, Tipos de documentos, Colores, Profesiones, Cargos, etc...

2) Los índices de cursores pueden ser útiles en algunos casos, uno de ellos para ordenar por diferentes columnas un grid.

3) La navegación por botones solo usaría con datos filtrados mediante una selección efectuada previamente por el usuario. La alternativa más usada es pedir de entrada al usuario que seleccione los datos a traer especificando las condiciones que deben cumplir algunos campos de la tabla, por ejemplo que tenga "juan" en el nombre y "pere" en el apellido, etc. Los registros que cumplen esas condiciones son mostrados en un grid, y desde ahí se elige un registro que será mostrado en la pantalla de ABM.


Desde el enlace previo puedes bajar un archivo rar que contiene:2 proyectos que usan ese método, uno de ellos usando Cursor Adapter y el otro SQL pass-through, ambos funcionan con datos nativos foxpro (dbc/dbf), Sql Server y Firebird. También está incluida una utilidad que construye Cursors Adapters desde DBF, Sql Server, Oracle y MySql. Como yapa va el SQL Demo, una aplicación de Inventario hecha por el colega Walter Ojeda.

Pero como dijo Leo Longanesi“¡No me den consejosMe gusta equivocarme solo”,  mira este enlace: http://wwwa.fpress.com/revista/Num1204/art.htm

Saludos.
Víctor.





--
 
 

ClientServerVFP._rar

Francisco

unread,
Dec 18, 2012, 10:18:17 AM12/18/12
to publice...@googlegroups.com
Gracias a todo por vuestros consejos, yo creo que ya lo tengo todo mucho mas claro.
Reply all
Reply to author
Forward
0 new messages