mejor modo de abrir tablas

3,014 views
Skip to first unread message

Elio Tavarez

unread,
Aug 26, 2015, 2:48:04 PM8/26/15
to mundovis...@googlegroups.com
Buenas tardes amigos.

Favor de aclararme una duda que tengo.
Cual es la forma mas eficiente para abrir una tabla, en el entorno de datos o en el load del formulario?

Estoy optimizando unos programas para ejecutarse en una red local con tablas nativas y utilizando el insert-sql,
por lo que me gustaría saber cual es la forma mas eficiente.

En el entorno de datos solo agrego la tabla.

El el load, uso el siguiente código
 
if !used ("tabla")
    use tabla shared
endif


Gracias por su respuestas.


"Se Puede Vivir Sin Dañar a los Demas"

Carlos Alberto

unread,
Aug 26, 2015, 4:07:58 PM8/26/15
to Mundo Visual FoxPro
Yo suelo abrir las tablas en el Load. Me parece el mejor lugar pues es el primer evento que ocurre al cargar el form, y ademas tienes mas control que si lo abrieras en el Entorno de Datos ya que puedes establecer una ruta en el caso de pruebas. Por ejemplo USE (wruta+'TABLA') IN 0 SHARED.

Saludos.
Carlos.

Fidel Charny

unread,
Aug 26, 2015, 4:26:19 PM8/26/15
to Mundo Visual FoxPro

Víctor Hugo Espínola Domínguez

unread,
Aug 26, 2015, 5:36:06 PM8/26/15
to mundovis...@googlegroups.com
Hola Elio


>Cual es la forma mas eficiente para abrir una tabla, en el entorno de datos o en el load del formulario?
>Estoy optimizando unos programas para ejecutarse en una red local con tablas nativas y utilizando el insert-sql,
>por lo que me gustaría saber cual es la forma mas eficiente.

Bajo esa premisa la respuesta es:  Ni en el entorno de datos ni el el load del fomulario, mejor FUERA del formulario.

http://fdbozzo.blogspot.com.es/2014/10/vfp-la-interfaz-las-reglas-de-negocio-y.html

https://www.universalthread.com/ViewPageArticle.aspx?ID=232

Desde el último enlace puedes bajar un ejemplo.

Saludos,
Víctor.
Lambaré - Paraguay.


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Carlos Miguel FARIAS

unread,
Aug 26, 2015, 7:10:31 PM8/26/15
to mundovisualfoxpro
Pensaría en una clase persistencia, con metodos para abrir, con o sin indices.
O sea basicamente una clase tipo capa datos.
Entonces, alli puedes tener unificadas y organizadas todas tus operaciones con tablas.
Como todas las tablas se abren con el mismo código, puedes agregar cualquier tipo de control.
Es mas la clase debería crearte los cursores correspondientes.
En fin, la regla es usar la menor cantidad de código posible. Tengo entendido que el entorno de datos abre más rápido las tablas que ponerlas en el LOAD. Y si luego quieres pasar a Cursor Adapter, me parece que desde el load se te va a complicar.
Saludos: Miguel, La Pampa (RA)

HernanCano

unread,
Aug 27, 2015, 12:57:32 PM8/27/15
to Mundo Visual FoxPro
Miguel:
me interesan técnicas de optimización.

¿Me das documentación sobre lo que mencionas, por favor?

Gracias por compartir.

Miguel Santander

unread,
Aug 27, 2015, 1:05:11 PM8/27/15
to mundovis...@googlegroups.com

Hola Miguel

 

Creo que sería muy interesante potenciar esa parte se podría tener alguna documentación sobre eso, por favor.

--

Fernando D. Bozzo

unread,
Aug 27, 2015, 3:08:43 PM8/27/15
to Mundo Visual FoxPro
Hola Hernan:

Lo que comenta Miguel es la capa de datos, donde una clase se encarga de abrir, consultar, actualizar y cerrar las tablas, tal cual vimos en algunos de los ejemplos de capas.

Entonces una de las ventajas que se ven, es que al ser siempre el mismo codigo el encargado de realizar estas tareas, cuando mas partes del sistema lo usen, mas optimizado esta el acceso de datos y además aumenta la posibilidad de que los datos se cacheen en memoria.

Esto unido a la técnica de apertura de tablas con distintos alias mediante shared again, te da más velocidad todavía, ya que VFP reutiliza el handle del archivo abierto, lo que no consume memoria extra y permite mantener la misma tabla abierta bajo distintos alias y con distintos índices, sin que una afecte a la otra, y así se evita todo ese código que se suele poner para verificar si la tabla estaba abierta, guardar que índice tenía, guardar el puntero de registro, etc, etc., que son las viejas prácticas a desterrar.

Como se ve, las capas tienen varias ventajas :)


Saludos.-

Carlos Miguel FARIAS

unread,
Aug 27, 2015, 3:28:39 PM8/27/15
to mundovisualfoxpro
Para cualquier optimización en Fox, piensen en como funciona.
Fuente -> FXP (precompilado) -> Runtime.

Ejemplo:
USE unaTabla IN 0  && Abro en alguna parte
SELECT unaTabla
SET ORDER TO TAG unIndice && establezco un orden
...
lcTablaAntes = ALIAS()  && aca llegue de otra area, quiere recuperar después
SELECT unaTabla
lcOrdenAntes = ORDER(unaTabla)  && luego de acceder quiero el orden anterior
SET ORDER TO TAG otroIndice  && establezco nuevo indice
SEEK loQueBusques  && uso comando SEEK y
IF FOUND()  && ... luego el FOUND
* lo encontraste
ELSE
* no lo encontraste
ENDIF 
SET ORDER TO (lcOrdenAntes)  && dejo una tabla con el indice anterior
SELECT (lcTablaAntes)  && vuelvo al área anterior

todo eso tiene que traducirse a llamadas a funciones C (C++) del runtime, una a una.
Entonces, la optimización de código pasa por reducir la cantidad de líneas de código y por ende, menor cantidad de llamadas en el runtime

USE unaTabla IN 0
* SELECT unaTabla  && La tabla la selecciono solo en última instancia
* SET ORDER TO TAG unIndice  && no fijo orden, para reducir por lo que indico mas adelante
...
IF SEEK(loQueBusques, "unaTabla", "otroIndice") && fijense cuantas instruccione elimine
* lo encontraste
ELSE
* no lo encontraste
ENDIF
* SET ORDER TO (lcOrdenAntes) tampoco necesito restaurar nada.
* SELECT (lcTablaAntes)

O sea, menor cantidad de instrucciones, más velocidad, de ejecución, de escritura, menor probabilidad de errores de codigo.
Menor acoplamiento entre metodos.

Y con el entorno de datos, pasa que las llamadas de apertura no las codificas, por eso son más rápidas.
Justo entro el mensaje de Fernando, lo que me ahorra tipear algunas cosas.

Y como comenta Fer, si usas capas, sos más rápido (Superman ;-D), cuando menos código +mejor.
Y si no repetis código, más rápido se carga el programa, menor probabilidad de swap de memoria, más espacio para buffers, todo es más rápido.
Por eso en otro post se hablaba de las ventajas del INSERT INTO en reemplazo del APPEND BLANK + REPLACE.

Piensen como glotones, quieren todo más rápido. Porque es mejor u Chopp que una botella para la cerveza, porque el Chopp no tiene cuello de botella.

Si quieres un sistema rápido, piensa en cual es el cuello de botella.
El mayor cuello de botella, es el Usuario. Entonces, debes buscar hacer que el usuario no frene el sistema (Código de Barras).
Luego viene la Red, la red es una caja negra salvo que seas un experto en redes, y como aceleras la red?
Tablas o datos que se modifican casi nada (codigos postales) replicalas (clonalas) y hacelas locales.
Los archivos temporales no se comparten, configura para que sean locales.
Abrir y cerrar tablas a cada rato, pone lenta la cosa, pero, reduce la probabilidad de corrupción de datos.
Y luego optimizas el código, haciendo que sean las menor cantidad de instrucciones posible (las que se ejecutan).
Todo lo que no se modifica dentro de un bucle, ponelo antes.
Evitar DO WHILE para recorrer tablas, mejor SCAN.
Si usan scan, no hace falta poner filtros.
Si hacen SCAN en tablas muy grandes siguiendo el orden de un indice,
primero una función SEEK() con SET NEAR ON
y luego SCAN REST
Y así muchas otras cosas.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, al menos hasta el inodoro

HernanCano

unread,
Aug 28, 2015, 4:01:31 PM8/28/15
to Mundo Visual FoxPro
Chévere, Fernando.
Muchísimas gracias.

Conozco lo de USE...ALIAS y  AGAIN, sólo que algunas cosas uno no las hacía (o mejor no las hace) de implementar así para abrir...oldrecno...seek...go oldrecno....

Seguimos en contacto.


Elio Tavarez

unread,
Aug 29, 2015, 9:23:24 AM8/29/15
to mundovis...@googlegroups.com

Gracias Muchachos por contestar, la verdad me han dado muchas ideas al respecto, abrirla en el
load y agregarle el alias es una gran ventaja, puesto que me permite abrir tablas las veces que quiera
y con el indice necesario. Gracias por sus comentarios

Elio Tavarez

"Se Puede Vivir Sin Dañar a los Demas"




