Clipper/FiveWin - CDX y NTX

 
Vista:

CDX y NTX

Publicado por daniel martinez (4 intervenciones) el 13/10/2006 02:29:40
hola!
tengo una aplicación hecha en clipper 5.3 con archivos CDX, me piden pasar la aplicacion a FW y yo siempre uso los NTX.

Puedo crear los NTX y listo, pero sè de la ventaja de usar CDX, entonces quiero aprovechar para empezar a usarlos.

Los archivos son Cientes.Dbf y Clientes.Cdx (y este tiene 2 indices, Codigo y Nombre)
probé con el clasico use Clientes index Clientes
para luego hacer set orde to 1 ó set orde to 2, pero no funcionó.

Mis preguntas son:

como se crea un CDX desde FW?
como abro un archivo desde FW si el indexado es CDX?
como indico en que indice quiero trabjar?

Gracias.
Daniel
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:CDX y NTX

Publicado por El Duro (22 intervenciones) el 13/10/2006 03:53:14
Daniel:

Es mucho más sencillo trabajar con índices CDX pues al momento de abrir la DBF aútomaticamente se abre el índice, recuerda nombrarlos identicamente como en el ejemplo que mencionas (CLIENTES.DBF y CLIENTES.CDX).

Obviamente esto se ve modificado por el código SET AUTOOPEN OFF, pero por omisión se abre el índice automaticamente.

Por lo tanto no es necesario indicar el INDEX en el USE

Una forma sencilla de crear índices CDX es definir al inicio de tu programa principal a siguiente línea:

RDDSETDEFAULT("DBFCDX")

Finalmente para indicar el índice activo se hace con
DBSETORDER("CIU_CIU")

Lo siguiente es un pequeño ejemplo

USE CIUDADES
DBSETORDER("CIU_CIU")

Espero haya sido claro.

El Duro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por lorenzo (180 intervenciones) el 13/10/2006 09:52:59
Amigo, leyendo tus respuestas me surge una duda al respecto:

Comentas que hay que nombrar el DBF y CDX identicamente como en el ejemplo que mencionas (CLIENTES.DBF y CLIENTES.CDX).... pero ¿Que ocurre cuando existen varios CDX asociados a un DBF? por ejemplo CLIENTES1.CDX, CLIENTES2.CDX... Obviamente no los puedes nombrar iguales...

¿ Que pasa entonces ?
Lorenzo

PD.: Hasta el momento siempre utilicé NTX pero no descarto pasarme a CDX's
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Gabriel Pascual (913 intervenciones) el 13/10/2006 17:55:10
Vayamos por partes:

Los CDX son indices altamente eficientes y super rapidos que ademas tienen un monton de beneficios adicionales. Funcionan exactamente igual en Clipper que en FiveWin, no hay ninguna diferencia, aun si te pasas a xHarbour, la forma de tratarlos es identica.

Primero, tienes que hacer cambios en el codigo fuente de tu programa para cambiar el motor de indices NTX y establecer el motor CDX por omision, esto se hace asi:

REQUEST DBFCDX
RDDSETDEFAULT("DBFCDX")

Con estas 2 lineas quitaras los indices NTX de tu programa y tendras los indices CDX, todas las operaciones de bases de datos se haran sobre los CDX.

Tambien, hay que hacer algunos cambios en el momenot del linkeado, deberas incluir la LIB de clipper que tiene el manejo de indices CDX, que es la DBFCDX.LIB, esto se hace en la seccion del archivo de enlazado que dice:

LIB clipper, extend, terminal, dbfcdx, dbfntx

La lib DBFNTX tambien tiene que ir porque comparte funciones comunes con la lib DBFCDX.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Gabriel Pascual (913 intervenciones) el 13/10/2006 18:08:30
Ahora, pasemos a ver como se generan.

