| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Invitado
|
Publicado: Vie 17 Dic, 2004 12:16 pm Asunto: DBGrid - Seleccionar fila al pulsar tecla |
|
|
Tengo un DBGrid que me muestra una lista bastante extensa de resultados, me gustaria saber como hacer que se mostrara/señalara una determinada fila pulsando la tecla de la inicial de un valor de unos de sus campos.
Gracias. |
|
| Volver arriba |
|
 |
Luis Mendez Invitado
|
Publicado: Vie 17 Dic, 2004 4:57 pm Asunto: Presionando una tecla |
|
|
Puedes utilizar los eventos
OnKeyPress o OnKeyDown
para que capturado el valor de la
tecla que tipea el usuario el programa
vaya buscando en la tabla segun
las teclas que se van pulsando. |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 20 Dic, 2004 10:47 am Asunto: |
|
|
| y como hacer para ordenar el dbgrid segun la tecla? |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 20 Dic, 2004 2:34 pm Asunto: |
|
|
| No, que si pulso "C" se me muestren solamente los registros en los que un determinado campo empiece con C sin tener que realizar mas consultas a la base de datos |
|
| Volver arriba |
|
 |
Luis Mendez Invitado
|
Publicado: Lun 20 Dic, 2004 8:28 pm Asunto: Presionando una tecla |
|
|
Supongamos que quieres seleccionar por el nombre,
dentro del OnKeyDown haces
Table1->Filter = Table1->Filter + tecla_que_apretaste;
Table1->Filtered = true;
Eventualmente usando el mismo OnKeyDown y chequeando
si es que se mueve con las flechas o algo por el estilo,
deberas poner en vacio el AnsiString ->Filter
Lo que yo utilizo, segun el caso es un DBGrid con un TEdit
en el cual a medida que el usuario va escribiendo le voy
mostrando datos que concuerden con lo que el usuario tipea.
Por ejemplo una tabla de clientes en un grid y 3 edit,
uno por numero de documento, otro por nombre del cliente y
el ultimo por zona de residencia. Pero para esto debo tener
previstos y existentes indices sobre cada uno de estos campos.
Dependiendo del tamaño del archivo donde buscas y del tipo
de base de datos que estes usando, lo puedes hacer con un SQL. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 21 Dic, 2004 8:35 am Asunto: |
|
|
Una alternativa que tienes es emplear consultas SQL con el comando LIKE. Yo haría algo así; la primera vez haz una consulta de toda la tabla por el campo que te interese:
| Código: | Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM 'MiTabla' ORDER BY Campo");
Query1->Prepare();
Query1->Open(); |
Cuando pulse una tecla, en el evento OnKeyPress, la consulta puede quedar así:
| Código: | Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM 'MiTabla' WHERE Campo LIKE '" + AnsiString(Key) + "%' ORDER BY Campo");
Query1->Prepare();
Query1->Open(); |
Puedes refinarlo un poc para que no se te escape ningún dato:
| Código: | Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM 'MiTabla' WHERE UPPER(Campo) LIKE '" + UpperCase(AnsiString(Key)) + "%' ORDER BY Campo");
Query1->Prepare();
Query1->Open(); |
Con esto siemrpe compararás mayúsculas y evitaras las posibles difernecias entra mayúsculas y minúsculas. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Ultima edición por Angel el Mar 21 Dic, 2004 6:22 pm, editado 1 vez |
|
| Volver arriba |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Mar 21 Dic, 2004 10:07 am Asunto: |
|
|
La opción del lenguaje SQL combinada con un TQuery es la más común y utilizada por los programadores ya que sin ser muy complicada resulta tremendamente eficaz. Ahora bien, si ya tienes el DBGrid enlazado a un TTable y vas a utilizar sentencias SQL para hacer búsquedas vas a tener que "desenlazar" el DBGrid de su TTable inicial y enlazarlo con el TQuery con el que realizamos la búsqueda en SQL, que tampoco es que sea nada complicado pero bueno, lo que intento explicar es que existe otra forma de hacer una búsqueda en un DataSet sin necesidad del SQl y TQuery:
| Código: |
void __fastcall TForm1::DBGrid1KeyPress(TObject *Sender, char &Key)
{
AnsiString letra = Key;
TLocateOptions opciones;
opciones <<loCaseInsensitive<<loPartialKey;
Table1->Locate("Titulo",letra,opciones);
}
|
En el primer parámetro de la función Locate() le damos con un AnsiString el nombre del campo de la tabla en el que vamos a realizar la búsqueda, el segundo parámetro es un AnsiString que representa el texto que vamos a buscar y el último de los parámetros contiene las opciones de búsqueda que hemos definido previamente, loCaseInsensitive para que funcione tanto con mayúsculas como con minúsculas y loPartialKey para que se realice la búsqueda independientemente del número de letras que tenga la cadena de texto que buscamos.
Tal vez el inconveniente de este código en tu caso es que no filtra los resultados como un sentencia SQL, si no que lo único que hace es marcar en el DBGrid la primera coincidencia de la búsqueda, por eso y según lo que quieras hacer es más aconsejable que uses SQL con un TQuery tal y como te han apuntado los compañeros del foro. Saludos. _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
Invitado
|
Publicado: Lun 27 Dic, 2004 9:22 am Asunto: |
|
|
| gracias a todos. |
|
| Volver arriba |
|
 |
|