Entonces de plano ya no se usa reindex con los indices CDX?..

2,382 views
Skip to first unread message

TheNewInquirer

unread,
Mar 30, 2012, 5:52:29 PM3/30/12
to Comunidad de Visual Foxpro en Español
Mi pregunta era cuando reindexar automaticamente. He usado los CDX. De
los otros 2 o 3 tipos de indice que menciona el manual del
programador, no he visto la necesidad de usarlos.

Me dicen que los CDX se reparan solitos. Es cierto eso?.. Ya no hay
que usar el reindex para nada?...

Walter R. Ojeda Valiente

unread,
Mar 30, 2012, 6:09:42 PM3/30/12
to publice...@googlegroups.com
En general no es necesario, porque tanto cuando insertas registros o haces un PACK de la tabla el VFP se encarga de regenerar los índices pero tener esa opción dentro de tu aplicación siempre es una buena práctica "por las dudas".

Saludos.

Walter.




> Date: Fri, 30 Mar 2012 14:52:29 -0700
> Subject: [vfp] Entonces de plano ya no se usa reindex con los indices CDX?..
> From: thenewin...@gmail.com
> To: publice...@googlegroups.com

Luis Maria Guayan

unread,
Mar 30, 2012, 7:58:31 PM3/30/12
to publice...@googlegroups.com
Seguramente alguna vez tendrás que regenerar los índices por mantenimiento u otro motivo, y mejor que utilizar el REINDEX es volver a generarlos con INDEX ON

Ya no se utilizan los archivos IDX, solo están por compatibilidad hacia atrás de versiones anteriores. Los indices complejos o CDX tienen muchas ventajas contra los IDX

Busca en la carpeta de instalación de VFP el archivo GenDBC.PRG, Ejecutalo con tu base de datos y te generará un archivo .PRG con todos los comandos para crear tus tablas e índices. De allí tomas los comandos para regenerar tus índices cuando sea necesario.


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

TheNewInquirer

unread,
Mar 30, 2012, 8:32:18 PM3/30/12
to Comunidad de Visual Foxpro en Español
Suuuuuuuuper!! Gracias Maestros! Ya me dieron ganas de programar otra
vez. Ya me estaba decepcionando de este mundo de la programación, pero
de la mano de Fox sé que aprenderé bien y rápido.

Saludos!

TheNewInquirer

unread,
Mar 30, 2012, 8:49:47 PM3/30/12
to Comunidad de Visual Foxpro en Español
Sobre lo del mantenimiento manual ya tengo claro que debe existir un
módulo para mantenimiento y utilerías.

Incluso he visto que algunos usan una aplicacion externa al sistema
para reparar cosas por fuera.

Lo que no sabía es que es mejor volver a crear los índices en vez del
reindex.

Ya ven por que prefiero preguntar?? a "leer horas el manual" del
programador que menciona tantas cosas "tan fenomenales" que ustedes ni
siquiera las usan porque no son prácticas..

Yo me refería al reindexado "automático" que se solía hacer al parecer
al iniciar el sistema, o al cerrar el sistema o al usar modulo, si se
detectaba que un solo usuario estaba usando la base y aprovechando eso
zaz.. se reindexaba.

Pero según me aclararon ahora.. ya no tendré que preocuparte por
"programar" reindexados durante la ejecución del programa cuando hay
un solo usuario que pueda tomar el modo exclusivo.

Yuuujuuuuuu!!!

Una muy buena noticia para mi, después de tantas preguntas jeje

Saludos!

TheNewInquirer

unread,
Mar 30, 2012, 10:31:33 PM3/30/12
to Comunidad de Visual Foxpro en Español
Leyendo la ayuda sobre set order to 0 me pregunto, cuando tengo que
usar eso?

Normalmente usaba esto en el load de los forms y para cargar grids
ocultos en el form:

SET DATE ITALIAN

CLOSE DATABASE
SET SAFETY OFF

SET EXCLUSIVE ON

USE VENTAS
INDEX ON ALLTRIM(CLAVEVENT)+DTOS(FECHA) TAG CLAVEVENT
USE

USE PRODUCTOS
INDEX ON ALLTRIM(CLAVEPROD) TAG CLAVEPROD
USE