Un CDX es un "contenedor" de ordenaciones, a diferencia de un NTX, donde solo puedes tener una ordenacion por archivo, en un CDX puedes tener hasta 50 ordenaciones por indice CDX, por eso son mas eficientes, en vez de tener un solo archivo NTX por cada indice distinto, un CDX te permite guardar varios indices, hasta 50, en un solo archivo CDX.

Se generan de la siguiente manera:

USE DBF
INDEX ON <llave> TAG <NombreDeLaOrdenacion>

Si te fijas, no hay clausula "TO", como en los NTX, porque el nombre del indice CDX SIEMPRE es el mismo nombre que el de la base de datos a la cual indexa, no necesitas mas de un CDX por archivo DBF, a menos que tengas mas de 50 indices para ese archivo.

¿ Como sabes entonces cual indice es cual?, para eso se utiliza la clausula TAG, el tag, o etiqueta es la identificacion de dicho indice, tu le das un nombre de tu eleccion, que posteriormente te servira para referirte a dicho indice.

USE CLIENTES
INDEX ON nombre TAG nomcli
INDEX ON clave TAG cvecli
INDEX ON dtos(fechaing) TAG fecha

Lo anterior genera un fichero llamado CLIENTES.CDX que contiene 3 ordenaciones, una llamada "nomcli" otra llamada"cvecli" y otra mas llamada "fecha", lo que en NTX requiere 3 ficheros, en CDX solo requiere uno. Recuerda, puedes tener hasta 50 ordenaciones por cada CDX y hasta 15 CDX por cada DBF.

El comando INDEX ON tambien acepta las clausulas FOR para indices condicionales, y EVAL para ejecutar una funcion mientras se indexa, igual los NTX.

continua....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Gabriel Pascual (913 intervenciones) el 13/10/2006 18:25:37
... continuacion....

Existe solo una regla importante con respecto a los indices CDX para poder aprovecharlos al maximo y esta es que TODAS LAS LLAVES DE LOS INDICES TIENEN QEE SER DE LONGITUD FIJA. ¿ que quiere decir esto ?.

Esto quiere decir que las llaves del indice deben de medir lo mismo todas, por que lo indexar sobre un campo numerico NO ES VALIDO a menos que los conviertas previametne en una estructura de longitd fija.

Me Explico mejor: digamos que tu tienes un campo numerico llamado por ejemplo NUMEMP (numero de empleado), Numeric de 3 posiciones con 0 decimales

Indexar sobre el campo NUMEMP no es valido porque no genera llaves de la misma longitud, porque si tu indexas sobre este campo numerico como esta, generas llaves de longitud 1, 2 y 3 caracteres, que no son validas, la llave tiene que medir SIEMPRE 3 caracteres de longitud y esto se hace aplicando un STR() al campo al momento de indexar, asi:

INDEX ON STR(numemp,3) TAG numempl

La misma regla se aplica para los campos CHARACTER y para los campos fecha, para estos ultimos la forma correcta de indexar es usando la funcion DTOS() (date to string), que conviernte una fecha en el formato AAAAMMDD que es como se almacenan en un DBF las fechas (si piensan que el campo fecha es de 8 caracteres de longitud por los separadores, estan equivocados, el campo fecha es de 8 caracteres porque se incluye siglo de la fecha, las fechas siempre se manipula en el formato AAAAMMDD, el comando SET DATE solo se encarga de presentartela con un formato que tu elijas).

INDEX ON DTOS(fechaing) TAG fecha

Finalmente y para concluir con la generacion de archivos CDX yna cosa importante con respecto a la "regenearcion" de indices CDX, un CDX, a difrencia de un NTX no se destruye cada vez que se genera, sino que en vez de eso, va agregando nuevas TAGs (aunque tengan el mismo nombre) de tal forma que llegara un momento que saturaras las 50 tags de que dispones, lo que se debe de hacer cuando de reindexa un CDX es BORRAR FISICAMENTE EL ARCHIVO CDX ANTES DE INDEXAR

