Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-11-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Post Hacer busqueda en un Ttable

Hola a tod@s, estoy haciendo un programa que me tiene que hacer una busqueda en una Ttable, lo hice aplicando un filtro para que se pudiera buscar por el campo [Nombre] o por el campo [PersonaContacto], esto funciona a la perfección con pocos registros, en cuanto se lo pase a mi jefe y metio trescientos y pico registros en la tabla el filtro se hace lentisimo.

He leido por los Foros que se pueden hacer busquedas con Locate, lo declarado de la siguiente forma:
Código Delphi [-]
Form1.Table1.Locate('Nombre', edit1.text, [loCaseInsensitive, loPartialKey]);

Y se me posiciona en el primer registro de la tabla, no me lo busca, esta mal declarado?

¿Una vez echa la busqueda con Locate se puede aplicar un filtro para que en el Dbgrid solo me aparezcan los registros que busco?Es que esto es lo que me interesaria que hiciera.

O a lo mejor hay que hacer la busqueda de otra forma.Os estaría muy agradecido si me lo solucionarais.

Gracias a Todos por vuestra ayuda.
Responder Con Cita
  #2  
Antiguo 30-11-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Para lo que tú quieres es mejor que uses una query y hagas un filtrado de los datos de la tabla mediante una SELECT...
Código:
// Por si las moscas ;)
Form1.Query1.Close();

// Cambiamos la condición de búsqueda
// Utilizamos quotedString para ponerle comillas simple a la cadena (en el caso que sea de tipo string  ;) )
Form1.Query1.SQL.Text := 'SELECT misCampos FROM miTabla WHERE Nombre='+quotedString(Edit1.Text);

// Ejecutamos la consulta
Form1.Query1.Open();
De esta forma tendremos en Query1 nuestro resultado filtrado de una forma rápida.

Si lo que quieres es realizar una búsqueda parcial, solamente debes cambiar la condición del WHERE...

Código:
....

Form1.Query1.SQL.Text := 'SELECT misCampos FROM miTabla WHERE Nombre LIKE "%'+quotedString(Edit1.Text)+'%"';

....
Salu2

Última edición por Er_Manué fecha: 30-11-2004 a las 17:43:03.
Responder Con Cita
  #3  
Antiguo 01-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Gracias por contestarme ER MANUE,lo que pasa es que el componente Query no lo controlo mucho y no se como hacer que en mi Dbgrid1 salga los registros que tengo en los campos que tengo en mi tabla.

Lo he asociado con un Datasource igual que el componente Ttable, pero como hago para que salgan los registros de los campos que yo quiera., es que de codigo SQL no tengo ni pajolera idea.

Por cierto la sentencia "quotedString" me da un error, tengo que poner alguna libreria en la USES.Gracias por responderme.
Responder Con Cita
  #4  
Antiguo 01-12-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
upps.. es quotedStr() viene definida en la libería SysUtils que por defecto se incluye cada vez que creamos un formulario.

Para acceder a los registros de un TQuery a través de un DataSource, igual que para un TTable.

Para mostrar únicamente una serie de campos de los registros, por ejemplo únicamente el nombre, apellidos y dirección, podemos hacerlo de varias formas:
[/list]
  • Si vas a usar posteriormente el resto de campos para otro tipo de operaciones, controla los campos a mostrar en tu DBGrid añadiendo columnas (Una por cada campo que vayas a mostrar). Dentro de cada columna le puedes decir el campo del que quieres que tome los datos.
  • Si no quieres el resto de campos para nada, es recomendable obtener desde la SQL únicamente los campos que deseemos mostrar, para no sobrecargar el motor de BD. Por ejemplo si únicamente quiero mostrar el nombre, apellidos y direccion, usaría la siguiente consulta:
    Código:
    SELECT nombre, apellidos, direccion FROM tablaClientes;

Espero que te sirva de ayuda.

Si tienes problema con el SQL por internet hay miles de tutoriales, en esta misma página tienes un tutorial de SQL, en la sección manuales.

Salu2
Responder Con Cita
  #5  
Antiguo 02-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Gracias por tu ayuda,pero yo no quiero filtrar por campos sino por registros, me explico:

