Duda con Foxydb y buffering

328 views
Skip to first unread message

Ultraton500

unread,
Apr 17, 2015, 3:26:27 PM4/17/15
to publice...@googlegroups.com
Hola a todos,
usando Foxydb obtengo un cursor editable, le agrego un registro y al intentar hacer una búsqueda (con Seek, Locate o Select) en ese cursor no puedo obtener nada sea cual sea la condición.
Supongo que esto pasa porque al cursor se le aplicó buffering y ahora mi duda es si existe alguna forma de hacer búsquedas sobre el cursor antes de guardar sus cambios en la tabla de la db.
Alguien sabría algo al respecto?
Muchas gracias de antemano.

Saludos,
Javier.

Antonio Meza

unread,
Apr 17, 2015, 3:38:33 PM4/17/15
to publice...@googlegroups.com
Con seek creo que cuando usas indices y los cursores no están indexados.

Con Select sobre un cursor con bufering hace tiempo creo que no me mostraba los registros nuevos o modificaciones que hayas realizado mientras estas editando.

En mi caso uso Locate o recorro el cursor SCAN según lo que necesite.

Creo que no estas usando bien Locate porque si funciona.

saludos
Antonio Meza

Ultraton500

unread,
Apr 17, 2015, 10:42:03 PM4/17/15
to publice...@googlegroups.com
Hola Antonio, gracias por tu respuesta.
Volví a probar con LOCATE y no pude hacer que funcione, entonces para saber si es el buffering lo que lo impide, luego de obtener el cursor con FoxyDB.Query() ... FoxyDB.CursorEdit() coloque la siguiente línea:

SELECT * FROM micursor INTO CURSOR micursor READWRITE

y de esta forma sí funcionan el LOCATE y el SELECT.
Lo que lamento de esta solución que le encontré es que voy a tener que implementar un sistema para reconocer los registros agregados, modificados y eliminados del cursor para luego plasmar en la db esos cambios en lugar de utilizar solo la línea FoxyDB.Update().

Saludos y gracias nuevamente.
Javier.

Antonio Meza

unread,
Apr 18, 2015, 11:25:55 AM4/18/15
to publice...@googlegroups.com
Hola Javier, no deberías tener ningún problema con LOCATE, posiblemente estas escribiendo mal la instrucción y por eso no te encuentra lo que necesitas, yo uso LOCATE para todo dentro de los cursores devueltos o los recorro con SCAN.

Mejor muestra la estructura de la tabla y el código donde abres el cursor, lo editas y luego buscas con locate para ver donde puede estar el problema, o dime que es lo que estas intentando hacer y poder darte ideas.

saludos
Antonio Meza

Ultraton500

unread,
Apr 19, 2015, 2:57:34 AM4/19/15
to publice...@googlegroups.com
Hola Antonio, antes de continuar viendo esto de las búsquedas te pregunto... existe manera de reordenar un cursor editable? pregunto porque veo que el modo buffer tampoco permite el uso de "INDEX ON campo..." y "SET ORDER TO...".

Gracias por tu interés.
Saludos cordiales,
Javier.

Ultraton500

unread,
Apr 19, 2015, 11:03:37 AM4/19/15
to publice...@googlegroups.com
Esta última pregunta parece no tener que ver con el tema pero, como necesito reordenar el cursor luego de cada INSERT, de que sea esto posible o no va a depender si continúo con el uso de cursores editables (FoxyDB.Query()) o no (FoxyDB.Sql()).

Saludos,
Javier.

Antonio Meza

unread,
Apr 19, 2015, 7:37:37 PM4/19/15
to publice...@googlegroups.com
No es posible reordenar un cursor que estas editando, esto no es de Foxydb si no de VFP, pero porque o para que necesitas hacer eso? porque una vez guardado el cursor ya lo puedes ordenar como gustes.

saludos
Antonio Meza

Ultraton500

unread,
Apr 19, 2015, 10:02:01 PM4/19/15
to publice...@googlegroups.com
Mi caso Antonio es bastante complejo pero intentaré resumirlo.
Tengo una tabla que guarda condiciones de 4 tipos y en ella un campo que guarda el id del artículo al que le corresponde cada condición. Muchas condiciones pueden corresponderle al mismo artículo (incluso condiciones de distinto tipo).
En un form tengo un pageframe con 4 pages y en cada uno un grid. Al seleccionar un artículo cargo en cada grid de cada page las condiciones que le corresponden según el tipo (el grid de page1 muestra un cursor con las condiciones de tipo 1, el grid de page2 muestra un cursor con las condiciones de tipo 2, etc.).
A esos cursores el usuario puede agregar, modificar o eliminar registros (condiciones) y como los 4 pages contienen condiciones que le corresponden a un mismo artículo y cada tipo de condición está relacionado con los demás tipos es por eso los cambios no pueden guardarse a medida que se van haciendo. Deben validarse y guardarse todos a la vez o no guardarse ninguno.

