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)
-   -   como hacer una busqueda de un campo en una BD (https://www.clubdelphi.com/foros/showthread.php?t=78482)

vanesa007 24-04-2012 04:39:00

como hacer una busqueda de un campo en una BD
 
1 Archivos Adjunto(s)
hola amigos, para mi programita que ando peleando para hacerlo, y despacio va creciendo, llegue a esta parte, que me gustaria cambiarle algo, aunque asi anda bien, pero me gustaria agregarle unos detalles mas

tengo una dase datos que ice de ejemplo,solo para ir probando, la base datos real, que una ves terminado tendra mas campos, pero para empezar y experimentar, alcanza con solo 5 campos, tiene campo ID, NUMERO, NOMBRE, APELLIDO y DIRECCION, lo cual en el form me muestra en un DBGrib los campos que tiene, y puse un EDIT y un boton, con el codigo que esta mas abajo, en el edit escribo un APELLIDO a buscar en la base datos, y con el boton hago la busqueda para ver si esta en la base datos, si encuentra ese apellido en el DBGrib, me indica con un triangulito negro en el renglon donde esta ese apellido,
Bueno.. lo que s eme ocurrio seria.. que a medida que voy escribiendo letra a letra el apellido, me vaya apareciendo los todos los APELLIDOS que empiezan con esa primer letra, despues cuando escribo la segunda letra me aparezcan todos los apellidos que empiezan con esas dos primeras letras, y asi sucesivamente....... creo que me entienden...

y para el caso de que existan dos apellidos iguales, los nombres o la dirección sera diferente, entonces de esos dos apellidos aciendo un doble clic en el me lo mande a otro form nuevo......

esta parte la veo mas complicada, por eso recurro a alguien k me ayude

pero igual.. mientras espero alguna respuesta ire viendo como hacer esto

gracias

//mas abajo pongo el codigo DELPHI de como lo estoy aciendo y una imagen

Código:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, ADODB, Grids, DBGrids, StdCtrls, Mask, DBCtrls;
type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
    temp:integer;
  opcion:TLocateOptions;
begin
    adoTable1.Locate('apellidO',Edit1.Text,[]);
end;

end.


MartinS 24-04-2012 12:30:35

Hola Vanesa: ¿Que tipo de base de datos usas?... Access, Paradox, Interbase, Firebird,....

Saludos

Northern 24-04-2012 13:20:59

Cita:

Empezado por vanesa007 (Mensaje 430778)
hola amigos, para mi programita que ando peleando para hacerlo, y despacio va creciendo, llegue a esta parte, que me gustaria cambiarle algo, aunque asi anda bien, pero me gustaria agregarle unos detalles mas

...


Lo que quieres hacer no es difícil, es fácil. Lo complicado es que hay muchísimas maneras de hacerlo, muchísimas maneras de diseñarlo y muchísimas maneras de complicarse.

De entrada, poner los componentes de acceso a datos en el Form principal cuando dices que quieres agregarle unos detalles más, y a lo mejor después quieres agregar nuevos Forms, imprimir algunos registros, etc., no es lo más aconsejable. Los componentes de acceso a datos, y en general los componentes no visuales, aconsejan colocarlos en los TDataModule, un tipo de Form contenedor.

Pienso que tendrías que leer este libro "La cara oculta de Delphi 4" y allí hay muchas respuestas.

vanesa007 24-04-2012 13:45:42

HOLA AMIGOS, GRACIAS POR SUS PRONTAS RESPUESTAS....

para MartinS:
Estoy utilizando acces 2003

para Northern:
Voy a ller sobre TDataModule, por que de eso no tengo ni idea, vere que peudo hacer, pero si me dices que es mejor hacerlo asi, lo estudiare como se hace, mi programita seria sencillo, algo chico, no comercial, solo para alivianarme trabajo, claro que mas adelante agregaria algunos datos, corregiria errores de escritura en apellidos nombres o cosas asi.. pero gracias igual

saludos

MartinS 24-04-2012 16:00:47

Vanesa:
Como bien dijo Northern existen muchas maneras de hacerlo. Aqui te voy a poner solo una para que vallas viendo mas o menos como seria el procedimiento:

Código Delphi [-]
procedure TPBuscarGral.Edit1Change(Sender: TObject);
begin
   If Edit1.Text <> '' then
   Begin
     With Dm.Internos do
     Begin
      Case ComboBox1.ItemIndex of
       0: Locate('Apellidos',Edit1.Text,[loCaseInsensitive, loPartialKey]);
       1: Locate('Nombres',Edit1.Text,[loCaseInsensitive, loPartialKey]);
       2: Locate('Domicilio',Edit1.Text,[loCaseInsensitive, loPartialKey]);
      end; // Case
     end; // With
   end;
end;

Si bien no sabemos el nivel que tienes en el desarrollo de programas usando delphi voy a tratar de explicarte algo de que es lo que hace el procedimiento de arriba:
El procedimiento se ejecuta cada vez que cambia el contenido del Edit (evento onChange) y verifica que mientras exista algun caracter hace la localizacion del registro de acuerdo al campo que estoy buscando (por medio de un combobox que tengo cargado apellidos, nombres y domicilio (el numero indica el indice del combo)) y las opciones loCaseInsensitive (no deferencia mayusculas y minusculas y el lopartialkey para que busque un parcial (creo que es esa la definicion).

Northern expuso lo del TDatamodule. Siempre se utiliza (Al menos yo) para colocar todos los componentes de acceso a datos y funciona como una unidad adicional del proyecto. Se crea a partir de menu - nuevo - DataModule y lo guardas con el nombre que desees y luego al form1, por ejemplo, le decis que use la unidad recien creada, en el ejemplo se llama DM. (por eso que para la busqueda uso DM.Internos) donde dm es el datamodule e internos seria tu AdoTable.-
El uso del Datamodule es importante porque si quieres hace doble clik en el apellido y lo levante otro formulario ese otro formulario tambien deberas indicarle que use el mismo Datamodule creado y al estar seleccionado el registro correspondiente te lo llevara sin mas preambulo.-

Bueno, Mas o menos esto podrias hacer, pero todo se hace suponiendo que el uso de mas de un formulario lo sabes hacer y tambien recomiendo que leas la cara oculta de delphi 4 que expuso aqui el compañero que de seguro te va a ayudar y mucho.

Saludos y aquí estamos para lo que necesites :D

Sugerencia: Mira el tutorial de Caral para aprender sobre bases de datos mas robustas en este caso Firebird (ya que quieres aprender, empeza por lo bueno :D:D)

PD: y a no desanimarse y preguntar sin miedo porque todos hemos pasado por esto en algún momento y aun seguimos preguntando para continuar aprendiendo.- ;)

ecfisa 25-04-2012 05:23:21

Hola vanesa007.

Según entiendo queres hacer una búsqueda incremental, te pongo otra alternativa que hace lo que solicitas usando un TADOQuery :
Código Delphi [-]
procedure TForm1.EditChange(Sender: TObject);
begin
 with ADOQuery do
  begin
    Close;
    SQL.Text:='SELECT * FROM TU_TABLA WHERE APELLIDO LIKE :VALUE';
    Parameters.ParamByName('VALUE').Value:= Edit1.Text + '%';
    Open;
  end;
end;
En el caso de presentarse igualdades, supongo que lo indicado será dejar librada la elección al usuario aprovechando el evento OnClick u OnDblClick del TDBGrid.

Lo que también te comento que este tipo de búsquedas no son muy eficientes, sobre todo cuando se realizan en red ya que provocan mucho tráfico.

Saludos.

vanesa007 28-04-2012 19:51:50

gracias
 
gracias por responder, estoy estudiando los códigos que me pasaron, me andan bien

gracias


La franja horaria es GMT +2. Ahora son las 01:06:05.

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