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 

Definir un TChart

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

Buenas a todos. A partir de este código encontrado aquí y en otro foro estoy montando un TChart en base a los resultados de, por ejemplo, este Query:
Código:
SELECT B.Sigla, B.Color, C.Fecha, SUM(A.Votos) Votos
  FROM Resultados A, Partidos B, Elecciones C
 WHERE A.CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia')
   AND A.CodPrv = C.CodPrv AND C.Proceso = 4 AND C.Fecha BETWEEN 1993 AND 2019
   AND A.Proceso = C.Codigo
   AND A.Mesa IN (SELECT Codigo FROM Mesas WHERE CodPrv = A.CodPrv)
   AND B.CodPrv = A.CodPrv AND A.Partido = B.Codigo
   AND A.Partido IN (22, 4, 2, 3, 17, 16)
 GROUP BY A.Partido, B.Sigla, B.Color, C.Fecha ORDER BY A.Partido, B.Sigla, C.Fecha

Con el resultado del mismo genero esta pantalla que tiene un TListView y un TChart.

Para crear el TChart hago esto:
Código:
if (Chart1->SeriesCount() > 0)
     Chart1->RemoveAllSeries();

Chart1->Title->Font->Style = TFontStyles();
Chart1->BottomAxis->Title->Caption     = "Años";
Chart1->BottomAxis->Title->Font->Style = TFontStyles() << fsBold;
Chart1->LeftAxis->Title->Caption       = "Votos";
Chart1->LeftAxis->Title->Font->Style   = TFontStyles() << fsBold;

AnsiString cAux = "";
fMenu->Auxiliar->First();
for (; !fMenu->Auxiliar->Eof; fMenu->Auxiliar->Next())
{
     if (fMenu->Auxiliar->FieldByName("Sigla")->AsString != cAux)
     {
          cAux = fMenu->Auxiliar->FieldByName("Sigla")->AsString;
          Chart1->AddSeries(&TLineSeries(this));
     }

     Chart1->Series[Chart1->SeriesCount() - 1]->Add(fMenu->Auxiliar->FieldByName("Votos")->AsInteger, fMenu->Auxiliar->FieldByName("Fecha")->AsInteger, (TColor)fMenu->Auxiliar->FieldByName("Color")->AsInteger);
}

Pero me surgen algunos problemas:
    1. En el eje horizontal deberían mostrarse los años y en el mismo orden que se ven en el TListView (de menor a myor). Sin embargo la asignación la hace inversa de forma que en la gráfica el valor más a la izquierda corresponde al último año mostrado.
    2. En la leyenda quiero mostrar la primera columna del TListView (las siglas del partido).
    3. Como veis uno de los registros sólo tiene un valor pero sin embargo no aparece (o esa impresión me da) en la gráfica.

¿Alguna idea de como resolver estos problemas? Porque llevo un par de días dando vueltas al problema y no se me ocurre nada.
_________________
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

Una parte del problema (el 1º y creo que el 3ºde la lista) ya lo he resuelto. La asignación de valores de cada serie los estoy haciendo mal y por eso parece que está invertida la serie, peor me falta como hacer la asignación de los valores del eje y de la leyenda.
_________________
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

Bueno. He resuelto todos los problemas menos uno. El código ha quedado así partiendo de este query:
Código:
SELECT A.Partido, B.Sigla, B.Color, C.Fecha, SUM(A.Votos) Votos
  FROM Resultados A, Partidos B, Elecciones C
 WHERE C.Proceso = :Proceso
   AND C.Fecha BETWEEN :Desde AND :Hasta AND A.Proceso = C.Codigo
   AND A.Mesa IN (SELECT Codigo FROM Mesas)
   AND A.Partido = B.Codigo
   AND A.Partido IN (22, 4, 2, 3, 17, 16)
 GROUP BY A.Partido, B.Sigla, B.Color, C.Fecha ORDER BY A.Partido, C.Fecha

y con este código:
Código:
Chart1->Chart3DPercent                 = 10;
Chart1->Title->Font->Style             = TFontStyles() << fsBold;
Chart1->BottomAxis->Title->Caption     = "Años";
Chart1->BottomAxis->Title->Font->Style = TFontStyles() << fsBold;
Chart1->BottomAxis->Labels             = fMenu->Auxiliar->FieldByName("Fecha")->AsInteger;
Chart1->LeftAxis->Title->Caption       = "Votos";
Chart1->LeftAxis->Title->Font->Style   = TFontStyles() << fsBold;

cAux = "";
for (; !fMenu->Auxiliar->Eof; fMenu->Auxiliar->Next())
{
     if (fMenu->Auxiliar->FieldByName("Sigla")->AsString != cAux)
     {
          pItem = Evolucion->Items->Add();
          pItem->Caption = (cAux = fMenu->Auxiliar->FieldByName("Sigla")->AsString);
          for (nItem = 1; nItem < Evolucion->Columns->Count; nItem ++)
               pItem->SubItems->Add("");

          Chart1->AddSeries(&TLineSeries(Chart1));
          Chart1->Series[Chart1->SeriesCount() - 1]->Title = cAux;
          Chart1->Series[Chart1->SeriesCount() - 1]->SeriesColor = (TColor)fMenu->Auxiliar->FieldByName("Color")->AsInteger;
     }

     nVotos[0] = 0;
     for (nItem = 1; nItem < Evolucion->Columns->Count; nItem ++)
          if (Evolucion->Columns->Items[nItem]->Caption == IntToStr(fMenu->Auxiliar->FieldByName("Fecha")->AsInteger))
          {
               nVotos[0] = fMenu->Auxiliar->FieldByName("Votos")->AsInteger;
               pItem->SubItems->Strings[nItem - 1] = FormatFloat("###,##0", nVotos[0]);
               break;
          }

          Chart1->Series[Chart1->SeriesCount() - 1]->Add(nVotos[0], fMenu->Auxiliar->FieldByName("Fecha")->AsInteger,
                                                              (TColor)fMenu->Auxiliar->FieldByName("Color")->AsInteger);
}
Chart1->Series[0]->XLabelsSource = "FECHA";

Obtengo este resultado:

Sin embargo, como podéis ver, las últimas bandas no se inician donde debieran a pesar de añadir valores al definir la serie donde así sea, y esto no se me ocurre como resolverlo.
_________________
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
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.