Lo de la ordenación es por lo siguiente:
Cada condición tiene un código (por ej. "C001", "C002", etc.) que es usado para formar una expresión lógica cuyo cumplimiento o no será analizado por mi programa. Entonces, si se agregaron las condiciones "C001", "C002" y "C003" y se elimina la "C002" necesito que la próxima que se agregue lleve el código "C002" y que se muestren ordenadas, no solo por una cuestión de orden sino para evitar que el usuario confunda las referencias (esto es porque me pidieron que mi sistema sea APB).

Lo mismo pasaría con una lista de empleados, por ej. a un form se traen los empleados correspondientes a un empleador y por cada cambio hecho es de esperar por parte del usuario que necesite que la lista se mantenga ordenada alfabéticamente.

Sé que estos "inconvenientes" o "limitaciones" se deben al modo buffer que es cosa de VFP y no de FoxyDB.

Valoro y agradezco mucho tu interés Antonio.
Saludos cordiales,
Javier.

Ultraton500

unread,
Apr 19, 2015, 10:17:16 PM4/19/15
to publice...@googlegroups.com
Olvidé aclararte que no es mi intención involucrarte en semejante quilombo ni ponerte a trabajar, la explicación que dí es solo a modo ilustrativo para justificar por qué necesito lo que necesito.
Estoy muy conforme con la ayuda que me has dado, me ha sido de mucha utilidad para continuar y te estoy muy agradecido por eso.

Saludos cordiales,
Javier.

Víctor Hugo Espínola Domínguez

unread,
Apr 19, 2015, 10:22:03 PM4/19/15
to publice...@googlegroups.com
Hola Javier

Para los grid de los pages crea su(s) propio(s) cursor(es), y al inicio tomas los datos del cursor del Foxydb y para actualizar haces el proceso inverso, es decir trasladas los cambios al cursor de Foxydb. Este traslado consta de 3 pasos: Insertar los registros que tienen ID = 0, borrar los registros cuyos IDs no estén en los cursores auxiliares, y Update o Replace de los que tengan el ID en ambos cursores.

Saludos,
Víctor.
Lambaré - Paraguay.

Ultraton500

unread,
Apr 20, 2015, 12:46:21 AM4/20/15
to publice...@googlegroups.com
Hola Víctor, pensaba hacer lo mismo pero con cursores traídos directamente de la db y actualizando los cambios directamente a la db pero con tu idea FoxyDB se encarga de gestionar correctamente los cambios en la db.
Muchas gracias por la ayuda.

Saludos cordiales,
Javier.

Francisco

unread,
Apr 20, 2015, 11:01:40 AM4/20/15
to publice...@googlegroups.com
Creo que cuando utilizamos FoxyDb debemos de cambiar nuestra manera de utilizar los cursores y adaptarnos a traer del servidor BBDD solo aquellos datos que nos sirvan, así pues seek, go, etc y otros comandos habrá que sustituirlos por otros modos de pensar...

Antonio Meza

unread,
Apr 20, 2015, 1:43:09 PM4/20/15
to publice...@googlegroups.com
Hola Javier, la idea es que puedan usar FoxyDb, y si puedo ayudarte con tu problema con gusto lo hago.

Ya leí tu planteamiento, y detecto detalles que no me quedan claros el "por que?" lo haces así, a veces (me incluyo) planteamos mal el problema y por lo tanto un mal diseño de la base de datos lo que lleva a problemas de programación.

Dices que tienes 4 pageFrames imagino que cada pageframe tiene un cursor devuelto de la misma tabla pero con un filtro y nombre diferente por tipo de condición, algo así como Cursor001, cursor002, cursor003, cursor004 esto es correcto?

Ahora, si el usuario agrega en el page1 al cursor001 un articulo este en automático le asignara el tipo C001 puesto que esta en el page1, si agrega otro articulo o el mismo articulo en el page4 pues en automático se agrega el tipo C004.

lo que no me queda claro es porque dices que si el usuario tiene un articulo con el los tipos C001, C002 y C003 pero si elimina el C002 cuando vaya agregar nuevamente debe agregar el C003 y no el C004?

