Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Sincronizar 2 DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=54225)

MaMu 12-03-2008 06:29:13

Sincronizar 2 DBGrid
 
Como hago para Sincronizar 2 DBGrid, es decir, que se ubiquen en la misma posición del registro. Cada uno tiene su DataSource, y su consulta, pero la estructura del contenido de ambos es identica.

Saludos

Neftali [Germán.Estévez] 12-03-2008 10:29:06

Si ambas tablas están relacionadas de alguna forma (si las quieres sincronizar, alguna relación deben tener), ¿No sería más fácil visualizarlo todo en un único Grid? (Utilizando una JOIN para tener una única fuente de datos)

gluglu 12-03-2008 10:54:38

No se si mamu se refiere a eso ....

Supongo que le interesará sincronizarla en algún momento determinado.

Pienso que lo más inmediato sería que cuando quieras o necesites sincronizarlas, le envies al segundo grid la clave en la cual se encuentre el primer grid, y en algún procedimiento del segundo grid realizes un Locate.

Ya dependerá del evento que quieras uitlizar para automatizar esta función.

Neftali [Germán.Estévez] 12-03-2008 12:02:14

Cita:

Empezado por gluglu (Mensaje 272611)
Pienso que lo más inmediato sería que cuando quieras o necesites sincronizarlas, le envies al segundo grid la clave en la cual se encuentre el primer grid, y en algún procedimiento del segundo grid realizes un Locate.

El problema de hacer eso, es que como las tablas sean un poco grandes o la conexión no sea en local (sea a travñes de una red), el tráfico que estás generando es muy grande y la velocidad de respuesta no va a ser muy buena.

Si pruebas a realizar un Locate (o a lanzar una SQL) sobre una tabla cada vez que mueve el apuntador en la otra, verás que en la práctica es casi inviable.

MaMu 13-03-2008 02:44:32

En realidad lo que quiero hacer, es controlar dos DBGrid, es decir, que el segundo DBGrid se comporte como el primero. Cuando hago clic en un registro del primer DBGrid, que el segundo DBGrid se posicione en el mismo lugar. Ambos estan con RowSelect y asi con todo lo que haga en el primero, se refleje en el segundo.

Saludos

Caral 13-03-2008 03:11:10

Hola
No entiendo:
Cita:

Empezado por mamu (Mensaje 272590)
Como hago para Sincronizar 2 DBGrid, es decir, que se ubiquen en la misma posición del registro. Cada uno tiene su DataSource, y su consulta, pero la estructura del contenido de ambos es identica.

Saludos

Si es asi, por que no uno solo para los dos dbgrid?.
No lo entiendo la estructura de que?.
Saludos

MaMu 13-03-2008 04:46:08

Cita:

Empezado por Caral (Mensaje 272887)
Hola
No entiendo:

Si es asi, por que no uno solo para los dos dbgrid?.
No lo entiendo la estructura de que?.
Saludos

Porque ambos apuntan a la misma tabla, pero la consulta difiere en el campo fecha, en donde uno es mayor al otro. Y lo que quiero es visualizar ambos paralelamente y cotejar datos entre ambos, a modo comparativo.

Saludos

keyboy 13-03-2008 05:50:29

¿Y no has considerado la sugerencia que te hizo Neftali en el segundo mensaje? Podrías tener un sólo DBGrid con una columna para cada fecha, haciendo muy fácil la comparación visual y sin ener que recurrir a trucos raros.

Bye

MaMu 13-03-2008 07:47:59

Cita:

Empezado por keyboy (Mensaje 272909)
¿Y no has considerado la sugerencia que te hizo Neftali en el segundo mensaje?
Podrías tener un sólo DBGrid con una columna para cada fecha, haciendo muy fácil la comparación visual
y sin ener que recurrir a trucos raros.

Bye

Osea, que tendria que hacer un SELF-JOIN, porque deberia unir la tabla consigo misma.

tengo 2 tablas: CATEGORIAS y CAJA y consulto ambas en un año y otra en otro año (year(fecha)=xxxx), para compararlas

osea, ejecuto esto:


Código SQL [-]
select categoria, (select sum(debe) from caja t 
where t.categoria=a.categoria and year(t.fecha)=2008) as egreso,
(select sum(haber) from caja t where t.categoria=a.categoria and year(t.fecha)=2008)
 as ingreso from parapersonales a

y con la otra, lo mismo pero distinta fecha.
Lo que no me doy cuenta, donde meter el JOIN (sobre la misma tabla)