SET EXCLUSIVE OFF

SELE 3
USE CLIENTES

SELE 7
USE VENTAS
SET ORDER TO CLAVEVENT

SELE 11
USE PRODUCTOS
SET ORDER TO CLAVEPROD


Sé que debo usar el sele 0 para dejar que fox controle el numero de
area, pero ese es otro tema.

Mi pregunta es cuando debo usar ser order to 0 y por qué?... Como
afecta su uso o no uso a la eficiencia de los índices?..

Saludos!

Walter R. Ojeda Valiente

unread,
Mar 30, 2012, 10:44:59 PM3/30/12
to publice...@googlegroups.com
Tienes un error de concepto.

Cuando creas tu tabla, también debes crear sus índices estructurales (los que se guardan en un archivo con extensión .CDX), pero NO DEBES crear los índices cada vez que abres la tabla. Desperdicias tiempo improductivamente haciendo así. En tablas que tienen pocos registros no lo notarás, pero en tablas grandes perderás minutos volviendo a crear índices que ya estaban creados. No tiene sentido.

El SET ORDER TO 0 lo utilizas cuando quieres acceder a tu tabla en el mismo orden en que se cargaron los registros. O cuando vas a insertar muchos registros "a bulto". En este caso ahorrarás tiempo deshabilitando los índices, insertando todos los registros y luego recreando los índices.

Saludos.

Walter.



> Date: Fri, 30 Mar 2012 19:31:33 -0700
> Subject: [vfp] Re: Entonces de plano ya no se usa reindex con los indices CDX?..
> From: thenewin...@gmail.com
> To: publice...@googlegroups.com
>

TheNewInquirer

unread,
Mar 30, 2012, 10:57:48 PM3/30/12
to Comunidad de Visual Foxpro en Español
Ok. Perfecto... Menos código y más eficiencia.. me gusta eso jeje..

Entonces entiendo que set order to 0, desactiva los indices CDX.

Es que me explicaron como hace uso el Rush More de los índices y su
relación con set order to 0, pero no entendí su uso práctico y quería
saber.

Gracias!

Hugo C.

unread,
Mar 30, 2012, 11:52:09 PM3/30/12
to Comunidad de Visual Foxpro en Español
Un poco de RUSHMORE (La magia de FOX que ya esta en SQL SERVER y
ACCES, Gracias a FOX)

http://www.fpress.com/revista/Num0902/xyart4.htm

Saludso.

Carlos Miguel FARIAS

unread,
Mar 31, 2012, 8:39:38 AM3/31/12
to publice...@googlegroups.com
Cuidado! Si tenes un indice estructural, SET ORDER TO 0 lo desactiva a los efectos del acceso, pero sigo "abierto" para inserciones y modificaciones. Cuando se hacen inserciones a granel, lo conveniente es borrar el cdx, y luego recrearlo.
En el código que pasastes, cosas que debes desechar
Nunca selecciones el area de una tabla con SELECT numerodearea, siempre referenciate con SELECT nombredetabla.
Cuando haces un USE tabla conviene usar toda la sintaxis de ese comando para ahorrar lineas de codigo (lo que se hace mas claro por simplicidad)

USE tabla IN 0 ORDER TAG tuIndicePreferido ALIAS aliasParaTuTabla AGAIN SHARED

porque?
IN 0 te abre la tabla en alguna area libre (esto debería ir siempre, evitas cerrar accidentalmente otra tabla)
ORDER TAG activa directamente un indice para acceder u ordenar (esto solo si es el unico acceso que haras y no usaras tambien SELECT , sobre la tabla).
SHARED, si es compartida, EXCLUSIVE si es para mantenimiento (PACK, INDEX ON, REINDEX, etc.)
ALIAS sirve para manejar un nombre de tabla diferenciado, si por alguna razón necesitas tener la misma tabla abierta mas de una vez por las razones que tu aplicación requiera, esto evita superposiciones de nombres (aca agregar AGAIN, de nuevo)
Esto último es interesante si a la tabla de clientes (p.e.) la quieres acceder al azar id cliente y visualizarla por nombre de cliente.
Entonces:
USE Clientes IN 0 ORDER TAG xId ALIAS ClientesAzar AGAIN SHARED
USE Clientes IN 0 ORDER TAG xNombre ALIAS ClientesLista AGAIN SHARED