No le veo entonces la ventaja de usar los 4 pageframe? y a demás quien tiene que preocuparse de controlar los tipos C00X ? el usuario o el programa?.porque si el usuario elimina el C002 del page2 y luego se le ocurre ir al page4 pues agregar el C004 no?

Antonio Meza

unread,
Apr 20, 2015, 1:47:03 PM4/20/15
to publice...@googlegroups.com
Realmente tenemos que cambiar de mentalidad, el problema es que con los DBF hacíamos lo que queríamos jajaj pero ya con cualquier servidor de base de datos las cosas cambias, tenemos que usar las buenas practicas y olvidarnos de las malas practicas que nos permitían los DBF,

Al final de cuentas podemos seguir usando las malas practicas con los servidores de bases de datos pero vamos a perder muchas cosas, un ejemplo son los campos ID autoincrementables, hay mucha renuencia al cambio y las ventajas son enormes con ese simple cambio.

saludos
Antonio Meza

Ultraton500

unread,
Apr 20, 2015, 3:42:06 PM4/20/15
to publice...@googlegroups.com
Hola Antonio, puede que me no me haya explicado bien.
Utilizo distintos pages para mostrar las condiciones de distinto tipo, es decir, en page1.grid1 se muestran las condiciones de tipo 1, en page2.grid1 las condiciones de tipo 2, etc..
Cada condición de tipo 1 mostrada en page1 lleva un código: la primer condición será "C001", la segunda "C002", etc..
Cada condición de tipo 2 mostrada en page2 lleva un código: la primer condición será "C001", la segunda "C002", etc..
Cada condición de tipo 3 mostrada en page3 lleva un código: la primer condición será "C001", la segunda "C002", etc..
Cada grid tendrá las condiciones "C001", "C002", "C003", etc.. y considero que además de ser útil sería lo correcto mostrarlas ordenadas.

Por otra parte, me cuesta creer que no reordenar los cursores luego de cada modificación sea parte de cambiar la mentalidad. Estoy de acuerdo con que hay que usar buenas prácticas pero no creo que reordenar un cursor sea una mala práctica. Si el modo buffer lo impide pues se tendrá que trabajar con el modo buffer desactivado. Será una desventaja pero no un impedimento.

Saludos y gracias nuevamente,
Javier.

Antonio Meza

unread,
Apr 20, 2015, 6:03:21 PM4/20/15
to publice...@googlegroups.com
Honestamente no entiendo lo que haces en los 4 pageframe y con tu nueva explicación me dejaste mas confundido, y ahora pienso que están de mas cada pageframe, seria bueno pusieras una captura de pantalla para poder entender mejor lo que necesitas.

Tengo un sistema contable, donde capturas las pólizas y en el detalle de movimientos van las cuentas contables con su importe en el Debe o Haber, uno de mis clientes me dijo que al momento de ingresar una cuenta y su respectivo importe en el Debe o Haber se ordenaran que primero le mostrara todas las cuentas con importe en el Debe y luego los del Haber.

Usando buffer no puedo hacer eso, reordenar un cursor, le explique al cliente que cual era la diferencia que al momento de capturar aparecieran en el orden que iba capturando y al guardar ya mostrara el orden como el lo necesita? me dijo que es por ESTÉTICA!!!

Entonces fuimos a preguntarle a los capturistas y me dijeron que para ellos era mejor en el orden en que se capturaba porque una vez guardado ya podían ver la póliza de forma correcta que no tenían ningún problema en que no se fuera reordenando al momento de capturar. "capricho del Jefe"?

No se si sea tu caso pero te lo comento

saludos
Antonio Meza

Ultraton500

unread,
Apr 20, 2015, 10:31:04 PM4/20/15
to publice...@googlegroups.com
En  realidad lo que expliqué es un muy pequeño resumen de un sistema ya terminado que me tomó mas de un año de desarrollo y al que ahora debo cambiar de motor de db en la obtención de los cursores y en las altas, bajas y modificaciones a la db.
No creo que tenga mucho sentido explicarlo completamente ya que me tomaría mucho tiempo de redacción y aún así muy posiblemente no se entienda considerando que ni siquiera pude explicar claramente el resumen.

