| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Lun 01 Oct, 2007 9:42 am Asunto: filtrar seleccionados en un db grid? |
|
|
Tengo una consullta TQuery *q1, que contiene mis datos en el dbgrid, ahora hago una multiple seleccion (usando ctrl+click).
Usando la propierdad Filter de TQuery u otra cosa, ¿como puedo hacer que aparezcan filtrados solo los que tengo seleccionados sin hacer un OR extremadamente largo?
Ya de paso hay algún codigo que sirva para cualquier dbgrid que permita hacer una seleccion múltiple con la tecla mayúsculas en cualquier dbgrid. Gracias.
Ultima edición por ZHAX1 el Mar 02 Oct, 2007 3:23 pm, editado 2 veces |
|
| Volver arriba |
|
 |
hetorsc Lt JG

Registrado: 11 Abr 2007Mensajes: 61
|
Publicado: Lun 01 Oct, 2007 4:25 pm Asunto: |
|
|
Pero que es lo que quieres hacer exactamente?
Realizar una consulta SQL a la base de datos con los seleccionados? |
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Lun 01 Oct, 2007 5:01 pm Asunto: |
|
|
Lo que necesito es que me quede una nueva vista al pulsar el botón filtrar selección y yo poder hacer operaciones solo con los datos que me quedan.
imaginemos que tengo 10 filas, y selecciono 2, y le doy al botón filtrar seleccion, lo que yo haría es recorrer las filas seleccionadas, ir leyendo el campo clave y añadiendolo al Filter del TQuery.
Por ejemplo tengo 10 filas con un campo que se llama id.
Id nombre
1 pepe
2 juan
3 ....
.
.
.
10 carlos
si seleccionase el 10 y el 3, añadiría en filter Id = 3 OR Id = 10 y luego pongo Filtered = true;
Pero no creo que sea una solución muy elegante y en el caso de que seleccione muchas filas, imaginemos 100 ORs todos juntitos igual revienta.
¿Alguna otra solución? Recalco mi necesidad de poder seleccionar varias filas con mayusculas en lugar de ir de 1 en 1 con control.
Gracias y un Saludo. |
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Lun 01 Oct, 2007 5:57 pm Asunto: |
|
|
| ZHAX1 escribió: |
¿Alguna otra solución? Recalco mi necesidad de poder seleccionar varias filas con mayusculas en lugar de ir de 1 en 1 con control.
|
He descubierto que se pueden seleccionar varios con mayusculas si presionas mayusculas y giras la rueda del raton o si pulsas las flechas.
Aunque me gustaria que funcionara haciendo click también. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 02 Oct, 2007 8:30 am Asunto: |
|
|
| jur, que mal me debo explicar, ya no se como explicarlo de otra manera, se hace una seleccion multiple de la manera que sea y quiero que se visualicen solo los seleccionados, el resto desaparecerían. |
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 02 Oct, 2007 9:04 am Asunto: solucion patxanga |
|
|
Hice una funcioncita por si a alguien le sirve de algo y para que se me entiencda lo que necesito, esta función funciona bien y para cualquier base de datos. No se cuantos ORs puede soportar Filter sin que muera...
Si alguien tiene un solución mejor.
| Código: |
void filtrarseleccion(AnsiString nombrecampo,TDBGrid *g)
{
int j=0;
AnsiString filtro;
TDataSet *ds = g->DataSource->DataSet;
ds->DisableControls();
ds->First();
for(int i=0;i<ds>RecordCount;i++)
{
if(g->SelectedRows->CurrentRowSelected)
{
if(j>0) filtro=filtro + " OR "+nombrecampo+"="+ds->FieldByName(nombrecampo)->AsString;
else filtro= nombrecampo+"="+ds->FieldByName(nombrecampo)->AsString;
j++;
}
ds->Next();
}
ds->First();
ds->EnableControls();
ds->Filter=filtro;
ds->Filtered=true;
} //recordar quitar el filtro cuando sea conveniente filtered = false;
|
Por lo menos espero que a alguien le pueda resultar util algún dia. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 02 Oct, 2007 10:05 am Asunto: |
|
|
¡Ah! Ahora sí que entiendo lo que quieres. Yo lo haría así:
1. Pon un TListView y, si quieres, un TButton para activa/desactivar el filtro. En el TListView pon la propiedad Checkboxes a true y ViewStyle en vsReport. Pon el botón, si lo has usado, en Enabled = false.
2. Ejecuta el query que tengas. Supongamos que es algo así:
| Cita: | | SELECT Codigo, Apellidos, Nombre FROM Personas |
Suponemos el campo Codigo es único, y por lo tanto la clave.
3. Rellena el TListView:
| Código: | TListColumn *pColumn;
TListItem *pItem;
ListView1->Columns->Clear();
ListView1->Items->Clear();
pColumn = ListView1->Columns->Add();
pColumn->Caption = "Codigo";
pColumn = ListView1->Columns->Add();
pColumn->Caption = "Apellidos";
pColumn = ListView1->Columns->Add();
pColumn->Caption = "Nombre";
while (!query->Eof)
{
pItem = ListView1->Items->Add();
pItem->Caption = query->FieldByName("Codigo")->AsString;
pItem->SubItems->Add(query->FieldByName("Apellidos")->AsString;
pItem->SubItems->Add(query->FieldByName("Nombre")->AsString;
query->Next();
} |
4. En el evento OnClick del TListView:
| Código: | Button1->enabled = false;
for (int nItem = 0; nItem <ListView1>Items->Count; nItem ++)
if (ListView1->Items->Item[nItem]->Checked)
{
Button1->Enabled = true;
break;
} |
5. En el OnClick del botón, por ejemplo:
| Código: | AnsiString cCadena;
for (int nItem = 0; nItem <ListView1>Items->Count; nItem ++)
if (ListView1->Items->Item[nItem]->Checked)
cCadena = cCadena + "'" + ListView1->Items->Item[nItem]->Caption + "',";
query->Close();
query->SQL->Text = "SELECT Codigo, Apellidos, Nombre FROM Personas WHERE Codigo ";
if (cCadena.Pos(",") == cCadena.LastDelimiter(","))
query->SQL->Text = query->SQL->Text + "= " + cCadena.SubString(1, cCadena.LastDelimiter(",") - 1);
else
query->SQL->Text = query->SQL->Text + "IN (" + cCadena.SubString(1, cCadena.LastDelimiter(",") - 1) + ")";
query->Open(); |
Y vuelta a cargar el ListView (Paso 3)
Espero que te valga o al menos te dé una idea. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 02 Oct, 2007 11:26 am Asunto: |
|
|
| Gracias, nunca usé los tlistview, pero los probaré a ver que tal con este codigo. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
ZHAX1 Master

Registrado: 09 Mar 2007Mensajes: 191
|
Publicado: Mar 02 Oct, 2007 3:22 pm Asunto: |
|
|
 |
|
| Volver arriba |
|
 |
|