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 

Odenar un DBGRID

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Odenar un DBGRID Responder citando

El problema es el siguiente:

Utilizo ADOQUERY para rellenar una DBGRID. He puesto en los titles de la DBGRID el tipico triangulito para poder ordenar por la columna en cuestión. He de hacer una consulta a base de datos cada vez que quiero ordenar? no es possible trabajar con los registros del DATASET sin tener que hacer otro acceso a la BD?

Supongo que si que se puede pero no tengo ni idea de como.
Gracias de nuevo.

Gran Foro!! Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: se algo más Responder citando

lo siguiente si que se que se puede hacer:

Código:
 DataSource1->DataSet->Filtered = false;
        DataSource1->DataSet->Filter = "nom = " + QuotedStr("pere") + " OR " + "nom = " + QuotedStr("a");
        DataSource1->DataSet->Filtered = true;


Pero claro como ordenar? je je
Sigo en ello.

Gracias. Espero que alguien me pueda resolver lo de ordenar.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Lo mas rápido es ordenar los registros por su indice secundario.

Claro que yo uso parados para los proyectos pequeños e interbase en los proyectos más serios.

Sería algo como esto:
Supongamos que tenemos un indice llamado INumeroFactura que está asignado (por así decirlo) al campo NumeroFactura en la tabla pedidos, el clasico ejemplo:
Código:

//Ordeno las facturas por el número de factura
TPedidos->Active = False;                                  //Tabla desactivado
TPedidos->IndexName = "INumeroFactura";        //Nuemros de factura
TPedidos->Active = True;                                   //Activo la tabla

Las tablas hay primero que desactivar para poder ordenar y despues para mostrar los datos, logicamente, activar de nuevo.



Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Antes de explicar: ¿Cómo haces para poner el triángulo en los títulos de un DBGrid? Yo tengo Builder 5 y no he visto como se puede hacer. POr un lado.

Sobre como hacer lo que quieres se me ocurre una cosa. No he usado nunca elementos ADO, pero supongo que un ADOQuery será similar a un query normal, e imagino que habrá un evento que controla si has pulsado el título y la dirección en que apunta el triángulo, ¿es así? Yo pondría un código similar a este:
Código:
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT * FROM 'Tabla' WHERE <Condiciones>");
if (<triangulo abajo>)
     ADOQuery1->SQL->Add("ORDER BY <campo> DESC");
else
     ADOQuery1->SQL->Add("ORDER BY <campo> ASC");

Espero que te valga
_________________
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: Gracias Responder citando

Gracias Rayder y Angel. La verdad es que mi idea era aprovechar los datos que tengo en el Dataset e intentar no volver a acceder a la BD para poder ordenar las filas del DBGRID. La opción de volver a consultar con select es la que utilizo pero esperava poder ordenar sin más peticiones a la BD.

Gracias de todas formas!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

De todas formas me tienes que explicar como haces para poner los triángulos en los títulos. Please! Smile
_________________
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: no es mio Responder citando

Lo encontre en el foro, creo que es de Leo!!

en el evento: DBGrid1DrawColumnCell
de la Grid claro esta.

Código:

TCanvas *canvas = dynamic_cast<TDBGrid*>(Sender)->Canvas;

    TRect r(Rect);
    r.top = 0;
    r.Bottom = Rect.Height() - 2;
    InflateRect(&r, -1, -1);
    canvas->Brush->Color = clWhite;
    canvas->FillRect(r);

    if (DataCol == Ordenar[grid->Tag].nColumna)
    {
        r.Right -= 14;
        if (Ordenar[grid->Tag].fAscendente)
        {
            canvas->Pen->Color = clSilver;
            canvas->MoveTo(r.Right+1, 10);
            canvas->LineTo(r.Right+10, 10);
            canvas->LineTo(r.Right+5, 5);
            canvas->Pen->Color = clBtnShadow;
            canvas->MoveTo(r.Right+1, 10);
            canvas->LineTo(r.Right+6, 5);

            canvas->Font->Color = clSilver;
            canvas->Font->Height = 12;
            //canvas->TextOutA(r.Right-20,r.Top,"A-Z");
        }
        else
        {
            canvas->Pen->Color = clSilver;
            canvas->MoveTo(r.Right+10, 5);
            canvas->LineTo(r.Right+1, 5);
            canvas->LineTo(r.Right+6, 10);
            canvas->Pen->Color = clBtnShadow;
            canvas->MoveTo(r.Right+10, 5);
            canvas->LineTo(r.Right+5, 10);

            canvas->Font->Color = clSilver;
            canvas->Font->Height = 12;
            //canvas->TextOutA(r.Right-20,r.Top,"Z-A");
        }
    }

    canvas->Font = DBGrid1->Font;

    DrawText(canvas->Handle, Column->Title->Caption.c_str(),
        Column->Title->Caption.Length(), &r,
        DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La verdad es que me ha costado encontrarlo un poco, pero ya está.

He localizado el post de Marky:
https://cppbuilder.es/viewtopic.php?t=4621&highlight=grid

Me gustaría saber si puedes explicar un poco como funciona, en el post de Marky no aclara mucho




Un saludo, Rayder
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.