Por otra parte, muchas veces he visto programadores detallistas así como he visto programadores que son todo lo contrario y que por ej. confunden la usabilidad con capricho porque lo ven como "pequeños detalles". Pero la diferencia es que la usabilidad tiene su justificativo y su importancia. Por ejemplo, muchos podrán pensar que alternar colores en las filas de un grid es solo un detalle estético pero desconocen que es de mucha utilidad para que el usuario no confunda la correspondencia entre valores de una misma fila. Esto sucede sobre todo cuando existe una distancia suficiente entre un valor de la izquierda y su correspondiente de la derecha como para tener que hacer un repentino y pronunciado movimiento de ojos para poder leerlos. Los monitores wide se prestan mas para eso y ni hablar si el form y el grid se adaptan al ancho de la pantalla. Parece una estupidez pero puede evitar cosas "leves" como por ej. confundir
- un cliente y su deuda
- un paquete y su dirección de entrega
- una factura y su fecha de vencimiento

o cosas mas serias como por ej. confundir
- un ingrediente y su cantidad (en la producción de alimentos o medicamentos)
- un paciente y la fecha y/o hora de su turno
- un paciente y el resultado de su estudio médico
- un paciente y su diagnóstico
- un paciente y su tratamiento farmacológico.

Aunque no sea alta la probabilidad de que ocurran, la probabilidad existe y cualquiera de estos errores puede derivar en consecuencias que pueden ir desde un cliente molesto hasta una mala praxis y solo con un simple movimiento de ojos. Poner unos "colorcitos" pueden minimizar esas posibilidades.
De la misma manera el orden numérico, alfabético o cronológico es de muchísima utilidad para ubicar un registro y ahorrar tiempo. Existe la opción de un buscador pero no solo es mas rápido y mas práctico usar la barra de scroll con una lista ordenada sino que también muchas veces se necesitan cosas como leer la columna de los movimientos estando ordenados de forma cronológica.
Después de todo cómo puede ser que tengamos que responder "no se puede" a un requerimiento tan simple, básico y antiguo como lo es ordenar una lista por al menos una columna?

Puede que el primer comentario parezca un tanto despreciativo pero no es así, solo intento no ocupar mas el tiempo a nadie en mi problema porque con la ayuda que recibí aquí ya pude resolverlo y estoy otra vez en camino.

Saludos y gracias,
Javier.

Antonio Meza

unread,
Apr 21, 2015, 10:59:36 AM4/21/15
to publice...@googlegroups.com
Te desplayaste mucho pero no comentaste nada sobre la necesidad actual, si deseas que te ayude seria necesario primero ver unas captura de pantalla para poder entender mas lo que hace tu sistema y porque la necesidad de ordenar los movimiento cuando se esta editando los registro, porque como te comente una vez que el usuario guarde ahí ya es cuando deberías mostrar ordenados, ya al final.

En lo personal me gusta que mis desarrollos sean lo mas practico posibles, sin caer en caprichos, no tiene nada que ver usabilidad con un capricho, son dos cosas muy distintas, por ejemplo un capricho es el del cliente de un compañero del foro que tiene una tabla de 4 millones de registros y quiere que le muestre ordenados los clientes alfabéticamente y su respectivo numero, si eliminan un cliente ese numero cambia, eso es un capricho, no tiene nada de usabilidad,

saludos
Antonio Meza

Francisco

unread,
Apr 22, 2015, 6:41:32 AM4/22/15
to publice...@googlegroups.com
Yo tengo una cuestión que creo que encaja o es similar a lo que pretende Ultraton y es tengo el clasico sistema de tablamadre y tablahija donde la tabla hija esta en un grid.

Quiero poder insertar/añadir en la tabla hija registros. Se inserta cuando no estas al final de grid. La cuestión es como realizar la reordenación del grid una vez añadido un registro en el cursor tablahija

Ej: Tablamadre 1
Tablahija 11 una linea1
              12 una linea2
              13 una linea3
              14 una linea4

Nos situamos en el grid en la linea 12 y damos insertar linea debería de quedar así:

Tablahija 11 una linea1
              12 una linea2
              13 Nueva linea
              14 una linea3
              15 una linea4

Esto lo he hecho con cursores que tienen indices sobre los mismos. Estoy ahora intentando buscar soluciones para FoxyDB y en ello estoy... ya os contaré... 

Antonio Meza

unread,
Apr 22, 2015, 10:18:40 AM4/22/15
to publice...@googlegroups.com
Pero cual es la necesidad real de reordenar un cursor en tiempo de modificación? si al final al guardar ya le presentas al usuario ordenado con los nuevos cambios? creo que es un poco mas de sensatez ante el usuario.

Ahora bien, para hacer lo que dicen tendrías que usar un cursor y a parte un array, un formulario adicional o en la misma pantalla donde te permita agregar el nuevo registro con todos los campos necesarios, pero ya no permitirías la edición directa en el grid, o mostrar mas bien un ListBox el array, y para modificar un registro de igual forma seria ya por fuera.