Código SQL [-]
select categoria, 
(select sum(debe) from caja t where t.categoria=a.categoria and year(t.fecha)=2008) as egreso,
(select sum(haber) from caja t where t.categoria=a.categoria and year(t.fecha)=2008) as ingreso 
from parapersonales a INNER JOIN (select categoria, 
(select sum(debe) from caja u where u.categoria=b.categoria and year(u.fecha)=2007) as egreso,
(select sum(haber) from caja u where u.categoria=b.categoria and year(u.fecha)=2007) as ingreso 
from parapersonales b)


:eek::eek::eek:
......

:(:(:(

gluglu 13-03-2008 09:57:49

Pienso que tu primera consulta que expones sería correcto para el fin que propones :

Código SQL [-]
Select a.categoria,
  (Select sum(debe) from caja t1
   where t1.categoria = a.categoria and year(t1.fecha) = 2008) as egreso,
  (Select sum(haber) from caja t2
   where t2.categoria = a.categoria and year(t2.fecha) = 2008) as ingreso
from parapersonales a

Entonces .... por qué no planteas tu segunda consulta de la misma manera ? :rolleyes:, es decir, no creo que hiciera falta ningún Join

Código SQL [-]
Select a.categoria,
  (Select sum(debe) from caja t1
   where t1.categoria = a.categoria and year(t1.fecha) = 2008) as egreso2008,
  (Select sum(haber) from caja t2
   where t2.categoria = a.categoria and year(t2.fecha) = 2008) as ingreso2008,
  (Select sum(debe) from caja u1
   where u1.categoria = a.categoria and year(u1.fecha) = 2007) as egreso2007,
  (Select sum(haber) from caja u2
   where u2.categoria = a.categoria and year(u2.fecha) = 2007) as ingreso2007
from parapersonales a

Bastará que ahora tengas un único DataSource para tus dos DBGrid's, y que en uno de los DBGrid uses las columnas de los campos de un año, y en el otro DBGrid las columnas de los campos del otro año. Cuando te muevas en uno de los Grid, automáticamente el otro también se moverá a la posición correspondiente del otro año por estar apuntando al mismo DataSource

;)

Caro 13-03-2008 14:22:45

Hola Mamu, para la parte de sincronización talvez te sirva utilizar la propiedad RecNo de cada uno de tus dataSet.

Lo que haría primero es ponerle a las propiedades dgRowSelect->True y dgAlwaysShowSelection->True.

Digamos que el Query1(DataSource) esta enlazado a tu DBGrid1, entonces obtienes la fila Activa con RecNo y le dices que esa fila también sea activa para tu Query2 que estara enlazado a tu otro BDGrid.

Código Delphi [-]
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
 Fila : Integer;
begin
 Fila := Query1.RecNo;
 Query2.RecNo := Fila;
end;

procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
 Fila : Integer;
begin
 if (Key=vk_Up) or (Key=vk_Down) then
  begin
   Fila := Query1.RecNo;
   Query2.RecNo := Fila;
  end;
end;

Saluditos

keyboy 13-03-2008 17:46:05

La consulta que pone gluglu es perfecta. Pero ya teniendo los datos en una sóla consulta, yo me olvidaría de los dos DBGrids y usaría uno sólo.

Bye

keyboy 13-03-2008 18:05:02

Creo que podemos utilizar una consulta menos complicada y más eficiente al no usar tantas subconsultas:

Código SQL [-]
select
  categoria,
  sum(if(year(fecha)=2007, debe, 0)) as egreso2007,
  sum(if(year(fecha)=2007, haber, 0)) as ingreso2007,
  sum(if(year(fecha)=2008, debe, 0)) as egreso2008,
  sum(if(year(fecha)=2008, haber, 0)) as ingreso2008
from caja
group by categoria

Al final de cuentas, no requerimos enlazar a la tabla parapersonales. Lo único que necesitamos es que nuestro motor acepte algún tipo de condicional. En el ejemplo uso el IF de MySQL.

Bye

MaMu 13-03-2008 22:19:50

Cita:

Empezado por keyboy (Mensaje 273035)
Creo que podemos utilizar una consulta menos complicada y más eficiente al no usar tantas subconsultas:


Código SQL [-]
select
categoria,
sum(if(year(fecha)=2007, debe, 0)) as egreso2007,
sum(if(year(fecha)=2007, haber, 0)) as ingreso2007,
sum(if(year(fecha)=2008, debe, 0)) as egreso2008,
sum(if(year(fecha)=2008, haber, 0)) as ingreso2008
from caja
group by categoria





Al final de cuentas, no requerimos enlazar a la tabla parapersonales. Lo único que necesitamos es que nuestro motor acepte algún tipo de condicional. En el ejemplo uso el IF de MySQL.

Bye

Si, tenes toda la razón, no lo habia pensado de esa forma.

MaMu 14-03-2008 15:26:00

Cita:

Empezado por keyboy (Mensaje 273035)
Creo que podemos utilizar una consulta menos complicada y más eficiente al no usar tantas subconsultas:


Código SQL [-]
select
categoria,
sum(if(year(fecha)=2007, debe, 0)) as egreso2007,
sum(if(year(fecha)=2007, haber, 0)) as ingreso2007,
sum(if(year(fecha)=2008, debe, 0)) as egreso2008,
sum(if(year(fecha)=2008, haber, 0)) as ingreso2008
from caja
group by categoria




Al final de cuentas, no requerimos enlazar a la tabla parapersonales. Lo único que necesitamos es que nuestro motor acepte algún tipo de condicional. En el ejemplo uso el IF de MySQL.



Bye

De todas maneras me encuentro con otro problema, porque la consulta me devolvería ambos resultados agrupados, es decir:

Año 2008---------Año 2007
categoria1 2008 categoria1 2008
categoria2 2008 categoria2 2008
categoria3 2008 categoria3 2008
categoria4 2007 categoria4 2007

y yo solo quiero encolumnar donde hubiese resultado ya que es para hacer una comparación paralela, asi:

Año 2008---------Año 2007
categoria1 2008 categoria1 ----
categoria2 2008 categoria2 ----
categoria3 2008 categoria3 ----
categoria4 ---- categoria4 2007

lo que agrego es la fecha, para poder mostrarla

Código SQL [-]
 
select
categoria, fecha,
sum(if(year(fecha)=2007, debe, 0)) as egreso2007,
sum(if(year(fecha)=2007, haber, 0)) as ingreso2007,
sum(if(year(fecha)=2008, debe, 0)) as egreso2008,
sum(if(year(fecha)=2008, haber, 0)) as ingreso2008 
from caja
group by categoria

y en cuyo caso en que en ambos años haya resultados, me repetiria la categoria, asi:

Año 2008---------Año 2007
categoria5 2008 categoria5 2008
categoria5 2007 categoria5 2007

lo que me complica la visualización para comparar.

MaMu 14-03-2008 15:33:22

En fin, lo solucionaré con campos calculados y veré que pasa.

keyboy 14-03-2008 17:33:51

No entiendo lo que quieres decir en tu penúltimo mensaje. ¿Para qué quieres agregar la fecha?

Vamos a ver, si tienes la tabla caja

Código:

+------------+---------+-------+-------+
|categoria  |  fecha  | debe  | haber |
+------------+---------+-------+-------+
|A          |  2007  | 100  |  50  |
|B          |  2007  | 150  | 200  |
|A          |  2007  |  50  | 100  |
|A          |  2007  |  10  |  0  |
|C          |  2007  | 200  |  50  |
|B          |  2008  | 100  | 150  |
|A          |  2008  |  50  | 100  |
|A          |  2008  | 100  | 200  |
|C          |  2008  |  50  |  50  |
|D          |  2008  | 100  |  10  |
+------------+---------+-------+-------+

y aplicas la consulta que te puse, obtienes

Código:

+------------+----------------+---------------+--------------+---------------+
|categoria  |  egreso2007  |  ingreso2007  |  egreso2008  |  ingreso2008 |
+------------+----------------+---------------+--------------+---------------+
|A          |  160          |  150          |  150        |  300        |
+------------+----------------+---------------+--------------+---------------+
|B          |  150          |  200          |  100        |  150        |
+------------+----------------+---------------+--------------+---------------+
|C          |  200          |  50          |  50        |    50        |
+------------+----------------+---------------+--------------+---------------+
|D          |    0          |    0          |  100        |    10        |
+------------+----------------+---------------+--------------+---------------+

y, de hecho, con la consulta de gluglu obtienes lo mismo, excepto que en lugar de ceros en los ejercicios en los que no hubo movimiento en alguna categoría, obtienes NULL.

Pero no entiendo entonces cuál es el problema para comparar. Según se entendía de la primera consulta SQL que escribiste, quieres comparar los egresos e ingresos, por categoría, de dos ejercicios distintos. Y eso lo puedes hacer con el tipo de resultado que te muestro: cada renglón es una categoría y puedes ver una columna por ejercicio.

En todo caso, puedes basarte en los datos de ejemplo que pongo para explicar con más detalle lo que buscas.

Bye


La franja horaria es GMT +2. Ahora son las 00:04:16.

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