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)
-   -   TdbGrig con busqueda avanzada (https://www.clubdelphi.com/foros/showthread.php?t=88268)

alexglez1255 12-05-2015 04:47:49

TdbGrig con busqueda avanzada
 
Tengo algo en mi cabeza que se que es posible hacerlo por que ya vi que lo hicieron pero no se como :
tengo una busqueda por medio de la descripcion de un articulo pero lo que deseo es que al ir escribiendo la descripcion en el TdbGrid me muestre el primer registro que encuentre de la tabla de Almacen que dentro de la descripcion tenga lo que estoy escribiendo, no con un filtro sino que solo se posicione en el primer registro que encuentre la cadena parcial en cualquier parte del registro. TDBGrid
me explico.. bueno este es el codigo :
Código Delphi [-]
procedure TAltasdealmacen.edtBusqArtChange(Sender: TObject);
var
 cadenaAbuscar:String;
begin
cadenaAbuscar:=edtBusqArt.Text;
if (cmbBusqArti.ItemIndex=0)and(CadenaAbuscar<>'') and (not TryStrToInt(cadenaAbuscar,codarticulo)) then
  begin
   ShowMessage('En el campo de Codigo solo puede escribir numeros, ponga cuidado por favor');
      edtBusqArt.SetFocus;
      exit;
  end;
end;


procedure TAltasdealmacen.cmbBusqArtiChange(Sender: TObject);
begin
case cmbBusqArti.ItemIndex of
0: begin edtBusqArt.MaxLength:=0; end;
1: begin
     edtBusqArt.MaxLength:=50;
     LogicaNegocio.CDSBusqAlma.IndexFieldNames:='DESCRIPCION';
     DBBusqAlma.Visible:=true;  Aqui muestro el DBGrid
     edtBusqArt.Text:='';
     edtBusqArt.SetFocus;
   end;
end;//case

end;

procedure TAltasdealmacen.BtbusqArtiClick(Sender: TObject);

begin
 with logicanegocio do
  case cmbBusqArti.ItemIndex of
  0: if not CDSBusqAlma.Locate('COD_ARTICULO',edtBusqArt.text,[loCaseInsensitive]) then ShowMessage('Codigo inexistente')
     Else
       begin
         CDSAlma.Close;
         CDSAlma.Params.ParamByName('COD_ARTICULO').AsString:=edtBusqArt.Text;
         CDSAlma.Open;
       end;
  1: if not CDSBusqAlma.Locate('DESCRIPCION',edtBusqArt.text,[loPartialKey]) then ShowMessage('Descripcion no hallada')
    Else CDSBusqAlma.Refresh;
  //  CDSBusqAlma.Locate('DESCRIPCION',edtBusqArt.text,[loPartialKey])
  end;
end;

procedure TAltasdealmacen.edtBusqArtKeyPress(Sender: TObject;
  var Key: Char);
begin
  if key=#13 then BtbusqArtiClick(Sender);
end;
Alguna idea por favor, o sera alguna poropiedad especial en el DBGrid...
El Cliendataset CDSBusqAlma no manejo ningun constraint..gracias por su gran ayuda

ecfisa 12-05-2015 05:06:13

Hola alexglez1255.

Ya edité tu mensaje agregándolas pero por favor, cuando incluyas código en tus mensajes, utiliza etiquetas como muestra la imágen para darle más legibilidad:



Saludos y gracias por tu colaboración :)

ecfisa 12-05-2015 05:39:45

Hola

Un ejemplo simplificado de como hacer lo que buscas:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  with IBQuery1 do
  begin
    Close;
    SQL.Text := 'SELECT * FROM TU_TABLA';
  end;

  with DataSetProvider1 do
  begin
    DataSet := IBQuery1;
    Options := Options + [poAllowCommandText];
  end;

  with ClientDataSet1 do
  begin
    Close;
    ProviderName := 'DataSetProvider1';
    Open;
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with ClientDataSet1 do
  begin
    Close;
    CommandText:= 'SELECT * FROM TU_TABLA WHERE TU_CAMPO LIKE :PARAM';
    ClientDataSet1.Params.ParamByName('PARAM').AsString := '%' + Edit1.Text + '%';
    Open;
    Refresh;
  end;
end;
Donde, "TU_TABLA" es el nombre que le diste a la tabla en tu bd y "TU_CAMPO" es el campo sobre el que harás la búsqueda.

Saludos :)

alexglez1255 12-05-2015 13:41:30

Gracias ecfisa, voy a probar tu sugerencia, y creeme que hasta hoy entendi eso de los tags, prometo que en lo sucesivo los pondre..muchas gracias por tu ayuda..:D^\||/

Caminante 12-05-2015 16:34:02

Cita:

Empezado por alexglez1255 (Mensaje 492051)
... deseo es que al ir escribiendo la descripcion en el TdbGrid me muestre el primer registro que encuentre de la tabla de Almacen que dentro de la descripcion tenga lo que estoy escribiendo, no con un filtro sino que solo se posicione en el primer registro que encuentre la cadena parcial en cualquier parte del registro.

Puedes usar los metodos findfirst y findnext para posicionarte en el registro que cumpla con la condicion de busqueda.
Desgraciadamente no tengo delphi a mano para probar hacer un ejemplo pero en la cara oculta te muestra como hacerlo..

Espero te sea util.

Saludos

Casimiro Notevi 12-05-2015 17:31:59

Cita:

Empezado por Caminante (Mensaje 492065)
Puedes usar los metodos findfirst y findnext para posicionarte en el registro que cumpla con la condicion de busqueda.
Desgraciadamente no tengo delphi a mano para probar hacer un ejemplo pero en la cara oculta te muestra como hacerlo.. Espero te sea util. Saludos

Eso, si mal no recuerdo, es para posicionar en ficheros en disco.

Caminante 12-05-2015 18:13:31

Cita:

Empezado por Casimiro Notevi (Mensaje 492066)
Eso, si mal no recuerdo, es para posicionar en ficheros en disco.

Yo una vez lo probe con una base de datos firebird y cliendatasets y funciono bien...

Saludos

Casimiro Notevi 12-05-2015 18:25:29

Cita:

Empezado por Caminante (Mensaje 492071)
Yo una vez lo probe con una base de datos firebird y cliendatasets y funciono bien...
Saludos

Ah, bien, pero te refieres a métodos de algún dataset. Sí, también.

Caminante 12-05-2015 18:55:29

Si a eso me referia...

Saludos

alexglez1255 13-05-2015 07:38:39

pregunta que no entiendo por que
 
tengo el DBGbusqAlma el cual solo es un listado de la tabla de articulos de almacen con dos campos Codigo y Descripcion, y al ir insertando el dato a buscar pongo la orden para que busque lo que se esta tecleando.. en teoria deberia posicionarse en el DBGbusqAlma sin embargo no sucede, se muestra la tabla con los articulos pero no se muestra posicionado en el DBgBusqAlma.

Código Delphi [-]
procedure TAltasdealmacen.edtBusqArtChange(Sender: TObject);
var
 cadenaAbuscar: String;
begin
  cadenaAbuscar:=edtBusqArt.Text;
  if (cmbBusqArti.ItemIndex=0)and(CadenaAbuscar<>'') and (not TryStrToInt(cadenaAbuscar,codarticulo)) then
  begin
    ShowMessage('En el campo de Codigo solo puede escribir numeros, ponga cuidado por favor');
    edtBusqArt.SetFocus;
    exit;
  end;
end;

procedure TAltasdealmacen.cmbBusqArtiChange(Sender: TObject);
begin
  case cmbBusqArti.ItemIndex of
    0:begin 
         edtBusqArt.MaxLength:=0; 
       end;
   1:begin
        edtBusqArt.MaxLength:=50;
        LogicaNegocio.CDSBusqAlma.IndexFieldNames:='DESCRIPCION';
        DBBusqAlma.Visible:=true;  // Aqui muestro el DBGrid
        edtBusqArt.Text:='';
        edtBusqArt.SetFocus;
      end;
  end; //case

end;

En teoria deberia mostrar el registro al encontrarlo pero no lo hace... alguien sabe por que.. muchas gracias.. de hecho ya verifique con una variable boolean para saber el resultado del locate, y si lo halla, el problema es que no se posiciona en el DBgBusqAlma

ecfisa 13-05-2015 08:13:06

Hola alexglez1255.