De esta forma mantienes el cursor con los cambios sin ordenamiento y la presentación visual la haces por medio de un array al que puedes ordenar las veces que quieras en la forma que quieras, pero pierdes la usabilidad que te permite el grid.

saludos
Antonio Meza

Francisco

unread,
Apr 22, 2015, 10:31:28 AM4/22/15
to publice...@googlegroups.com
Bueno, si insertas una linea y en ese momento quieres verla en su posicion insertada en el grid tipo (Excel cuando insertas una linea) . Entonces que método aconsejas que no sea complejo? Creí que el grid llevaría asociado alguna ordenación pero veo que no...

Carlos Salcedo

unread,
Apr 22, 2015, 10:51:09 AM4/22/15
to visual fox
Muchas gracias

Estare mirando y tratando de conectarme

Saludos
Carlos


Date: Wed, 22 Apr 2015 07:31:28 -0700
From: dire...@informatica-apliges.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Duda con Foxydb y buffering

Antonio Meza

unread,
Apr 22, 2015, 11:39:48 AM4/22/15
to publice...@googlegroups.com
La verdad lo que eh visto en otros programas que quieren permitir mostrar u ordenar en tiempo de modificación usan esa técnica que comente antes, pero no te permiten editar dentro del grid, te dan textbox por fuera donde ingresas la información.o modificas y luego un boton para agregarlo al grid o listbox, pero ya es un array no un cursor.

Pero nuevamente cual es la necesidad real de que el registro se inserte en un orden?

saludos
Antonio Meza

Antonio.xt

unread,
Apr 22, 2015, 11:42:41 AM4/22/15
to publice...@googlegroups.com

Yo siempre incluyo una columna "Orden" en la tabla detalle (hija), por varias razones, para tener un ID de cada fila del detalle, localizar un registro, para saber si es nuevo o una modificacion, y para ordenar cuando se consulta, pero para ordenar cuando se estan ingresando datos al detalle no se me ha presentado hasta ahora, y no se me ocurre una situacion en donde se necesite ordenar al momento de ingresar los datos en el detalle, puede presentarse la situacion, no digo que no, como dijo alguien hace poco: "el cliente lo quiere y dice que es por estetica", yo ni por estetica le veo algun beneficio pero si lo pide el cliente pues ni hablar.

El metodo que usari en ese escenario es el siguiente, suponiendo que esta el detalle en un Grid y tenemos un boton para agregar otra fila al detalle:
Nos posicionamos en el registro donde queremos insertar el nuevo registro, le damos al boton agregar pasando el No de fila (columna orden) al metodo "Agregar", sumamos 1 a la columna "Orden" de las filas siguientes a ese numero, y ese numero lo asignamos a la nueva fila, insertamos, ordenamos de nuevo y ya esta.

Pero como no es una necesidad muy comun, podria crearse este metodo fuera del FoxyDb, ya que como dijo el tocayo la idea de FoxyDb es que sea simple y facil.

Víctor Hugo Espínola Domínguez

unread,
Apr 22, 2015, 11:57:36 AM4/22/15
to publice...@googlegroups.com
Yo tengo un ejemplo de un grid donde el usuario, generalmente el desarrollador, prefiere trabajar sobre el grid: insertar, agregar al final, borrar, mover filas o bloques, copiar filas o bloques y respetando siempre el orden y el color alternado de las filas

La grabación de los datos se hace mediante la clase cursor adapter, el concepto es similar al de FoxyDb, y en el grid se trabaja con un cursor auxiliar el cual es "transferido" al cursor del cursor adapter usando el algoritmo que describí en un post anterior.


Saludos,
Víctor.
Lambaré - Paraguay.

Francisco

unread,
Apr 22, 2015, 12:03:08 PM4/22/15
to publice...@googlegroups.com
Mira aquí tienes el ejemplo de como en VisualFox hacia esa inserción en la primera linea de esta factura y se desplazaban las demás, esto es fácil si hay un Childorder en el grid y no hace falta hacer nada raro. El pq se requiere es bien sencillo visualmente es más cómodo insertar una linea y ver que se coloca en su sitio que insertar en un form diferente para luego verla en su sitio es simple cuestión, si se puede hacer en una hoja de calculo, en tablas de  texto, en el propio texto, en cualquier grid de cualquier otro lenguaje supongo q no será complejo de implementar aquí para resolver este asunto...Tengo que usar un grid y quiero que se abra una linea nueva en el para insertar directamente tal y como lo programé en su día para foxpro pero usando un cursor FoxyDB. Ahora la cuestión es como hacerlo si volcar del cursor de foxy a otro y trabajar sobre este último y luego sincronizar con el de FoxyDb o bien otra forma...  


