La Web del Programador: Comunidad de Programadores
 
    Pregunta:  8899 - COMO MANEJAR INDICES DE DBASE O FOXPRO
Autor:  Juan Francisco Alonso Silva
Hola que tal, espero me puedan ayudar con esta dudilla.

Estoy trabajando en un programa que traspasa informacion de una mdb a una dbf pero el problema es que utilizo informacion de un dbf que contiene mucha información, como la estoy usando como dynaset se tarda un muy buen rato (aprox. 45 min. para transferir 200 registros), lo que quiero hacer es utilizar indices en esas tablas para acelerar el proceso. Ya hice los archivos inf con la
informacion de los indices pero no se como utilizarla. Quisiera que me explixcaran como le hago.

Muchas gracias.

  Respuesta:  Tomás González
Juan Francisco:

Primero que nada, supongo que estás trabajando con Visual Basic 3.0, máximo 4 para 16 bits... bueno, suponiendo que es así, te sugiero lo siguiente:

De partida la creación de indices, al menos la forma más rápida y cómoda es creándolos con el maravilloso VisData. Esta aplicación es un regalo que te servirá para ver como trabajar con bases de datos con visual basic. Encontrarás ejemplos para la creación de indices con instrucciones Visual Basic. Te recomiendo que veas como trabajar con los objetos tabledfs, que corresponden a colecciones para la creación de tablas, indices e incluso bases de datos ACCESS. También, si estás trabajando con ACCESS que le heches un visatazo a las instrucciones REPAIR DATABASE y COMPRESSDATABASE, las que te pueden ayudar con el manejo de Bases de Datos ACCESS.

Ahora al grano, en realidad si manejas dynaset, sin índices aún con código SQL se te va a poner pesada la pista. Si bien con los índices hacer una consulta con SQL en un dynaset o snapshot es más eficiente, esto no aumenta mucho la eficiencia y de repente ocurren algunos errores inesperados en el rescate de la información, pero no errores de despliege o interrupción del trabajo, simplemente no te va a rescatar toda la información que cumplan con la clave. Lo mejor, al menos en versiones viejas de VB es abrir la base de datos con un opendatabase, que en Dbase o FoxPro corresponderá a la ruta de directorios en dónde se encuentran las tablas.

es decir:

dim db as database

set db = opendatabase("path_tablas", acceso, "dbase iii") (creo que esos son los parámetros, verifica con el help)

luego tienes que abrir la tabla
para lo cual también deberás tener un objeto tipo TABLE declarado:

dim objTabla as TABLE

set objTabla = db.opentable("NOMBRE_TABLA")
Finalmente, estás en condiciones de abrir el indice...

objTabla.index("Nombre del indice")

Bueno, de esta manera ya tienes la tabla abierta con el indice que deseas, ahora tienes que comenzar a trabajar. Para moverte a través de los registros de la tabla tienes varios metodos que te pueden ayudar...

objtabla.movefirst te mueve al primer registro
objtabla.movenext te mueve al próximo registro
objtabla.find es una función de búsqueda (hay otro que ahora no recuerdo ni el nombre ni la sintáxis, asi que te sugiero consultar en el help)
y por supuesto tienes que tener en cuenta los valores que entregan las funciones objtabla.bof() , el que te indica si estás o no en el principio de la tabla y objtabla.eof() la que te indica que has llegado al final de la tabla.

Bueno eso es, por supuesto que bueno es que al final del proceso ejecutes el objtabla.close, que cerrará la tabla, y db.close la cual cierra el acceso a la BD.

Finalmente, te sugiero que tengas cuidado con los registros borrados en dbase, puesto que lamentablemente en VB en BD dbase, foxpro, y paradox no hace eliminación física de los registros, por lo tanto bueno es que te generes, en base a los tabledefs una función que te RE-CREE los indices.. porque tampoco existe un REINDEX de CLIPPER O DBASE.

Bueno, eso es todo, espero que te pueda ayudar.

Saludos
Tomás González
Santiago de Chile.