Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
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
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 12-03-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 12-03-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 12-03-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por gluglu Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 13-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
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
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #6  
Antiguo 13-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No entiendo:
Cita:
Empezado por mamu Ver Mensaje
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
Responder Con Cita
  #7  
Antiguo 13-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por Caral Ver Mensaje
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
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #8  
Antiguo 13-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
¿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
Responder Con Cita
  #9  
Antiguo 13-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por keyboy Ver Mensaje
¿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)



......

__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 13-03-2008 a las 07:51:00.
Responder Con Cita
  #10  
Antiguo 13-03-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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 ? , 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

__________________
Piensa siempre en positivo !
Responder Con Cita
  #11  
Antiguo 13-03-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #12  
Antiguo 13-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 13-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 13-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por keyboy Ver Mensaje
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.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #15  
Antiguo 14-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por keyboy Ver Mensaje
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.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #16  
Antiguo 14-03-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
En fin, lo solucionaré con campos calculados y veré que pasa.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #17  
Antiguo 14-03-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
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
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
Sincronizar dos BD de SQL lgarcia SQL 2 18-05-2007 19:45:00
Sincronizar desplazamiento horizontal en dos DbGrid Héctor Randolph OOP 0 15-03-2007 23:29:00
Sincronizar bdd con ado dimitri Conexión con bases de datos 0 29-01-2007 11:10:21
Sincronizar ficheros Status Quo Varios 0 16-05-2006 18:06:59
Sincronizar dbgrid con Header EITB OOP 0 21-09-2004 19:29:56


La franja horaria es GMT +2. Ahora son las 04:29:14.


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