Yo tengo un programa con empresas direcciones telefonos etc... y lo que quiero es que cuando alguien le de a buscar, escriban el nombre de la empresa o de la persona de contacto y en el dbgrid solo me aparezca esa empresa, ya te digo que lo he conseguido con la propiedad filtered de Ttable pero cuando hay muchos registros de momento 400 va muy lenta la busqueda por eso puse este Hilo

Si me puedes ayudar de nuevo te lo agradecere, sino gracias de todas formas por tu interes.
Responder Con Cita
  #6  
Antiguo 02-12-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
mmmm..

Exactamente eso es lo que te expliqué la primera vez que te respondí , La propiedad filter lo que hace es establecer un filtro sobre los registros recuperados por el TTable, TQuery,... Si lo que quieres es hacer un filtrado ANTES de obtener los datos y así sobrecargar menos el motor, debes hacer el filtrado mediante el uso de SQL.

Para hacer un filtrado mediante SQL, únicamente debemos establer el criterio de selección en el campo WHERE de la consulta. Por ejemplo, si tenemos los siguientes datos:

- Una tabla que se llama clientes
- La tabla clientes tiene los siguiente campos:
  • id_cliente: Campo de tipo numérico que almacena la Clave Primaria de la tabla
  • nombre: Campo de tipo string.
  • apellidos: Campo de tipo string.
  • empresa: Campo de tipo string.
  • direccion: Campo de tipo string.
  • resto de campos que ahora mismo no me interesan...

Una anotación, la estructura básica de una sentecia SQL es:
SELECT campos FROM tabla WHERE condicion

campos = CAMPOS a recuperar de cada registro, si los queremos todos ponemos *
tabla = TABLA de la queremos recuperar los datos.
condicion = CONDICIÓN de filtrado que le quermos aplicar a la TABLA seleccionada.

weno con todo esto, ahora queremos hacer una búsqueda mediante el campo nombre sería tan simple como añadir a la propiedad SQL del TQuery:
Código:
.....
Form1.Query1.SQL.Text := 'SELECT * FROM clientes WHERE nombre='+quotedStr(edtFiltroNombre.text);
......
edtFiltroNombre es un campo TEdit que contiene el nombre que quiero buscar.

Si quiero realizar una búsqueda por el campo empresa debemos utilizar la siguiente sentencia:
Código:
.....
Form1.Query1.SQL.Text := 'SELECT * FROM clientes WHERE empresa='+quotedStr(edtFiltroEmpresa.text);
......
edtFiltroEmpresa es un campo TEdit que contiene la empresa que quiero buscar

Y ahora por último, si quisieramos hacer un filtrado mediante los campos nombre y empresa, usamos:
Código:
.....
Form1.Query1.SQL.Text := 'SELECT * FROM clientes WHERE
 nombre='+quotedStr(edtFiltroNombre.text)+' AND empresa='+quotedStr(edtFiltroEmpresa.text);
......
Si quisieramos a demás filtrar tambien por el campo direccion únicamente deberíamos incluir una condición más en la clausula WHERE:

Código:
...WHERE nombre='+quotedStr(edtFiltroNombre.text)+
' AND empresa='+quotedStr(edtFiltroEmpresa.text)+' AND direccion='+quotedStr(edtFiltroDireccion.text)
Espero que te haya quedado más claro, si aún asi sigues teniendo dudas, te mando un ejemplo para que lo puedas estudiar.

Un salu2
Er_Manué
Responder Con Cita
  #7  
Antiguo 03-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Hola de nuevo Er_Manué.

Cita:
Espero que te haya quedado más claro
Claro no, me ha quedado clarisimo, muchisimas gracias, no se como agradecerte la ayuda que me has prestado, no te imaginas los quebraderos de cabeza que me estaba dando los puñeteros filtros.

Perdona que te haga otra pregunta, (vas a decir que soy un pesao),tenia un DbNavigator asociado al Table1, pues al cambiarlo y asociarlo al Query1 se me han desctivado los botones como los puedo activar de nuevo y hacer que funcionen como antes

Si necesitas algo en lo que yo te pueda ayudar no dudes en ponerte en contacto conmigo.

Un saludo

Última edición por Nbull fecha: 03-12-2004 a las 13:42:58.
Responder Con Cita
  #8  