IF FILE("cliente.cdx")
Ferase("cliente.cdx")
ENDIF
USE cliente
INDEX ON STR(numcli,3) TAG numercli
INDEX ON nomcli TAG nombre
INDEX ON DTOS(fechaalta) TAG fecha

El borrado se tiene que realizar antes de abrir el fichero de datos, por lo que explicaremos a continuacion

... continua....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Gabriel Pascual (913 intervenciones) el 13/10/2006 18:35:54
.... continuacion.....

Como se usan dentro de nuestro programa los dbfs con indices cdx.

Muy facil y muy sencillo, un simple:

USE fichero.dbf

Abre automaticamente fichero.dbf y fichero.cdx, te tal forma que no requieres preocuparte por el SET INDEX y como en el caso de los NTX olvidarte de abrir algun fichero indice y luego se queda este incompleto. Al momento de abrir el fichero DBF, el CDX se abre autoamticamente y todos sus tags estan disponbiles.

Una cosa importante a tomar en cuenta es que el indice CDX se abre en el "orden natural", el orden natural, es como si no tuviera indice asignado, es decir, la base de datos no se encuentra ordenada por ningun criterio al momento de abrir el CDX.

Para cambiar de indice lo haces con el tradcional SET ORDER TO ... auqneu lo ideal manejando indices CDX es utiliar la funcion OrdSetFocus(<NombredelTag>) esto le da mayor claridad al codigo, de acuerdo al ejemplo anterior:

USE clientes
clientes->(ORDSETFOCUS("cveclie"))

Con esto cambias del orden natural, al orden "cveclie", tambien es valido utilizar el numero del orden, auqneu no es recomendable. si quieres seleccionar otro indice, haces otra vez:
clientes->(ORDSETFOCUS("fecha"))

Y ahora tu DBF quedara ordenado por fecha.

Siempre es recomendable trabajar con el alias de la base de datos, auqneu esto no es necesario.

El borrado, la edicion y el agregado de datos se hacen de manera normal como con NTX, el motor de CDX se encarga de actualizar los indices y los tag.

en el proxio apartado hablare de algunas funciones importantes para el uso de los CDX.

... continua....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por daniel martinez (4 intervenciones) el 13/10/2006 18:44:18
MUCHISIMAS GRACIAS!!!!!!!!
Estuve leyendo tus respuestas, está muy muy clarita la explicación, en breve voy a probarlo, pero no queria demorarme en una respuesta de agradeciemiento.
Un abrazo.
Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Gabriel Pascual (913 intervenciones) el 13/10/2006 18:52:09
.... continuacion....

3 son las funciones que considero yo mas importantes para trabajar con CDX y esta son:

OrdKeyCount() : Me dice cuantos registros hay en un indice, aun si la base de datos esta filtrada, esto es maravilloso, es como un RECCOUNT() o LASTREC() con la diferencia que cuenta unicamente los registors que esten en el indice activo. Es muy util cuando la tabla dbf esta filtrada

OrdKeyNo(): me dice la posicion del registro CON RESPECTO AL INDICE, es como un RECNO() pero a diferencia de este, que me dice la posicion del registro con respecto a todos los registros de la base de datos, OrdKeyNo() me dice la posicon del registro con respecto al indice activo, asi pues si un registro me dice que el RECNO() es 1200 por ejemplo, quiza indexado ese registro queda en la primera posicion por lo que OrdKeyNo() me regresaria 1.

Y la estrella de nuestro espectaculo: OrdScope()

OrdScope() es sin duda la funcion mas util del mundo CDX, se utiliza para hacer filtros ULTRA RAPIDOS utilizando las llaves del indice activo, te evita tener que usar SET FILTER, copiar a archivos temporales, hacer busquedas sobre una base de datos vamos, usalo una vez y lo amaras siempre.

Vamos a suponer que nuestra base de datos clientes tiene 10 mil registros, y que a nosotros solo nos interesa ver aquellos clientes que se dieron de alta entre el 1reo. de Enero del 2006 y el 15 de Enero del 2006, , hacemos lo que sigue

SET DATE BRITISH

USE clientes
clientes-(ORDSETFOCUS("fecha"))
dFechIni := CTOD("01/01/2006")
dFechFin := CTOD("15/01/2006")

/* ahora la magia */

clientes->(ORDSCOPE(0,DTOS(dFechIni))
clientes->(ORDSCOPE(1,DTOS(dFechFin))
clientes->(DBGOTOP())

Y listo, con esas 3 sencilas lineas hemos filtardo nuestros 10 mil registros para que nos entregue unicamente aquellos que cumplan las fechas deseadas.

Este tipo de filtros es millones de veces mas rapido que el filtro de tradicional de clipper, ahora si nosotros preguntamos cuanto vale OrdKeyCount() nos dira el numero de registros exactos que se encuentran dentro de esta tabla filtrada.

OrdScope se tiene que ejecutar 2 veces, la primera para establecer el rango inferior que queremos buscar, para ello se identificara con el primer parametro como un "0", la segunda llamada para OrdScope, establece el valor del rango superior y lleva un"1", si se omite la segunda llamada, hara un filtro desde el primer valor que coincida con el rango inferior, hasta el final del archivo.

Para borrar un Scope y volver la tabla a estado original se hace:

OrdScope(0,NIL)
OrdScope(1,NIL)
DBGOTOP()

Un scopes SIEMPRE debe ir sobre un campo indexado, despues de apliar un scope a un ragno de datos, es posible aplicar un FILTRO con SET FILTER y funcionara mucho mas rapido que con el set filer tradicinal de Clipper.

FIN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX !!!!!!!

Publicado por daniel (1 intervención) el 13/10/2006 19:31:03
de nuevo GRACIAS, funcionó todo perfecto...
un abrazo.
de nuevo gracias y mil gracias.
Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX !!!!!!!

Publicado por El Duro (22 intervenciones) el 13/10/2006 19:47:49
Daniel:

Estas en mi lista de los que tienen la virtud de mostrarse agradecido.

El Duro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX !!!!!!!

Publicado por nolo (30 intervenciones) el 16/07/2008 06:44:52
aunque dos años despues de este dialogo , era lo que estaba buscando

tambien...Muchas ,muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Hugo Rodriguez (5 intervenciones) el 30/06/2009 19:27:33
Orale... buscando otra cosa me encontré esto que me parece muy pero muy interesante... Muchas gracias por todo Gabriel...

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Lucho Montero (26 intervenciones) el 29/03/2012 02:37:35
Hola Gente:
Después de muchos años ingresé por estos lares ... pasa que estaba buscando el famoso ORDSCOPE y bueno encontré lo que quería ... solo una aclaración : ORDSCOPE también funciona con índices NTX, yo los uso y todo funciona de maravilla.
Ahora estoy haciendo mis primeros pininos de pasar todos mis sistemas a entorno Visual con ooHg + xHarbour.
Las versiones que tengo actualmente son para Windows y Linux Modo Consola 32 bits y lo bueno de todo que permite mantener una sola versión del código fuente y el tema es solo al momento de compilar para Windows ó Linux.

Saludos.
Atte.
Lucho Montero.
Lima - Perú.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Hugo Gabriel (1 intervención) el 09/04/2012 23:48:08
Muy interesante todo lo publicado aqui, interesante tambien ese viaje de Clipper a entorno visual con ooHg + xharbour, de Lucho Montero, seria bueno que abrieras un asunto nuevo y publiques tus experiencias.

Saludos
Hugo Gabriel
Uruguay
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CDX y NTX

Publicado por Noel Vasquez (1 intervención) el 23/02/2018 20:38:13
Muchas gracias Gabriel excelente toda tu explicación
Apenas ando pasando todo lo hecho en Clipper a Harbour
Saludos desde Sonora, Mexico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar