Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Stack overflow al reabrir una tabla (https://www.clubdelphi.com/foros/showthread.php?t=42821)

jzginez 24-04-2007 01:04:35

Stack overflow al reabrir una tabla
 
Hola amigos estoy usando Delphi 7, FireBird 1.5 y las FibPlus 5.3

Tengo una forma general (o base por así llamarla) con un dbgrid, toolBar (sus respectivos botones) un actionlist, statusbar, un memo (para verificar sentencias), un datasource, etc.

Esta forma a grandes rasgo me permite ver el contenio de la tabla, moverme en ella, ocultar columnas, cambiar el orden en que se muestran los campos, ordenar en base a un campo (me falta lograr que ordene por mas de un campo), buscar un registro especifico y crear y aplicar un filtro.

Esta forma la tengo en una carpeta general, cuando realizo un nuevo proyecto incluyo esta forma y creo formas hijas escribo un aproximado de 63 lineas de código y listo, hasta el momento funciona bien (apenas llevo 4 proyectos usando esta forma) pero en el que estoy haciendo actualmente al quitar el filtro me da el siguiente error:

Proyect Eikou.exe. raised exception class EstackOverFlow whit message 'Stack overflow', process stopped

Alguien me puede ayudar.

Segun entiendo el error no tiene nada que ver con las sentencias SQL, por eso el rollo de que hace la forma, el código del botón que pone y quita el filtro es el siguiente:

Código Delphi [-]
procedure TFrmGBClientes.SpeedButton1Click(Sender: TObject);
Var
  i: Integer;
  Registro: Integer;
begin
  If not dataSource1.DataSet.Eof
    Then Registro:= DataSource1.DataSet.FieldByName('ID').Value;
  Directorio := ExtractFilePath(ParamStr(0));
  Directorio:= Directorio + 'SQL\';
  If SpeedButton1.Down
    Then begin
      SqlAnterior:= DtmDatos.A_pDstClientes.SelectSQL.Text;
      Insertar:= DtmDatos.A_pDstClientes.InsertSQL.Text;
      Actualizar:= DtmDatos.A_pDstClientes.UpdateSQL.Text;
      Borrar:= DtmDatos.A_pDstClientes.DeleteSQL.Text;
      Releer:= DtmDatos.A_pDstClientes.RefreshSQL.Text;
      DtmDatos.porFiltro:= False;
    End
    Else Begin
      CodigoSQL:= SQLAnterior;
      TSpeedButton(Sender).Enabled:= False;
      DtmDatos.PorFiltro:= True;
    End;
  DataSource1.DataSet.Close;
  if CodigoSql <> SQLAnterior
    Then DtmDatos.A_pDstClientes.SelectSQL.SaveToFile(Directorio+DtmDatos.A_pDstClientes.Name+'.sql')
    Else DeleteFile(pChar(Directorio+DtmDatos.A_pDstClientes.Name+'.sql'));
  DtmDatos.A_pDstClientes.InsertSQL.Text:= Insertar;
  DtmDatos.A_pDstClientes.UpdateSQL.Text:= Actualizar;
  DtmDatos.A_pDstClientes.DeleteSQL.Text:= Borrar;
  DtmDatos.A_pDstClientes.RefreshSQL.Text:= Releer;
  For i:= 0 to Length(Valores) - 1 do
    DtmDatos.A_pDstClientes.ParamByName(DtmDatos.A_pDstClientes.ParamName(i)).Value:= Valores[i];
//  memo1.Lines.Clear;
//  memo1.Lines.Add(DtmDatos.A_pDstClientes.SelectSQL.Text);
  DataSource1.DataSet.Open;
  DataSource1.DataSet.Last;
  DataSource1.DataSet.Locate('ID',Registro,[]);
  inherited;
end;

jzginez 24-04-2007 16:52:53

Hola amigos, ya despues de dormir un rato logre encontrar mi error, el problema no era en el procedimiento que escribi, el problema estaba en el evento BeforeOpen donde por error habia repetido el nombre de la tabla A_pDstClientes con el comando open (A_pDstClientes.Open) por lo cual se estaba ciclando el procedimiento hasta que provocaba el desbordamiento de la pila.

Gracias, problema solucionado


La franja horaria es GMT +2. Ahora son las 16:42:46.

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