EJEMPLO_INSERT.jpg

Antonio Meza

unread,
Apr 22, 2015, 12:46:17 PM4/22/15
to publice...@googlegroups.com
Victor, como usas CursorAdapter, una consulta

Permite desconexion al servidor? es decir ya tienes el cursor devuelto si desconectas el cable de red para que pierda conexión al servidor de base de datos y luego lo conectas y mandas a guardar si lo hace?

En el caso de las transacciones como son manuales o automáticas? te permite especificar el tipo de transacción? porque en cada servidor son diferentes.

saludos
Antonio Meza

Antonio Meza

unread,
Apr 22, 2015, 12:55:17 PM4/22/15
to publice...@googlegroups.com
Recuerda que las tablas DBF nos permiten hacer muchas cosas y pues como esta integrado con el lenguaje pues hay infinidad de situaciones ya resueltas.

Ahora se puede lograr el mismo efecto con cursores, agregando un indice temporal (que luego tienes que eliminar y manejar diferente nombre si el sistema trabaja en red) pero ya no usando FoxyDb y perdemos todos los beneficios, porque ya tendrías que realizar los cambios manuales como muchos trabajan. preparando tus Updates, insert, delete para enviar al servidor, etc, etc.

Honestamente no le veo una ventaja operativa ordenar el grid cada vez que insertes un registro, como les comento al final que ya el usuario termino de capturar y guarda se puede ordenar al gusto de el, pero no al momento de editar.

Podrían explicar un caso que el cliente lo requiere y cual fue su necesidad operativa?

saludos
Antonio Meza

Víctor Hugo Espínola Domínguez

unread,
Apr 22, 2015, 1:11:40 PM4/22/15
to publice...@googlegroups.com
Hola Antonio

>Permite desconexion al servidor? es decir ya tienes el cursor devuelto si desconectas el cable de red para que >pierda conexión al servidor de base de datos y luego lo conectas y mandas a guardar si lo hace?

Sí y No, cuando se pierde la conexión el cursor no se destruye pero ya no es posible usar la función TABLEUPDATE()
porque el objeto cursor adapter tiene una propiedad DATASOURCE que ya no sirve para la conexión. Lo que se puede hacer es chequear la conexión y si se ha perdido volver a crear el cursor adapter y ejecutar el método ATTACH con el cursor auxiliar o volver a cargar los datos desde el servido dependiendo de lo que se pretende grabar.

>En el caso de las transacciones como son manuales o automáticas? te permite especificar el tipo de transacción? >porque en cada servidor son diferentes.

La clase tiene una propiedad USETRANSACTIONS que te libera del control de las transacciones, la mayoría de los que usan cursor adapter prefieren usar transacciones manuales enviando los comandos a través de SPT. La técnica es la misma que se usa con vistas remotas.

Saludos,
Víctor.
Lambaré - Paraguay.

Francisco

unread,
Apr 22, 2015, 1:14:46 PM4/22/15
to publice...@googlegroups.com
Se me ha ocurrido ya una forma de salvar esta circunstancia y es creando pasando el cursor de FoxyDB a uno temporal, trabajar en el temporal y luego actualizar el de FoxyDB segun los cambios producidos. Obviamente tiene su lio cambiando el recordsource del grid y tal pero funciona de forma operativa. Ahora hay dos maneras posibles para hacer esto:
1) Paso del cursor de FoxyDB a el cursor temporal propio (CursorAdapter)  y borrando del cursor de FoxyDB todo y luego al terminar paso todo del CursorAdapter al cursor FoxyDB

2) Paso del cursor de FoxyDB al CursorAdapter mantengo los datos en los dos cursores y luego "sincronizo" del FoxyDB conforme el contenido del CursorAdapter.

Creo q esta opcion 2 es la que toma nuestro amigo Victor así que repasare su algoritmo de "sincronizacion"... 

pd: No intento saber cuales son los pros y los contras simplemente tengo que hacerlo así dado que es lo más "lógico/normal/natural/facil" a la hora de añadir lineas en un grid. Nadie me lo exige pero es algo que siempre he realizado de esa manera. Gracias por sus aportes Antonio y Victor sois grandes personas.

pd: Aproposito Antonio, viste mi mail sobre el tema del SET DECIMALS en el FoxyDB?

Víctor Hugo Espínola Domínguez