Antiguo 03-12-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
No te preocupes para eso estamos Supongo que será por que se te ha desactivado el TQuery.

El DBNavigator lo debes asociar al DataSource al que tienes a su vez asociado el TQuery. Comprueba que tengas la propiedad Active del TQuery a True.

Ya me contarás. Saludos
Er_Manue
Responder Con Cita
  #9  
Antiguo 03-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Pues no se por que sera pero la Tquery la tengo a Active:=true en el evento OnFormCreate, y el DbNavigator lo tengo asociado al datasource de la query y no me funcionan los Botones.

Ahora me ha pasado una Put... por que como tenia todo el programa basado en una Ttable y he cambiado eso del query para que las busquedas sean más rapidas me ha tocado cambiarlo todo y me sale esto.
Me da otra excepcion y es que he puesto Query1.Insert o Query1.Edit y me dice que: 'Query1 cannot modify a Read-Only dataset', no se que hacer para quitar esta excepcion.Y si le quito el insert o el edit me dice que la tabla no esta en modo edicion cuando quiero modificar algun registro.
Un saludo
Responder Con Cita
  #10  
Antiguo 14-12-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
Revisa las propiedades ReadOnly y LockType de tu TTable.
Código:
// Valores con los cuales te debería permitir realizar operaciones de insercción/modificación de los registros
//=================================================================

// Permitimos la escritura en la tabla
ReadOnly := false;

// ltOptimistic o la que nos interese, exceptuando ltReadOnly ;)
LockType := ltOptimistic;
Salu2
Responder Con Cita
  #11  
Antiguo 30-12-2004
incansable incansable is offline
Registrado
 
Registrado: dic 2004
Posts: 5
Poder: 0
incansable Va por buen camino
para nebull

Hola amigo te envio algo de codigo para tratar los query desde codigo
a mi me funciona bien pasandole paramtros
Código Delphi [-]
  procedure Mquey2(DtoEdit:array of string;opc,opc1: integer); //controla todo el query1
   begin
         DataModule2.Query2.CLOSE;DataModule2.Query2.SQL.Clear;
  DataModule2.query2.sql.add('SELECT CODCLI, NOMECLI, NIF, DIRECCION, POBLACION,
  PROVINCIA, TF_FAX, TF_1, TF_MV, OFERTA, T_PRECIO1, T_PRECIO2, T_DTO1, ULTCOMPRA, LIMT_RIESG');
         DataModule2.query2.sql.add('FROM "CLIENT.DBF" Client');
       Case Opc Of
         1: begin
             Case Opc1 Of
                1: begin //ordenado por codigo
                    DataModule2.query2.sql.add('WHERE (CODCLI = :CODCLI)');
                    DataModule2.Query2.Params[0].AsString := DtoEdit[0];//dato a buscar completo
                    DataModule2.query2.sql.add('ORDER BY CODCLI') ;
                   end;
                2: begin
                    DataModule2.query2.sql.add('WHERE  NOMECLI LIKE  :NOMECLI '); //dato a buscar parcial
                    DataModule2.Query2.Params[0].AsString:= (DtoEdit[0] + '%') ;
                    DataModule2.query2.sql.add('ORDER BY NOMECLI') ;
                   end;
             end;
                    DataModule2.Query2.open;
            end;
       end;
   end;
saludos

Última edición por marcoszorrilla fecha: 30-12-2004 a las 21:34:18. Razón: Añadir etiquetas Delphi
Responder Con Cita
  #12  
Antiguo 12-12-2010
userdelphi userdelphi is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 15
Poder: 0
userdelphi Va por buen camino
alguien aca me diria como filtrar por fecha en un adoquery con access

hola alguien q me diga como fltrar por fecha

desde un datetimepicker q el usuario elegira la fecha ahi, y pulsa un button para filtrar,
eso se muestra en un dbgrid
usando un adoquery , y mi base de dato es access ,
mi tabla se llama tVentas y el campo es "fecha" este en access esta almacenado como fecha/hora y en formato fecha corta (dd/mm/aaaa)

intente hacer varias cosas pero no me funciono.

en un post mio de usuario userdelphi esta todo mas explicado.

un saludo-
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


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


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
Copyright 1996-2007 Club Delphi