no tenes que preocuparte donde se abren (IN 0) y cada cual tiene su indice activo independiente (ORDER TAG), el ALIAS para poder diferenciarlas después, en este caso AGAIN y SHARED son obligatorios

Alguno podra decir que el shared lo simplifica con SET EXCLUSIVE OFF, pero esto último, donde lo pusiste, con SHARED lo tenes documentado AHI.

La grilla la asocias con ClientesLista (y visualizas en orden de nombre) y los acceso al azar los haces con ClientesAzar (y no de te cambia la posición en la grilla).

Ahora, para acceder al azar, personalmente, uso toda la potencia de la función SEEK
con SEEK( valorABuscar, "nombreTabla", "rotuloIndice" ) de esa manera no necesito hacer un SET ORDER TO previo o activar el indice al abrir, es más, podrìa tener otro indice activo en la tabla sin tener que desactivarlo.
No necesito posicionarme en el area de la tabla a acceder con el seek y podría acceder a la tabla por distintos indices sin intercalar los SET ORDER TO respectivos.

Esto tiene la ventaja además que me ahorra tener que desactivar el indice (SET ORDER TO 0) al momento de hacer un SELECT de SQL sobre la tabla (que comente en otro hilo, pone mas lento el rushmore).

O sea que usando bien la expresividad de cada función que nos da vfp, escribimos mucho menos, y eso hace el programa más ràpido, màs pequeño, más documentado, con menor probabilidad de una parte afecte otras partes, etc.

Muchas veces, la solución de muchas cosas, esta a un F1 de distancia

Saludos: Miguel, Santa Rosa (LP)

TheNewInquirer

unread,
Mar 31, 2012, 11:28:04 AM3/31/12
to Comunidad de Visual Foxpro en Español
Tengo la ayuda de VFP 8 y VFP 9, para para ser order to 0, las cosas
no vienen claras, como no lo son para muchas otras cosas tanto en el
manual como en la ayuda.

Ademas la ayuda viene en trozos y a veces es dificil ver "the whole
picture" (El cuadro completo) de la situacion.

Gracias!

Luis Maria Guayan

unread,
Mar 31, 2012, 12:27:40 PM3/31/12
to publice...@googlegroups.com
Varios "errores" de conceptos ...

1. Los índices se generan solo una vez al momento de la instalación o diseño.
2. No soy muy amigo de los índices compuestos, ya que no uso cláusulas como SEEK, tengo índices por cada campo y solo utilizo sentencias SELECT optimizadas con esos índices. Si deseo buscar la venta "123", del día de hoy, hago SELECT * FROM VENTAS WHERE ClaveEnt = "123" AND Fecha = DATE(2012,03,31) ... un extra de esta técnica es que tus aplicaciones ya se van amoldando a usar en un futuro motores de bases de datos externos, allí no existe el SEEK ni muchas funciones de VFP
3. Evitar usar funciones en tus índices (INDEX ON ALLTRIM(CLAVEPROD) o DTOS(Fecha)) tendrás que utilizar la misma expresión para sus búsquedas ya sea con SEEK o SELECT ... WHERE "123" = ALLTRIM(CLAVEPROD)
3. Lo del uso de números fijos para areas de trabajo es algo de la época del xBase que solo disponias de 10 áreas de trabajo, allí tenias que ser muy cuidadoso en esa limitación. Siempre usar el SELECT 0 o mejor aun abrir las tablas con la cláusula USE XXX IN 0
4. El CLOSE DATABASE solo utilizarlo al salir de la aplicación, no en cada Load de formularios
5. El SET EXCLUSIVE ON en una aplicación multiusuario es inpensado.



 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________



TheNewInquirer

unread,
Mar 31, 2012, 3:23:18 PM3/31/12
to Comunidad de Visual Foxpro en Español
Es dificil para mi saber qué es lo correcto entre tantas opiniones.

Según el manual del programador de la versión 6, dice que no sería
recomendable regenerar indices durante la ejecución del sistema.
Recomienda hacerlo ya sea al arrancar o al finalizar el sistema.

Me dicen aquí que ni siquiera hay que regenerar los indices CDX sino
borrarlos y volverlos a crear con INDEX ON.

