Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #3  
Antiguo 21-10-2011
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 16
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mover registros en ClientDataSet mglucero Conexión con bases de datos 2 14-03-2014 03:47:44
eliminar registros del ClientDataSet _CALI Varios 7 21-05-2011 09:21:27
Ordenar registros con ClientDataSet Jose Roman Conexión con bases de datos 2 15-01-2010 22:11:27
por que duplicidad de registros con clientdataset sin ingresar registros ...mysql Arturo MySQL 3 05-09-2006 18:39:37


La franja horaria es GMT +2. Ahora son las 14:51:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi