Club Delphi  
    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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2011
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 14
briast Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 22-10-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por briast Ver Mensaje
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
Esto es más difícil que aquello de encontrar al gato en la imagen.

Disculpa es que no entendí la parte que te pongo en negritas con relación a la tabla resultante.

De todas formas, si tuviéramos que recurrir a la inserción que venías realizando, creo que bastaría con que tu campo en el IndexFieldNames fuera de tipo flotante (un InternalCalc TFloatField, por ejemplo).

Así, cada vez que localizaras los dos registros entre los cuales debe insertarse, le asignarías al nuevo registro un valor que se encuentre entre esos dos, y sin tener que modificar nada de los registros ya agregados.

OrdenNuevoRegistro = (OrdenRegistroAnterior + OrdenRegistroSiguiente) / 2
Responder Con Cita
  #3  
Antiguo 23-10-2011
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 14
briast Va por buen camino
Hola. Gracias por la ayuda.
Esa solución de insertar con un código también la pensé, pero el problema es que en el peor de los casos tendríamos que insertar siempre entre dos sucesivamente por lo que los códigos deberían tener hueco para 2 elevado al número de registros. Si tenemos que ordenar 10000 registros fíjate los números que ya me irían saliendo, y además eso entre dos, porque luego habría que ir poniendo saltos de la misma distancia. Da igual que lo hagamos con enteros que con decimales, la distancia debe ser similar.
Creo que no podría hacerlo así.
Responder Con Cita
  #4  
Antiguo 23-10-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por briast Ver Mensaje
[...] ordenando las Cat1 por el campo Res1 y luego los registros de cada Categoría 1 que se ordenen por el campo Res2 [...]
¿?

Tal vez haya que explicar un poco mejor la forma en que son ordenados esos registros. Como te comenté en el mensaje anterior, no comprendí esa parte.

Y es que una vez entendido el algoritmo, o al menos esclarecidos grosso modo los criterios usados para el ordenamiento, más ideas de solución pueden surgir.
Responder Con Cita
  #5  
Antiguo 30-05-2017
jo3litro jo3litro is offline
Miembro
 
Registrado: dic 2013
Posts: 33
Poder: 0
jo3litro Va por buen camino
Buenas, a todos.

Me sirvio este hilo para saber como insertar mis datos, ahora bien, y si tengo un generador, como le digo para que me inserte el valor del generador ??

Gracias.
Responder Con Cita
Respuesta



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 18:50:02.


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