PDA

Ver la Versión Completa : Problema con un IbDataset;


marcoszorrilla
09-02-2011, 12:25:34
D7 + Firebird 2.0.

Tengo un IbDataset ubicado en un Datamodulo lanzo una consulta y funciona correctamente, pero no la segunda vez y siguientes que me sigue mostrando los datos de la primera vez a pesar de que desconecto el DataSet y destruyo el Datamodulo en el que se encuentra.

[//Entrada desde el menú:
procedure TfrMenu.StockPPedido1Click(Sender: TObject);
begin
Listado:=3;
AbrirCerrar_Modulo_DmExisten(1);
Application.CreateForm(TfrExistencias, frExistencias);
frExistencias.ShowModal;
AbrirCerrar_Modulo_DmExisten(0);
end;


//Procedimiento que Crea y destruye el Datamodulo
Procedure AbrirCerrar_Modulo_DmExisten(N:Integer);
begin
Case n of
1:Application.CreateForm(TDmExisten ,DmExisten);
2:FreeAndNil(DmExisten);
end;
end;


//Código invocado en existencias.
procedure TfrExistencias.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=CaFree;
end;

procedure TfrExistencias.spbuscarClick(Sender: TObject);
begin
if Length(edBuscar.Text) > 2 then
DmExisten.IBDtsPVP.Locate('Producto',edBuscar.Text,[loPartialKey])
else
ShowMessage('ATENCION: Teclee al menos tres caracteres.');

end;
procedure TfrExistencias.FormActivate(Sender: TObject);
begin
{Listado
1 Todas
2 P. pedido =<0
3 Stock <= p.pedido
4 1 proveedor}

DmExisten.IbDtsPvp.Close;
DmExisten.IbDtsPvp.SelectSQL.Clear;


DmExisten.IbDtsPvp.SelectSQL.Add('Select * from Pvp Where Activo=''S''');

case Listado of
1:begin
DmExisten.IbDtsPvp.SelectSQL.Add('And StockReal > 0');
frExistencias.Caption:='Productos con existencias.';
end;
2:begin
DmExisten.IbDtsPvp.SelectSQL.Add('And PPedido<= 0');
frExistencias.Caption:='Productos con Punto de Pedido <= 0.';
end;
3:begin
DmExisten.IbDtsPvp.SelectSQL.Add('And StockReal <= PPedido');
frExistencias.Caption:='Productos con StockReal <= Punto de Pedido.';
end;
4:begin
DmExisten.IbDtsPvp.SelectSQL.Add('And Codigo Starting With '+QuotedSTr(Codigo));
frExistencias.Caption:='Existencias de Productos de '+cMensaje;
end;
end;

DmExisten.IbDtsPvp.SelectSQL.Add('Order by Producto');
ShowMessage(DmExisten.IbDtsPvp.SelectSQL.Text);
DmExisten.IbDtsPvp.Open;

DmExisten.IbDtsPvp.Last;

//sino hago esto la rejilla me muestra siempre los datos de la primera vez que entro
//y ya no me actualiza más, la rejilla está conectada al DataSource
DbgrExist.DataSource:=Nil;
Navega.DataSource:=Nil;
DbgrExist.DataSource:=DmExisten.DtsPvp;
Navega.DataSource:=DmExisten.DtsPvp;

//Esta parte funciona con y sin el código anterior.
//Devuelve bien el número de registros pero visualiza solo los de la primera consulta
lbRegistros.Caption:='Número de Productos:'+FormatFloat(',0',DmExisten.IbDtsPvp.RecordCount);
end;


procedure TfrExistencias.SpeedButton1Click(Sender: TObject);
begin
Application.CreateForm(TfrLstExistencias, frLstExistencias);
frLstExistencias.ListaExistencias.PreviewModal;
frLstExistencias.Close;
end;


Con el código en rojo he logrado que me funcione, ahora el problema es que tengo conectado un QuickRep al mismo DataSet y siempre me lanza el mismo listado, es decir el de la primera consulta. ???

Un Saludo.

Casimiro Notevi
09-02-2011, 15:52:28
¿Y en qué momento creas la nueva consulta?, la que sustituye a la anterior.

Al González
09-02-2011, 16:32:22
Hola Marcos.

Al parecer esto se debe a que la primera instancia del módulo de datos no es realmente destruida en AbrirCerrar_Modulo_DmExisten. Y cuando llamas de nuevo a este procedimiento se crea una segunda instancia, quedando la primera todavía asociada con los objetos de la interfaz de usuario. Parte del problema está en el uso del valor 0, cuando el procedimiento requiere el valor 2 (se recomienda el uso de constantes con nombre para evitar estas discrepancias).

Pero, además, debes asegurarte de no destruir el módulo de datos mientras haya instancias de formularios relacionadas con él. Pues la destrucción de una instancia de módulo de datos para en seguida crear otra, aunque la asignes a la misma variable global (DmExisten), no hará que los formularios existentes se reasocien en automático al nuevo módulo (quedarían más bien sin conjuntos de datos asociados por haber sido destruidos éstos al liberar el primer módulo de datos).

Espero te ayude a solucionar el problema.

Un abrazo modulado.

Al González. :)

marcoszorrilla
09-02-2011, 23:17:00
Gracias por las sugerencias, mañana haré más pruebas y os cuento.

Por cierto Al, de mano acabo de ver el terrible fallo, es decir llamar con 0 cuando necesita 2, haré un cambio para que el 0 sea cerrar y seguro que funciona.

Un Saludo.