Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   list index (2) out of bounds ----dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=65016)

anubis 16-11-2009 15:36:40

list index (2) out of bounds ----dbgrid
 
Perdon por volver a preguntar, pero ya estoy desesperado y no encuentro solucion.
Resumiendo:
un dbgrid y un edit
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
sqlquery1.Close;
 sqlquery1.sql.Clear;
   sqlquery1.SQL.text:='select nombre,telefono1 from contactos where nombre like '+quotedstr('%'+edit1.text+'%');
  sqlquery1.Open;
end;
En el edit pongo lo que quiero ir filtrando y me lo va mostrando hasta que pongo algo que no existe y es cuando me devuelve el error en el dbgrid cuando se actualizan los datos automaticamente.
Hay forma de evitar esto?.

Ya no se que mas hacer.

duilioisola 16-11-2009 20:09:03

Quizás con un IF

Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
  sqlquery1.Close;
  sqlquery1.sql.Clear;
  if (edit1.text > ' ') then
    sqlquery1.SQL.text:='select nombre,telefono1 from contactos where nombre like '+quotedstr('%'+edit1.text+'%')
  else
    sqlquery1.SQL.text:='select nombre,telefono1 from contactos ');
  sqlquery1.Open;
end;

o utilizando parámetros

Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
var 
   p : string;
begin
  if (edit1.text > ' ') then
     p := '%'+edit1.text+'%';

  sqlquery1.Close;
  sqlquery1.sql.Clear;
  sqlquery1.SQL.text:='select nombre,telefono1 from contactos where nombre like :parte_de_nombre');
  Params.ByName['parte_de_nombre'].AsString := p;
  sqlquery1.Open;
end;

duilioisola 16-11-2009 20:16:37

De todos modos, no debe estar el error en el Query que haces.
Supongo que el error está en aglún procedimiento que depende del open.

Debes tener algún procedimiento en el query que genera el error.
Before/AfterOpen
Before/AfterScroll

O puede estár en alguno de los campos
OnChange, por ejemplo

O puede que por DataSource haya un detalle (de un maestro-detalle) que haga scroll o close-open y que tenga algún procedimiento como los anteriores.

coso 16-11-2009 20:33:57

Hola,
prueba de usar sqlquery.DisableControls y sqlquery.EnableControls antes y despues de trabajar con el query:

Código Delphi [-]
   sqlquery.DisableControls;
...
   sqlquery.Open;
   sqlquery.EnableControls;

PD: no nos indicas que base de datos ni componentes usas. Personalmente tuve errores parecidos (por un bug en el reposicionamiento del cursor en las query, usando BDE), que finalmente se solucionaron migrando a ADO. Un saludo.

anubis 16-11-2009 21:15:42

[solucionado]
 
estoy trabajando con sqlite3 y usando filtrado por nombre, de hecho si uso un locate va bien si me lo encuentra sino lo encuentra se bloquea.
gracias la verdad es que es duro que pase esto apenas estoy usando algo sencillo.
os pongo el codigo que tengo completo a ver si por ahi hay algo, porque el disablecontrols no hace nada (que yo sepa)
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  sqlite3connection1.DatabaseName:='agenda.db3';
  sqlite3connection1.Connected:=true;
  sqlquery1.Active:=true;
 sqlquery1.IndexFieldNames:='nombre';
 sqlquery1.Filter:='nombre';
 sqlquery1.filtered:=true;


end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 edit1.Text:='';
sqlquery1.active:=false;
  sqlquery1.filtered:=false;
  sqlquery1.Indexfieldnames:=combobox1.Items[combobox1.itemindex];
  sqlquery1.Filter:=combobox1.Items[combobox1.itemindex];
  sqlquery1.Active:=true;

  sqlquery1.filtered:=true;


end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.ShowModal;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  sqlquery1.Close;
  sqlite3connection1.Close;
  close;

end;

procedure TForm1.Edit1Change(Sender: TObject);
var
pr:string;
begin
//sqlquery1.DisableControls;
begin
sqlquery1.Close;
sqlquery1.sql.Clear;

sqlquery1.SQL.text:='select nombre,telefono1,telefono2,celular,contacto from contactos where '+ combobox1.Items[combobox1.itemindex]+' like '+quotedstr('%'+edit1.text+'%');
sqlquery1.Open;
//sqlquery1.EnableControls;
end

end;
Ya me funciona, parece que tuve un problema en el formcreate y no puse filtered, eso creo, pero ya funciona.
Cuando cambio el indexfieldbyname, tengo que borrar lo que hay en el edit porque sino si me da otravez el error, pero con limpiarlo cada vez que cambio ya lo tengo resuelto.

gracias amigos


La franja horaria es GMT +2. Ahora son las 02:49:49.

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