PDA

Ver la Versión Completa : como hacer una busqueda de un campo en una BD


vanesa007
24-04-2012, 04:39:00
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


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
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 (http://www.terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4.pdf.zip)" 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:

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 (http://www.clubdelphi.com/foros/showthread.php?t=68708) 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 :

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 por responder, estoy estudiando los códigos que me pasaron, me andan bien

gracias