Bueno, aquí va otro ejemplo quizás más claro. Partimos de la siguiente tabla, cuyos registros están ordenados por el número de registro, que se genera al procesarse la tabla y generarse. Realmente, como se puede ver está ordenado por Cat1+Cat2.
Código:
NºReg | Cat1 | Cat2 | Res1 | Res2 | Res3
--------------------------------------------------------
1 1 null 100 200 150
2 1 1 25 35 50
3 1 2 45 18 25
4 1 3 35 27 10
5 2 null 27 350 200
6 2 1 5 100 87
7 2 5 10 34 50
8 3 null 45 17 24
9 3 2 67 12 34
10 3 9 34 23 21
Las filas que tienen un null en Cat2 corresponden con los totales de Cat1 para ese grupo (todos los que tienen el mismo valor en Cat1). La forma de calcular los datos totales no es importante para lo que quiero explicar.
Ahora el usuario solicita que se le muestren los datos ordenando las Cat1 por el campo Res1 y luego los registros de cada Categoría 1 que se ordenen por el campo Res2.
La tabla resultante debería ser la siguiente:
Código:
NºReg | Cat1 | Cat2 | Res1 | Res2 | Res3
--------------------------------------------------------
1 2 null 27 350 200
2 2 5 10 34 50
3 2 1 5 100 87
4 3 null 45 17 24
5 3 2 67 12 34
6 3 9 34 23 21
7 1 null 100 200 150
8 1 2 45 18 25
9 1 3 35 27 10
10 1 1 25 35 50
Como puedes ver no se puede usar índices ya que algunos registros deben ordenarse por una columna junto con su subgrupo de registros, y luego a su vez este subgrupo va ordenado por otra columna.
El algoritmo más sencillo que se me ocurre aplicar es recorrer la tabla principal e ir insertando los registros en un clientdataset auxiliar pero de forma ordenada. Así el algoritmo me sale de orden N para el recorrido principal y luego el recorrido de insercción de orden N también ya que hay que leer los registros insertados y localizar donde hay que poner el nuevo que estemos procesando. Esta segunda tabla cada vez contiene más registros a medida que se van insertando. Si siempre insertáramos al principio, sólo habría que realizar una lectura por lo que sería el algoritmo global de Ord(n*1). Si estamos en el peor caso en el que hay que insertar al final, entonces siempre hay que leerse todos por lo que será de Ord(n*n). Por supuesto, al insertar hay que tener en cuenta que el registro esté dentro del grupo correcto pero esto es ya una cuestión de la comparación a realizar en cada registro.
Tal como lo tenía programado, al insertar en el clientdataset abría "hueco" y los registros siguientes se desplazaban hacia abajo. De esa forma no necesitaba actualizar los números de registro de los campos siguientes para abrir el hueco (y eso si que tarda aunque sea un recorrido y actualización). Pero por el problema que os planteo que me ocurre no veo otra solución mejor.
Un saludo