Delphi - Ordenar DBF

 
Vista:

Ordenar DBF

Publicado por Ricardo (42 intervenciones) el 23/09/2005 21:00:09
Saludos

Mi pregunta es la siguiente :

tengo un archivo dbf y necesito ordenarlo de acuerdo a 4 campos
primero por TipoElem ( de Tipo integer)
y luego si se ocupan o no en recetas Uso_Rcta ( de tipo String cuyos valores son T o F).
luego de acuerdo con CveGrupo (de tipo integer)
Y luego segun su CveElem (de Tipo integer)....

es decir hacer un
ORDER BY TIPO, USO_RCTA Desc, CVE_GPO, CVE_ELEM....

No puedo usar el BDE asi que utilizo el control TDBF.

pero no me funcionan ordenarlo con los indices...
o no se como hacerlo....

Lo he intentado de la siguiente manera :
Usando
procedure AddIndex( const AIndexName , Fields : String ; Options:
TIndexOptions; const DescFields: String ='');

Dbf1.addIndex('Indice.ndx','TIPO',[ ] , '');
Dbf1.IndexName := 'Indice.ndx';

Y funciona para un solo campo pero no para varios..

y en ocasiones me marca el error
Operand/function missing o un Access violation.

Cualquier ayuda
Gracias de antemano..
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:Ordenar DBF

Publicado por Cuervo (262 intervenciones) el 25/09/2005 04:03:27
// suponiendo que "tipo" sera el indice primario

dbf1.open;
dbf1.addindex('indice', 'tipo', [ixPrimary, ixUnique]);
// indexacion secundaria...
dbf1.addindex('recetas','USO_RCTA', [ixCaseInsensitive]);
// externos...
dbf1.addindex('elementos.ndx','CVR_ELEM', [ixCaseInsensitive]);
Dbf1.IndexName := 'elementos.ndx'; // referencia
dbf1.close;
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:Ordenar DBF

Publicado por Ricardo (42 intervenciones) el 26/09/2005 19:15:54
mira, mi problema de ordenar el DBF es el siguiente.

Veras tengo que ordenarlo por varios campos.
en el siguiente orden
Primero por TIPO (entero que tiene solo 2 valores 1 o
3)
Luego por USO_RCTA (Caracter y puede ser T o F,
Verdadero
o Falso, primero van los Verdaderos).
Luego por Cve_Gpo que es Entero .
y luego por ClaveElemento (CveElem, entero ).

si fuera uns sentencia SQL seria asi

SELECT * FROM ALMACEN
ORDER BY TIPO_ELEM, USO_EN_RECETA DESC, CVE_GRUPO,
CVE_ELEM;

Como logro que el ordenamiento cumpla ese orden ?

Es decir si mis registros fueran :

CVE_ELEM, DESCRIPCION, USO_RCTA, TIPO, CVE_GPO
1 , Papas , T , 1 , 1
3 , Limpiador Pisos, F, 3, 1
2 Salsa Catsup, T, 1, 2
7 , Sanitizador para manos, F, 3, 2
8, Servilletas, F, 3, 2
10 Mostaza, 1, 1, 2
4 , Aderezo Cesar, F, 1, 2

El orden deberia ser

Primero todos los del tipo 1 con Uso_RCTA=T
Luego los mismos del tipo 1 con USO_RCTA = F.
y luego todos los del Tipo 3, que por lo regular su
campo USO_RCTA es F.
todos estos ordenados de acuerdo a su clave de grupo y
su clave de elemento.


La idea de esto es tener el archivo ordenado para despues mandarlo
a un archivo de texto.

La repuesta en el foro no me quedo muy clara, pues
creo que no comente sobre el tipo de los datos, el
orden y los valores que llevan.

De antemano muchas gracias por tu/su ayuda....
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

Ordenar DBF - Solucion

Publicado por Ricardo (42 intervenciones) el 03/10/2005 17:46:28
Por fin encontre la solucion a mi problema... y aqui les dejo mi contribucion...

El archivo DBF lo creo en tiempo de ejecucion.....
Lo abro ...

dbf1.open;

Para crear el indice

1.- primero si existe lo borro.....
If(FileExists('Tempo.mdx') then
DeleteFile(Tempo.mdx);

y lo vuelvo a crear...
Dbf1.addIndex('Tempo','STR(TIPO)+USO_RCTA+CVE_GPO+CVE_ELEM', [ixExpression]);

Esto me ordena la tabla primero por TIPO (conviertiendo el campo integer en String con la funcion STR)
depues por USO_RCTA, y despues por CVE_GPO, y CVE_ELEM.

2.- para usar el indice :

Dbf1.indexName := 'Tempo';

Esto creara un archivo Tempo.mdx en la ruta de nuestro archivo DBF.

los indices se basan en campos de tipo String, por lo que mi campo
CveElem lo tuve que hacer string para que lo ordenara de acuerdo al codigo ASCII.

es decir si queria el orden

1,2,3, 4, 11, 15, 21

tenia que convertirlos a

0001, 0002, 0003, 0004, 0015, 0021

de lo contrario lo hubiera ordenado

1, 11, 15, 2, 21, ...etc.

Para mi caso , mi DBF me servia como una tabla temporal, la cual despues de abrirla y ordenarla la iba a pasar a un archivo de texto separado por comas,
el cual era mi resultado final.

Para dejar de usar el indice ....
Dbf1.indexName := '';

Espero mi solucion les ayude en algo....a los que tengan el mismo problema.

Cabe mencionar que siempre es conveniente revisar que si estan creando el archivo DBF en tiempo de ejecucion como yo, recreen el archivo indice es decir, si existe borrenlo. y vuelvanlo a crear...... con la funcion AddIndex como lo hice en este ejemplo.

Saludos....
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

P.D Solucion.

Publicado por Ricardo (42 intervenciones) el 03/10/2005 18:10:09
Tambien una alternativa en lugar de borrar el archivo indice.

pueden portar por hacer lo siguiente :

despues de Dbf1.addIndex(......)
hacer Dbf1.RegenerateIndexes....

Saludos...
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