unread,
Apr 22, 2015, 1:31:44 PM4/22/15
to publice...@googlegroups.com
Hola Francisco

Solo para aclarar conceptos, no debes usar cursor adapter y FoxyDb, o uno o lo otro y no ambos.

Con FoxyDb el algoritmo sería el siguiente:

1) Traes los datos usando FoxyDb
2) Los copias al cursor del grid, previo ZAP
3) Usas el grid, agregar, insertar etc..
4) Aplicas los cambios al cursor de FoxyDb: Insert, Update o Replace, Delete
5) Envías el cursor del FoxyDb al servidor usando los métodos del FoxyDb

Saludos,
Víctor.
Lambaré - Paraguay.

Antonio Meza

unread,
Apr 22, 2015, 1:55:00 PM4/22/15
to publice...@googlegroups.com
Hola Francisco, gracias por tus aportes!!! el del parámetro adicional esta completo lo voy a publicar en el blog.

En cuanto a Set decimal, no se afecta al cursor devuelto por SQLEXEC, puedes verlo con un BROW que respeta los decimales que trae los campos del cursor y no los que hayas definido con Set decimal, has la prueba mostrando el cursor con BROW y comentas.

NOTA: Realmente el correo de GMAIL no lo uso y se me olvida ver los correos, es mejor por aquí, así sirve que si otro compañero mas experimentado nos pueda dar sus opiniones o recomendaciones, o corregir si estamos equivocados en algo.

saludos
Antonio Meza

Francisco

unread,
Apr 22, 2015, 1:55:55 PM4/22/15
to publice...@googlegroups.com
Exacto Victor me he liado ahí y he mezclado cursores y cursorAdapter... sorry... Efectivamente es como dices... solo me falta ver como hacer ese update,insert,delete de manera eficiente... 

Saludos.

Antonio Meza

unread,
Apr 22, 2015, 2:10:31 PM4/22/15
to publice...@googlegroups.com
Francisco recuerda que FoxyDb también tienes la función SQL() que te devuelve un cursor que no sera administrado por Foxydb. entonces se me ocurre que puedes hacer lo siguiente

Obtienes el cursor con Sql("select * from detalles order by orden","detalles")
Luego ya podrás hacer y deshacer este cursor, por ejemplo le agregas o quitas registros, le agregas un indice, lo reordenas, solo que para reordenarlo seria así

select * from detalles order by orden into cursor detalles readwrite
index on orden to detalles

Y cada vez que reordenes tienes que generar de nuevo el indice, lo malo es que ya tienes que ver la forma de detectar los cambios y poder enviarlos al servidor, pero al menos este cursor no marcara ningún error con la librería, puesto que solo son administrados cuando usas USE() o Query()

Ultraton500

unread,
Apr 22, 2015, 4:27:37 PM4/22/15
to publice...@googlegroups.com
Tal como lo sugerido anteriormente por tí Víctor estoy empezando a implementar este concepto.
De esta forma por un lado no se estaría aprovechando toda la potencia del cursor editable de FoxyDB pero por otro lado no tendríamos las pequeñas limitaciones que produce el modo buffering activado. Lleva un poco mas de programación pero hace que sea posible.
A mi me pasa lo mismo que a Francisco, independientemente de que mi cliente me pidió que el sistema sea APB (A Prueba de Boludos) es cosa mía lo de mantener un orden en los grids porque siempre lo hice así, porque está bien justificado, es lógico y porque es a mi modo de ver lo que corresponde.
Como usuario es algo que me gusta, aprovecho y valoro de otros programas y no debe ser casualidad que grandes productos están llenos de estos detalles en sus interfaces que mejoran la experiencia del usuario.

Saludos cordiales,
Javier.
cursores_y_foxydb.jpg

Víctor Hugo Espínola Domínguez

unread,
Apr 22, 2015, 6:49:55 PM4/22/15
to publice...@googlegroups.com
Hola Francisco

Adjunto código genérico para esas operaciones. Espero te sirva.

Saludos,
Víctor.
Lambaré - Paraguay.

curAuxiliar2Actualizable.prg

Francisco

unread,
Apr 23, 2015, 4:29:03 AM4/23/15
to publice...@googlegroups.com
Grande Victor un procedimiento genial, me has / nos has ahorrado horas de trabajo. Sencillo y eficaz el código.

Francisco

unread,
Apr 23, 2015, 4:47:09 AM4/23/15
to publice...@googlegroups.com
Bueno he visto que la función en modo replace es algo lenta para cursores con 5000 registros no es habitual que una tabla lineas tenga tantos pero se me antoja un poco lenta, voy a probar un update a ver si funciona más rápido... pero ahora me tarda 1min en actualizar.... 

