Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con un IbDataset; (https://www.clubdelphi.com/foros/showthread.php?t=72296)

marcoszorrilla 09-02-2011 12:25:34

Problema con un IbDataset;
 
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.

Código Delphi [-]
[//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.


La franja horaria es GMT +2. Ahora son las 09:19:53.

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