Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

filtrar seleccionados en un db grid?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: filtrar seleccionados en un db grid? Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pero que es lo que quieres hacer exactamente?
Realizar una consulta SQL a la base de datos con los seleccionados?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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 Embarassed 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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No acabo de comprender que quieres hacer. De todas formas, yo me plantearía utilizar un ListView en modo vsReport y con la casilla de selección activada.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: solucion patxanga Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias, nunca usé los tlistview, pero los probaré a ver que tal con este codigo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡A mandar! Smile Aquí me tienes para cualquier (o casi) duda. Wink. Se me olvidaba: la propiedad multiselect del ListView si suas Checkboxes da igual como esté.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Shocked Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.