Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Cambio de campo en una consulta (https://www.clubdelphi.com/foros/showthread.php?t=69187)

jafera 31-07-2010 17:06:39

Cambio de campo en una consulta
 
Buenas tardes de nuevo

Primero de todo Delphi 6 y Firebird 1.5, es que a veces se me pasa comentarlo.

A ver si alguien me ilumina otra vez, pues debo tener la bombilla fundida.
Tengo un form de busqueda con un JVdbgrid, un combobox, un edit y una IBSQL.
De entrada el form cuando se inicia hace la primera consulta la cual esta programada en el IBSQL.

El problema lo tengo si introduzco algun caracter en el edit para que busque un registro concreto y despues voy al combobox y cambio el criterio (campo) de busqueda que me lanza un error de index out of bounds.

La linea que falla creo que es la comentada // ya que si la pongo sin comentar falla y asi no, pero claro no da error pero tampoco hace el order by.

Código Delphi [-]
 
procedure TF_BuscarCamio.ComboBox1Select(Sender: TObject);
begin
        Edit1.Text :='';
        OrdenarGrid.Close;
        //OrdenarGrid.SQL[2] := 'ORDER BY '+ ComboBox1.Text;
        OrdenarGrid.Open;
        OrdenarGrid.FieldByName(ComboBox1.Text).Index := 0;
        DBGridBuscar.SetFocus;
end;
procedure TF_BuscarCamio.Edit1Change(Sender: TObject);
begin
        OrdenarGrid.Close;
        OrdenarGrid.SQL.Clear;
        OrdenarGrid.SQL.Add('select * from BOM0001 where upper('+Combobox1.text+') like ''%'+AnsiUpperCase(Edit1.Text)+'%'' order by '+Combobox1.text+'');
        OrdenarGrid.Open;
end;

Si a alguien no le falla el generador y tiene luz.....

Gracias de nuevo

Josep

rgstuamigo 31-07-2010 17:38:15

Haber haslo así:
Código Delphi [-]
procedure TF_BuscarCamio.ComboBox1Select(Sender: TObject);
begin
        Edit1.Text :='';
        OrdenarGrid.Close;

//ojo la primera fila es la cero(0) y la segunda es uno(1) ;)
        OrdenarGrid.SQL[1] := 'ORDER BY '+ ComboBox1.Text;// reemplazo la segunda fila de la consulta SQL
        OrdenarGrid.Open;
        OrdenarGrid.FieldByName(ComboBox1.Text).Index := 0;
        DBGridBuscar.SetFocus;
end;

Código Delphi [-]
procedure TF_BuscarCamio.Edit1Change(Sender: TObject);
begin
      OrdenarGrid.Close;
      OrdenarGrid.SQL.Clear;
// agrego la consulta SQL en 2 Filas(Strings) ;)
      OrdenarGrid.SQL.Add('select * from BOM0001 where upper('+Combobox1.text+') like ''%'+AnsiUpperCase(Edit1.Text)+'%''');
      OrdenarGrid.SQL.Add('order by '+Combobox1.text);
      OrdenarGrid.Open;
end;
Espero te sea de utilidad.;)
Saludos...:)

afunez2007 31-07-2010 17:45:36

Hola Jafera

Yo antes usaba un metodo parecido al tuyo para hacer las busquedas, aunque despues me encontre otro mas practico:
Antes usaba este metodo:
1.- un JvDBFindEdit que tiene asociado el datasourse del grid, este compontente que pertence a Jedi Vcl project, hace el trabajo por ti, y tiene 2 modos locate y filter, ademas te permite buscar por fisrtpos o anypos.
2.- un Combo box con los posibles criterios de busqueda (campos)
3.- En el evento OnCloseUp del compo el siguiente codigo:
Código Delphi [-]
procedure TfrmBuscArt.cbbBuscarPorCloseUp(Sender: TObject);
begin
if cbbBuscarPor.ItemIndex=0 then
begin
  JvDBFindEdit1.DataField:='DESCR';
end;
if cbbBuscarPor.ItemIndex=1 then
begin
  JvDBFindEdit1.DataField:='CLV_ART';
end;
if cbbBuscarPor.ItemIndex=2 then
begin
  JvDBFindEdit1.DataField:='CLV_ALTER';
end;
end;

El metodo que utilizo ahora es el siguiente:
1.- un JvDBFindEdit que tiene asociado el datasourse del grid, este compontente que pertence a Jedi Vcl project, hace el trabajo por ti, y tiene 2 modos locate y filter, ademas te permite buscar por fisrtpos o anypos.
2.- Quite el ComboBox ya que este me limita los criterios de busqueda a los que aparecen en el listado y cambie por hacer un evento que cuando hagas click en el titulo de la columna se cambie de criterio de busqueda o sea el campo de la columna que cliqueaste, para esto debes tener activada la propiedad TitleButtons en True en el grid.
3.- En el evento OnTitleBtnClick del grid el siguiente codigo:
Código Delphi [-]
procedure TFORM15.JvDBGrid1TitleBtnClick(Sender: TObject; ACol: Integer;
  Field: TField);
begin
    edtDESCR.DataField:=JvDBGrid1.Columns[Acol].FieldName;
    Caption:='Busqueda de Articulos por '+JvDBGrid1.Columns[Acol].Title.Caption;
    edtDESCR.Find(edtDESCR.Text);
    chkExist.OnClick(Sender);

end;

edtDESCR es el nombre del objeto JvDBFindEdit que utilizo para la busqueda.

Tambien para cambiar el modo de busqueda en cualquier posicion o primera posicion lo hago con un checkbox y el siguiente codigo:
Código Delphi [-]
procedure TFORM15.CheckBox1Click(Sender: TObject);
begin
  if CHECKBOX1.Checked=True then
  begin
    edtDESCR.FindMode:=fmAnyPos;
    edtDESCR.Find(edtDESCR.Text);
  end;
  if CHECKBOX1.Checked=False then
  begin
    edtDESCR.FindMode:=fmFirstPos;
    edtDESCR.Find(edtDESCR.Text);
  end;
end;

Espero te sirvan estas ideas y cualquier duda no mas escribes

Saludos

jafera 02-08-2010 12:25:46

Gracias por vuestras respuestas.

En principio y por comodidad (rapidez) he implantado la de rgstuamigo.

Afunez, la tuya tiene buena pinta y con más calma la voy a implantar seguro, pero ahora no tengo tiempo.

Me ha gustado mucho el tema de hacer click en la barra de titulos.

Solo una cuestion al respecto, si hago un click me sale una flecha arriba y si vuelvo a hacer click me sale la flecha abajo.

Esto se controla en algun sitio? o por defecto es una ordenacion asc y una desc

Gracias

Josep

afunez2007 02-08-2010 16:50:56

Hola
Lo de que si te sale una flecha hacia arriba o hacia abajo, no tiene ninguna afectacion ya que no hay ningun evento o propiedad configurado para ese efecto, en todo caso yo asumo que se podria usar para temas de ordenamiento, sin embargo yo solamente lo he usado para cambiar el campo de busqueda.

Saludos


La franja horaria es GMT +2. Ahora son las 14:07:15.

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