Veo que tomaste en serio lo de las etiquetas :)... Pero no es necesario aplicarlas por cada línea de código, sino una vez sobre el texto seleccionado como indica la imágen. O si lo prefieres, escribiendo [delphi] antes de iniciar el código y [/delphi] al finalizar.

Cuando quieras resaltar nombres de variables, campos, procedimientos, etc. fuera de lo que es el código propiamente dicho, es mejor poner el texto en negrita o cursiva.

Edité tu mensaje como me pareció que intentabas presentarlo. Si no refleja lo que deseabas, avisame y lo corregimos como indiques.

Saludos :)

ecfisa 13-05-2015 10:10:59

Hola de nuevo.
Cita:

Empezado por alexglez1255 (Mensaje 492093)
...el cual solo es un listado de la tabla de articulos de almacen con dos campos Codigo y Descripcion, y al ir insertando el dato a buscar pongo la orden para que busque lo que se esta tecleando...

¿ Buscas que se posicione en la fila con el valor mas cercano al ingresado y que se mantengan visibles las demás filas del TClientDataSet ?

Si es así, podrías hacer:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  ...

  with ClientDataSet1 do
  begin
    IndexFieldNames := 'COD_ARTICULO;DESCRIPCION';
    Open;
  end;

  with ComboBox1 do
  begin
    Style := csDropDownList;
    ItemIndex := 0;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  with TComboBox(Sender) do
    if ItemIndex = 0 then
      ClientDataSet1.IndexFieldNames := 'COD_ARTICULO'
    else
      ClientDataset1.IndexFieldNames  := 'DESCRIPCION';
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with ClientDataSet1 do
  begin
    SetKey;
    if ComboBox1.ItemIndex = 0 then
      FieldByName('COD_ARTICULO').AsString:= TEdit(Sender).Text
    else
      FieldByName('DESCRIPCION').AsString:= TEdit(Sender).Text;
    GotoNearest;
  end;
end;

Saludos :)

alexglez1255 13-05-2015 15:33:18

jajajajaja Gracias Ecfisa, te agradesco mucho tu ayuda, me fruste un poco cuando vi mi desastre con las etiquetas, y hasta despues vi cual habia sido mi error.:o
En cuanto a mi pregunta lo unico que deberia hacer este codigo es que cada ves en el evento change pongo que busque el registro de lo que ya se escribio y me lo muestre en el dbGBusqAlma... no me da error pero no lo hace...me explico.?

alexglez1255 13-05-2015 16:08:22

Cita:

Empezado por alexglez1255 (Mensaje 492110)
jajajajaja Gracias Ecfisa, te agradesco mucho tu ayuda, me fruste un poco cuando vi mi desastre con las etiquetas, y hasta despues vi cual habia sido mi error.:o
En cuanto a mi pregunta lo unico que deberia hacer este codigo es que cada ves en el evento change pongo que busque el registro de lo que ya se escribio y me lo muestre en el dbGBusqAlma... no me da error pero no lo hace...me explico.?

hice una revision mas exahustiva linea por linea la siguiente linea no me ubica el dato parcial, no se por que ...
Código Delphi [-]
LogicaNegocio.CDSBusqAlma.Locate('DESCRIPCION',edtBusqArt.Text,[loPartialKey])
alguna observacion..?

alexglez1255 13-05-2015 16:14:50

Gracias ya halle el error, gracias a mi Dios Jehova, que me ayudo...lo que pasa que en el ibquery puse que ordenara por la descripcion y funciono...

alexglez1255 13-05-2015 17:02:41

Perdon y tambien gracias a ustedes por su ayuda...una pregunta despues de que hallo el codigo hago un param...
Código Delphi [-]
     DBBusqAlma.Visible:=False;
        edtBusqArt.Text:=IntToStr(CDSBusqAlmaCOD_ARTICULO.Value);
         CDSAlma.Close;
         CDSAlma.Params.ParamByName('COD_ARTICULO').AsString:=edtBusqArt.Text;
         CDSAlma.Open;
         cdsalma.DisableControls;

todo esta bien solo que no muestra los datos hallados hasta que doy click en cada uno de los campos, aunque le de un refresh al Clientdatase.. alguna orden para que me los muestre en el CDS o en l DATA SOURCE ,...gracias


La franja horaria es GMT +2. Ahora son las 22:31:38.

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