PDA

Ver la Versión Completa : No se refrescan las DBGrid ???


Fita
01-05-2005, 17:10:51
Hola a todos...

Tengo dos DBgrid enlazadas a dos IBDatasets.
La DBGrid1 muestra los datos del IBDataset1 cuya sql es:

Select * from alu000 where estado = 'A'

La DBGrid2 muestra los datos del IBDataset2 cuya sql es:

Select * from alu000 where estado = 'B'

La idea es que al hacer dobleclick en una de las DBGrid cambie el valor del campo "estado" a su valor opuesto, es decir si es 'A' pasa a 'B' y viceversa. Con esto deberían cambiar las dos DBGrid. Suponiendo la existencia de un solo registro, éste debería pasar de una DBgrid a otra... bueno; lo que sucede es que desaparece de una pero no aparece en la otra.

Para ello la Sql que se ejecuta al hacer doble click en la DBGrid1 es:

// como es estado = 'A' lo pasa a estado = 'B'
IBDataset1.selctsql.close;
IBDataeet1.selectsql.clear;
IBDataset1.selectsql.add('update alu000 set estado = :estado');
IBDataset1.parambyname('estado').asString := 'B';
IBDataset1.ExecSql;
IBTransaction1.Commit;

Sel_Alu_A; // procedure que contiene la sql que selecciona estado = 'A'
Sel_Alu_B; // procedure que contiene la sql que selecciona estado = 'B'

---------------------------------------------------------------------

Para la DBGrid2 al hacer doble click

// (muestra estado = 'B' ) lo pasa a estado = 'A'

IBDataset2.selctsql.close;
IBDataeet2.selectsql.clear;
IBDataset2.selectsql.add('update alu000 set estado = :estado');
IBDataset2.parambyname('estado').asString := 'A';
IBDataset2.ExecSql;
IBTransaction2.Commit;

Sel_Alu_A; // procedure que contiene la sql que selecciona estado = 'A'
Sel_Alu_B; // procedure que contiene la sql que selecciona estado = 'B'

// Cuando abro el form se ejecutan las sql
Procedure Form.Create;
begin
Sel_alu_A;
Sel_Alu_B;

end;

Ya he probado con el DBGrid.Refresh y otras cosas... sólo funciona cuando cierro el formulario y lo habro nuevamente; lo que significa que algo estoy pasando por alto y no sé que es...

Alguna idea ???

Gracias por adelantado
:confused: Fita

eduarcol
02-05-2005, 23:59:10
Por lo que pude ver cierras pero no abres los dataset, porq no pruebas esto


// como es estado = 'A' lo pasa a estado = 'B'
IBDataset1.selctsql.Active := False;
IBDataeet1.selectsql.clear;
IBDataset1.selectsql.add('update alu000 set estado = :estado');
IBDataset1.parambyname('estado').asString := 'B';
IBDataset1.ExecSql;
IBTransaction1.Commit;
IBDataset1.selctsql.Active := True;


de pronto si posteas el codigo de Sel_Alu_A y Sel_Alu_B te podriamos ayudar un poco mas

Fita
03-05-2005, 20:22:14
Gracias por tu respuesta, he probado pero no funciona.
Estos son los procedimientos:

procedure Sel_Alu_A;
begin
IBDataset1.close;
IBDataset1.selectsql.clear;
IBDataset1.selectsql.add('select * from alu000 where estado = ');
IBDataset1.selectsql.add(' quotedstr('A') );
IBDataset1.open;
end;

procedure Sel_Alu_B;
begin
IBDataset2.close;
IBDataset2.selectsql.clear;
IBDataset2.selectsql.add('select * from alu000 where estado = ');
IBDataset2.selectsql.add(' quotedstr('B') );
IBDataset2.open;
end;

Se trata de un sistema para colegios, a medida que navegas por las familias los dos DBgrid en cuestion muestran los hijos (alumnos) que concurren al establecimiento. Un DBGRid muestra los que concurren (estado = 'A') y el otro muestra los que ya egresaron o se fueron (estado = 'B').
Pasa que siempre hay alguno que vuelve o que se va; por eso al hacer doble click lo reactiva con todos sus datos, solo le cambia el estado de 'B' a 'A' y viceversa.
El update lo hace bien y luego disparo los procedures Sel_Alu_A y Sel_alu_B para que recomponga los dos DBgrids.
Por ejemplo: si doy de baja un alumno, desaparece del dbgrid1 pero no aparece en el dbgrid2; ahora si navego por las familias el dbgrid2 muestra los que estan de baja de cada familia, se entiende? es como que afecta solamente al registro modificado, ese NO LO VE; a menos que cierre el formulario e ingrese nuevamente, ahi si refleja el cambio.
Me parece que la cosa viene por el lado de la Transaccion pero que?

Saludos