PDA

Ver la Versión Completa : Stack overflow al reabrir una tabla


jzginez
24-04-2007, 01:04:35
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:

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