Una vez creados y no debo volverlos a crear en cada módulo sino solo
ponerlos en uso.

Para que pueda hacer lo del borrado de los CDX y volverlos a crear, no
necesitaría poner el EXCLUSIVE en ON momentaneamente?...

Esto creo que sería perfectamente aceptable si en la mañana, al
arrancar el primer usuario, el sistema detecte que es el primer
usuario y "se apodere" del modo exclusivo y borre y vuelva a crear los
indices y hasta haga un pack a todo.

Pero si "durante la ejecución del sistema" hago un set order to 0 y
tengo que volver a crear los indices... como le hago para crear los
indices pero sin "tener el modo exclusivo"?...

Para eso se usan las sesiones privadas de datos o cómo cómo se podría
hacer?..

Ya me volvi a enredar jeje

Saludos!

TheNewInquirer

unread,
Mar 31, 2012, 3:42:23 PM3/31/12
to Comunidad de Visual Foxpro en Español
Otra, el manual trae las funciones porque entiendo que al menos DTOS
convierte un campo fecha a caracter y al parecer las expresiones
anidadas de indices requieren que sean tipo caracter. De alltrim no sé
si es o no necesario.

El close databases lo uso al iniciar (Load) y al salir (Unload) de un
form ya que no he podido usar "forms multiples". Solo uso uno a la
vez. El close databases lo estoy usando para cerrar las tablas DBF que
por alguna razon pudieran estar abiertas tanto al arrancar como al
cerrar el form.

Creo que me evita tener que cerrar cada tabla una a una.

Saludos!

Luis Maria Guayan

unread,
Mar 31, 2012, 3:47:33 PM3/31/12
to publice...@googlegroups.com
Te enriedas al vicio. Olvidate de querer generar los índices, de borrar los CDX, de abrir los datos en forma exclusiva, etc... Esa tarea de mantenimiento se hará de forma excepcional y allí si utilizaras el acceso exclusivo de tus datos y podrás borrar y recrear nuevamente tus índices. 


 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________



Douglas Sánchez Guillén

unread,
Mar 31, 2012, 3:48:08 PM3/31/12
to publice...@googlegroups.com
Hola y asi tiene razon el manual cuando se hablo de indexacion se supone que nadie debe estar activo en el sistema son utilidades que se Ejecutan manualmente unicamente para cuando hay problemas de indices corrompido en mi caso pa eso las uso, claro en varios años no las he usado esa opcion, lo que si he hecho es reparar tablas por volcones de energia.

saludes
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Luis Maria Guayan

unread,
Mar 31, 2012, 3:54:14 PM3/31/12
to publice...@googlegroups.com
Yo dije: "No soy muy amigo de los índices compuestos" prefiero un índice simple por Fecha (no necesito convertirlo a caracter) que un índice con DTOS(Fecha)

Yo la apertura y cierre de las bases de datos las realizó al iniciar y al finalizar una aplicación. Deberías tener un programa principal (ej: main.prg) y allí la llamada a tu menú o formulario principal.

Y el cerrar una tabla, si no la utilizas la cierras y listo, pero solo la tabla que abriste en esa instancia y no otra que hayas abierto anteriormente.

 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________



TheNewInquirer

unread,
Mar 31, 2012, 4:18:31 PM3/31/12
to Comunidad de Visual Foxpro en Español
Si gracias! Veo que ya no son necesarias, algunas cosas que se hacían
con clipper.

Precisamente trataba de hallar la forma de reindexar de forma
automática. Lo de hacer las labores de mantenimiento ya lo mencioné
varias veces antes, lo tengo claro y sé que se puede hacer tanto con
una opcion de menu dentro de la aplicación como con utilerías
externas, porque las he visto con varios sistemas tanto hechos en fox
como en VB con Access (Creo que la opción de Compactar y Reparar hace
lo mismo que reindex y pack, pero también el Jet de Access parece
traer otra opción mas eficiente que la opcion compactar y reparar y
que puede ser llamado mediante código). Claro que en access el gran
problema es que los "campos autonumericos" se inicializan y si eso da
mucha lata por cierto.

Las tablas las pongo en uso con USE, hago lo que tengo que hacer y las
cierro inmediatamente con USE sin parametros.