Francisco

unread,
Apr 23, 2015, 6:41:40 AM4/23/15
to publice...@googlegroups.com
Estoy probando algo así y va mucho más fluido aún así creo que se puede mejorar: (solo para el update, el resto va de lujo)

lcUpdate1=""
lcUpdateWhere=""
lcUpdateWhere1=""
For lnI = 1 To m.lnKntCampos
lcCampo = Upper(Alltrim(Field(m.lnI, m.tcCurActualizable, 0)))
If m.lcCampo == Upper(Alltrim(m.tcClavePrimaria))
Loop
Endif
IF EMPTY(lcUpdate1)
lcUpdate1= m.lcCampo+" = "+m.tcCurAuxiliar+"."+m.lcCampo
ELSE
lcUpdate1= lcUpdate1 + ", "+ m.lcCampo+" = "+m.tcCurAuxiliar+"."+m.lcCampo
ENDIF
IF EMPTY(lcUpdateWhere)
lcUpdateWhere= m.lcCampo+" <> "+m.tcCurAuxiliar+"."+m.lcCampo
ELSE
lcUpdateWhere= lcUpdateWhere + " OR "+ m.lcCampo+" <> "+m.tcCurAuxiliar+"."+m.lcCampo
ENDIF
EndFor
lcUpdateWhere1=m.tcClavePrimaria+" = "+m.tcCurAuxiliar+"."+m.tcClavePrimaria
Select (m.tcCurAuxiliar)
Scan For Not Empty(Evaluate(m.tcClavePrimaria))
cSQL="UPDATE "+m.tcCurActualizable+" SET "+lcUpdate1+" WHERE ("+lcUpdateWhere+") AND "+lcUpdateWhere1
&cSQL
*=MESSAGEBOX(cSQL)
Endscan

Víctor Hugo Espínola Domínguez

unread,
Apr 23, 2015, 6:34:55 PM4/23/15
to publice...@googlegroups.com
Hola Francisco

Prueba este código:

Local lcCampo, lcUpdate1, lcUpdateWhere, lcUpdateWhere1, lnI
Local lnKntCampos
*:Global cSQL

Set Exact On
Set Ansi On

lcUpdate1   = ""
lcUpdateWhere  = ""
lcUpdateWhere1 = ""
lnKntCampos   = Fcount(m.tcCurActualizable)
For lnI = 1 To m.lnKntCampos
lcCampo = Upper(Alltrim(Field(m.lnI, m.tcCurActualizable, 0)))
If m.lcCampo == Upper(Alltrim(m.tcClavePrimaria))
Loop
Endif
If Empty(m.lcUpdate1)
lcUpdate1 = m.lcCampo + " = " + m.tcCurAuxiliar + "." + m.lcCampo
Else
lcUpdate1 = m.lcUpdate1 + ", " + m.lcCampo + " = " + m.tcCurAuxiliar + "." + m.lcCampo
Endif
If Empty(m.lcUpdateWhere)
lcUpdateWhere = m.tcCurActualizable + "." + m.lcCampo + " <> " + m.tcCurAuxiliar + "." + m.lcCampo
Else
lcUpdateWhere = m.lcUpdateWhere + " OR " + m.tcCurActualizable + "." + m.lcCampo + " <> " + m.tcCurAuxiliar + "." + m.lcCampo
Endif
Endfor
lcUpdateWhere1 =  m.tcCurActualizable + "." + m.tcClavePrimaria + " = " + m.tcCurAuxiliar + "." + m.tcClavePrimaria

*Select (m.tcCurAuxiliar)
*Scan For Not Empty(Evaluate(m.tcClavePrimaria))
cSQL = "UPDATE " + m.tcCurActualizable + " SET " + m.lcUpdate1 + ;
+ " FROM " + m.tcCurAuxiliar + " WHERE (" + m.lcUpdateWhere + ") AND " + m.lcUpdateWhere1
*Endscan
*Messagebox(cSQL)
*&cSQL
Execscript(cSQL)

Sería interesante que hagas una comparación entre la macro sustitución y EXECSCRIPT.

Saludos,
Víctor.
Lambaré - Paraguay.

Francisco

unread,
Apr 24, 2015, 7:45:01 AM4/24/15
to publice...@googlegroups.com
El rendimiento es espectacular. Va mucho mejor. Tendré que adaptar las otras delete y insert...
Reply all
Reply to author
Forward
0 new messages