| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Vie 20 Ago, 2004 9:19 am Asunto: Odenar un DBGRID |
|
|
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!!  |
|
| Volver arriba |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Vie 20 Ago, 2004 9:26 am Asunto: se algo más |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Lun 30 Ago, 2004 8:53 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 31 Ago, 2004 8:40 am Asunto: |
|
|
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 |
|
 |
amas2 Lt

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mar 31 Ago, 2004 12:06 pm Asunto: Gracias |
|
|
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 |
|
 |
Angel Master


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

Registrado: 01 Jun 2004Mensajes: 91
|
Publicado: Mar 31 Ago, 2004 12:30 pm Asunto: no es mio |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Jue 02 Sep, 2004 12:07 pm Asunto: |
|
|
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 |
|
 |
|