Según leí por aquí es recomendable hacer eso de abrir y cerrar para
evitar "tablas quebradas" y mejor si se usan cursores mientras se
tiene la tabla cerrada, ya que los cursores están solo en la RAM y así
nadie saldría "quebrado" jeje.

Ademas de usar USE para cerrar las tablitas, he visto conveniente usar
CLOSE DATABASES por aquello de que "por alguna razon" haya una tabla
abierta tanto antes de arrancar los forms como al cerrar los mismos.
Lo hago "por si las moscas" para evitar inconvenientes.

Y sí tengo un programa principal que ya puse por aquí para que me
dieran sugerencias y otros ejemplos de programas principales, que por
cierto fueron muchos los ejemplos y de "tocho morocho" jeje

Y si entendí a que se referían con los índices compuestos que yo llamo
anidados, pero veo que no todos tienen el mismo estilo de
programación.

Entiendo que el maestro luis maría no uso los CDX y solo indexa usando
1 solo campo a la vez. Cuando tiene que usar mas de un campo en sus
selects lo soluciona con AND y otros trucos, para olvidarse del Seek()
como dice, para irse acostumbrando a los SGBD.

Creo que si les entiendo bastante.. Solo no entiendo cuando hablan de
cosas muy avanzadas pensando que las conozco, cuando aun estoy
haciendo un esfuerzo por recordar varias cosas.

Gracias!

Douglas Sánchez Guillén

unread,
Mar 31, 2012, 4:22:28 PM3/31/12
to publice...@googlegroups.com
Yupiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii, a cerrar este hiloooooooooooooooooooooooo.






Luis Maria Guayan

unread,
Mar 31, 2012, 4:34:09 PM3/31/12
to publice...@googlegroups.com
Entiendo que el maestro luis maría no uso los CDX y solo indexa usando
1 solo campo a la vez. Cuando tiene que usar mas de un campo en sus
selects lo soluciona con AND y otros trucos, para olvidarse del Seek()
como dice, para irse acostumbrando a los SGBD.


Yo nunca dije que no uso CDX, es mas te dije que utilices CDX y no IDX.

Lo que yo dije que no soy amigo de las claves compuestas, sino que creo un índice o etiqueta TAG por cada campo en un solo archivo de índice CDX

TheNewInquirer

unread,
Mar 31, 2012, 4:34:18 PM3/31/12
to Comunidad de Visual Foxpro en Español
Perdon, interprete mal este comentario del Maestro Luis Maria:

"No soy muy amigo de los índices compuestos".

Puse:

"Entiendo que el maestro luis maría no usa los CDX y solo indexa
usando 1 solo campo a la vez".

Pienso que SI usa los CDX (Creo que ya nadie usa los IDX), pero dijo
que no usa "indices compuestos", es decir, los que usan más de un solo
campo.

Fue por la C en CDX. Mi cerebro pensó que eso eran los compuestos pero
creo que se llaman Estructurales o algo así.

Saludos!



Luis Maria Guayan

unread,
Mar 31, 2012, 4:37:09 PM3/31/12
to publice...@googlegroups.com
Cuando indique "indice compuesto" quise expresar "clave compuesta" 

 
Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________



Daniel Sánchez

unread,
Apr 1, 2012, 12:00:04 PM4/1/12
to publice...@googlegroups.com
Eso de muestra Maestro LM que están atentos y analíticos de sus comentarios.

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Arnaldo Toledano

unread,
Apr 2, 2012, 11:02:20 AM4/2/12
to publice...@googlegroups.com
Vengo de Clipper al igual que vos.
Creo que tenes que empezar lo antes posible a migrar a un Motor de Base de Datos.
Caso contrario seguiras enredado con los conceptos de Clipper y no te permitirán "mirar" desde
otra perspectiva la programación y el manejo de los datos.


Arnaldo Toledano
--
Arnaldo Toledano Tesys Informática Córdoba Argentina
Message has been deleted

Mario Oviedo

unread,
Apr 11, 2012, 5:12:18 PM4/11/12
to publice...@googlegroups.com, arnaldo....@gmail.com
es que cuando generas otra vez los indices os estas borrando
Reply all
Reply to author
Forward
0 new messages