Date: Fri, 28 Aug 2015 13:01:31 -0700
From: jherna...@gmail.com
To: mundovis...@googlegroups.com
Subject: Re: [Mundo Visual FoxPro] mejor modo de abrir tablas

Miguel Osers

unread,
Aug 30, 2015, 12:45:42 PM8/30/15
to Mundo Visual FoxPro
Buenos dias, yo por lo general tengo un procedimiento de apertura para cada tabla diferente, a este procedimiento le paso como parametros el area en el que quiero abrir la tabla, el archivo fisico de la tabla y el alias que desea usar. este procedimiento a su vez determina primero que nada si la tabla fisica existe, en caso de no existir, creamos la tabla con su estructura, y verificar si los indices que debe usar existen o no, en caso que no existan, se abre la tabla en modo exclusivo y se crea el indice necesario.

durante la evolucion del programa, es necesario en ocasiones modificar la estructura agregando o eliminando campos, esto lo hacemos desde el mismo procedimiento mediante alter table y asi es muy sencillo actualizar tablas de datos en instalaciones de usuarios finales sin necesidad de hacer respaldo y copiando las nuevas bases de datos.


En el siguiente ejemplo buscamos abrir la tabla c:\datos\demo.dbf el area de trabajo 3 con el alias DEMO Para el ejemplo vamos a tener creada una tabla pero con el campo TIPO definido como 5 caracteres y sin el campo ESCALA. El programa debe determinar estas faltas y corregir la estructura.

el programa puede tener cualquier nombre, yo utilizo el nombre del tipo de base de dato asi: dbf_datgen.prg

cuando queremos abir la base de datos generales lo llamamos asi:

Contestando la pregunta original, abro la base de datos antes de llamar a la forma y cierro la tabla al salir de la forma antes del thisform.release.




lastfolder="C:\Datos\"
archx=lastfolder+"demo"
do dbf_datgen with "3",archx,"DEMO"




PROCEDURE dbf_datgen
PARAMETERS _area,_nomdbf,_alias
* _area parametro de caracteres donde esta indicado el area de trabajo, puede ser expresada como numero o letra ( 3 o c)
*_nomdbf paramatero de caracteres en el cual se pasa la ubicacion fisica de la base de datos (puede o no, tener la extension dbf)
* _alias parametro de caracteres en el cual se indica el alias con el que se abre la tabla.

SELECT (_area)
_nomdbf=FORCEEXT(_nomdbf,"DBF")
IF !FILE(_nomdbf)                                        && Si no existe la tabla la creamos y agregamos los campos necesarios
create table (_NomDbf) (;
              TIPO       C (  10 ,   0 ),;
              PROYECTO   C ( 180 ,   0 ),;
              EMPRESA    C ( 180 ,   0 ),;
              OBSERVA    C ( 180 ,   0 ),;
              ESCALA     N (   2 ,   0))
endif

use (_nomdbf) ALIAS &_alias

IF LEN(tipo)<>10   &&Verificamos que el campo tipo sea de 10 caracteres, en caso contrario, modificamos la definicion de la columna
 use dbf() exclu
 ALTER TABLE DBF() alter COLUMN tipo c(10)
use dbf() alias  (_alias)
ENDIF

IF TYPE("demo.escala")="U" && Verificamos el campo escala si no existe abrimos la tabla en modo exclusivo, agregamos una columna y abrimos el archivo compartido
 use dbf() exclu
   ALTER TABLE DBF() ADD COLUMN escala n(2,0)
 use dbf() alias (_alias)
   replace escala WITH 0
ENDIF

RETURN


Si les gustó la metodologia, puedo explicar o anexar un programa que genera el archivo dbf_datgen.prg o equivalente para cualquier tabla abierta, generando el create table y los indices que usa

Espero les sea de utilidad

Miguel Osers
H&R&T OSERS, Ingenieros
Caracas-Venezuela

Fernando D. Bozzo

unread,
Aug 30, 2015, 6:33:52 PM8/30/15
to mundovisualfoxpro
Hola Miguel:

Una rutina de apertura de tablas que hace todo esto, no solo no es un buen diseño, sino que va contra todo lo que significa encapsular, simplificar y pensar en multi-usuario.
Como metodología de trabajo realmente no es nada recomendable, ya que mezcla varias cosas que jamás deberían formar parte de "una apertura" de tablas y lo de seleccionar el área de trabajo se dejó de usar antes de finalizar el siglo pasado, además lo de abrir la tabla en exclusiva hace que este tipo de aperturas solo sirva en instalaciones con un solo usuario, metodología que ya nace desactualizada en un mundo de información compartida y multi-usuario.

Saludos.-



--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/mundovisualfoxpro/GTT5o2l1Q5s/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages