PDA

Ver la Versión Completa : TTable: desplazar el contenido de los campos


Susanna
14-09-2007, 15:43:06
Hola,

tengo un objeto TTable enlazado con una tabla de DBase.
La tabla tiene 60 campos, igual que el TTable.
Quiero mover el contenido de los campos del TTable:
el primer campo coja los valores del segundo campo,
el segundo los valores del tercero,
y así hasta el último campo, que tiene que contener nuevos valores.

A más a más, la operación tiene que ser muy rápida porqué hay un grid vinculado al TTable.

Gracias por adelantado.

Neftali [Germán.Estévez]
14-09-2007, 16:49:15
Pues sólo se me ocurre haciéndolo "a mano".
Puedes acceder por índice a los campos de una tabla, algo así como:


Table.Fields[0].AsString....


Así que se puede solucionar con un for que haga un recorrido para todos los campos menos el último y que asigne el del índice [i] al [i+1].

Espero haberme explicado mínimamente... :D

duilioisola
14-09-2007, 17:16:36
Para acelerar el tema :


Table.DisableControls;
for i := 0 to Table.FieldsCount -1 do
Table.Fields[i].AsString := Table.Fields[i+1].AsString;
Table.EnableControls;


DisableControls deshabilita la parte visual (que se refresquen con los datos nuevos que van tomando)
EnableControls habilita nuevamente la parte visual.
Creo que ni siquiera es necesario hacer un refresh.

Neftali [Germán.Estévez]
14-09-2007, 17:23:51
Para acelerar el tema...

Pues más o menos era eso, pero estaba un poco "flojo" para escribir código. :o

Susanna
14-09-2007, 18:01:19
Gracias por vuestra idea.

El problema está en hacerlo con todos los registros de la tabla, uno a uno.
¿No se puede hacer con todos a la vez?

¿Quizás cambiando la estructura de la tabla en tiempo de ejecucción,
quitando la primera columna y añadiendo una nueva al final?

Lo siento si antes no he explicado bien mi duda :)

Neftali [Germán.Estévez]
14-09-2007, 18:20:56
Puedes probarlo.
Habría que eliminar una columna, añadir otra y modificar el resto de nombre.
Es un poco extraño y peligroso me parece a mi, pero no tiene porqué funcionar.

Como mínimo se me ocurre que deberás cerrar la tabla y además nadie más podrá estar utilizándola (ya que no podrías cambiar la estructura); Suponiendo que todo haya ido bien, luego volver a abrirla.
Si tienes controles visuales y mantienes la nomenclatura de campos no deberás tener problemas.
No se si todas las BD van a permitirte hacer esto.

De todas formas todo eso no me parece en absoluto rápido.

Tal vez si nos explicas con detalle qué deseas hacer, exista otra forma si necesidad de hacer esto.

Susanna
15-09-2007, 12:22:30
Éste es el caso que quiero resolver:

Tenemo tres tablas distintas (A, B y C), y una cuarta tabla (D) que contiene
información obtenida a partir de realizar consultas y cálculos con A, B y C.

Las tablas A, B y C contienen información para todo el año, pero la tabla D
sólo contiene información para 90 días (así agilizamos la generación de la
tabla y ahorramos memoria).

La tabla D tiene vinculado un grid, que nos muestra la informació de 30 días,
y guardamos 30 campos sin mostrar a la izquierda y 30 campos más a la derecha.

Supongamos que el usuario mueve el grid 10 columnas a la derecha.
Ahora vemos 10 campos que estaban ocultos y ocultamos 10 campos que antes se veían.

El problema es: ¿cómo hay que tratar la tabla D para que, después de movernos
10 columnas a la derecha, respete tener 30 días visibles, más 30 días anteriores calculados,
más 30 días posteriores calculados?

Gracias por adelantado.

Neftali [Germán.Estévez]
17-09-2007, 10:27:07
OK, ahora ha quedado un poco más claro.

En este caso, Seguramente yo no hubiera utilizado un DBGrid; Seguramente no es el más acertado para mostrar estos datos segun la estructura que tienen. Tiene demasiada dependencia con la tabla.
Por lo pronto creo que te será más fácil utilizar un StringGrid con el que tienes más facilidad para tratamiento de columnas.

Por otro lado, antes de seguir, yo revisaría posibles componentes que te puedan servir para esto; Alguno que ya esté pensamos para mostrar alendarios (meses en concreto) o similares.
No cuesta nada pararse un momento y revisar.

Delphius
17-09-2007, 11:43:41
Hola Susanna,
Me llama la atención de que mencionas TTables... viendo esta dependencia... y de lo estoy entendiendo... ¿No sería mejor emplear querys? No conviene emplear los TTables sabiendo que traen toda la información a memoria. Con TQuerys se agiliza y ofrece más libertad.

Y con respecto a lo que dice Neftali de usar un componente del tipo calendario... creo que sería lo mejor.

Saludos,

Susanna
19-09-2007, 19:00:00
Gracias por vuestras sugerencias.

He replanteado el problema de raíz, y he encotrado una solución que funciona.
Con el TTable que tenia antes y el grid vinculado, añado una variable de tipo entero.
Esta variable guarda el índice del campo que contiene el primer día calculado.
Si quiero calcular diez días posteriores, incremento en diez dicha variable.

En el grid, en vez de mostrar los campos m..n, muestro los campos m+10 .. n+10.
Y cuando llego al último campo, en el grid añado el primero y los siguientes.

El grid muestra una parte de la tabla, y la variable entera guarda donde "empieza" la tabla.

No sé si ha sido muy clara la explicación :rolleyes: