Ver Mensaje Individual
  #3  
Antiguo 21-10-2011
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Reputación: 13
briast Va por buen camino
Ok. Revisaré eso que indicas. La verdad es que no lo había pensado. Gracias.

Respecto a porqué no puedo utilizar un índice por esa columna es porque los datos que deben insertarse ordenadamente en el clientdataset no pueden ordenarse por una columna o varias columnas ya que dependiendo del "nivel" pueden tener una ordenación u otra. Así pues, aprovecho ya que lo preguntas y pongo aquí la cuestión y a ver si hay una solución más eficiente que la que yo hago.

Tengo en una tabla de Firebird un conjunto de registros ordenados a partir de un proceso de cálculo. A modo de ejemplo inserto aquí una tabla con datos ficticios que generaría dicho proceso:

Código:
Nº registro  |   Compañía  |  Categoría  |   Modelo   |   Datos año actual  | Datos año anterior | Variación
-----------------------------------------------------------------------------------------------------
     1                   1                null            null                 300                         100                 200
     2                   1                1               null                 100                          25                   75
     3                   1                1                 1                  20                             2                   18
     4                   1                1                 2                  39                             6                   33
     5                   1                1                 3                  41                             3                    34
     6                   1                2                 2                  45                              ...             ....
               ....
     n                 5                null              null                  30                          15                    15
   n+1                5                1                null                  10                            3                     7
                   ....
La primera fila de la tabla contiene los totales de para la compañía 1. La segunda, los totales para la compañía 1 categoría 1, y así sucesivamente.
La cuestión ahora es que el usuario puede decidir que quiere los datos ordenados de la siguiente forma:
- Por compañía según los datos del año actual
- Dentro de cada compañía por categoría según los datos de variación
- Dentro de cada categoría por los datos del año anterior.

Evidentemente esto es un ejemplo que ilustra el problema. Ahora tengo que recorrer esta tabla y construir una nueva tabla con los datos perfectamente ordenados según este nuevo criterio. El algoritmo que he preparado lee los datos de esta tabla y los va insertando en un clientdataset, pero teniendo en cuenta que cada grupo debe ir junto con sus datos. Por este motivo no puedo establecer un índice por una columna ya que esto ordenaría los datos con independencia de los valores de los campos 2, 3 y 4 y eso no valdría.
Ahora mismo lo que hago es ir leyendo e insertando de forma ordenada en el clientdataset y aprovechando esa propiedad que creía que tenía que permitía insertar en medio. El motivo es que el primer algoritmo que diseñé era similar pero usaba una columna del clientdataset para llevar el orden, y cuando quería insertar uno tenía que renumerar todos los siguientes para abrir el hueco, lo cual hacía que el proceso tardase mucho.
El algoritmo que me sale es de orden N*N en el peor caso (leemos todos los datos y siempre insertamos al final), de orden N *1 en el mejor caso (siempre se inserta al principio por lo que sólo leemos un registro) y de orden N * (N/2) en el caso promedio, siempre usando el sistema de sólo insertar en el clientdataset y que el solo abra el hueco sin necesidad de llevar un orden a través de una columna.
Otra implementación podría ser llevando el orden en un TIntList o similar, pero entonces no habría que hacer actualizaciones pero si muchos setkey y gotokey para ir comparando el registro por el que vamos con el nuevo a insertar.

Gracias por vuestra ayuda.
Un saludo
Responder Con Cita