FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
||||
|
||||
Definir un TChart
Buenas a todos. A partir del código encontrado aquí y otro de este 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 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); }
|
#2
|
||||
|
||||
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 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"; 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. |
#3
|
||||
|
||||
¿Y si le pones valor cero en lugar de dejarlo en blanco?
|
#4
|
||||
|
||||
Si te fijas estoy poniendo cero.
Código:
cAux = ""; for (; !fMenu->Auxiliar->Eof; fMenu->Auxiliar->Next()) { [...] nVotos[0] = 0; // <--- AQUÍ INICIALIZO LA VARIABLE for (nItem = 1; nItem < Evolucion->Columns->Count; nItem ++) if (Evolucion->Columns->Items[nItem]->Caption == IntToStr(fMenu->Auxiliar->FieldByName("Fecha")->AsInteger)) { // Si hay un valor, lo asigno 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); } |
#5
|
||||
|
||||
¿Y si pones 1 tampoco?
|
#6
|
||||
|
||||
Tampoco. Y creo que ya me he dado cuenta de por qué: Porque no todos los partidos tiene votos en todos los años y al hacer el Add en TChart va añadiendo lo que encuentra; es decir que:
Cita:
Cita:
|
#7
|
||||
|
||||
Eso quería decirte con lo de que pusieras ceros.
|
#8
|
||||
|
||||
No, el año nunca lo puedo poner a cero; tengo que rellenar todos los campos para todas las líneas. Voy a darle un vuelta.
|
#9
|
||||
|
||||
Dicho de otra forma: Tengo que sacar todos los años para todos los partidos, independientemente de si tienen o no votos registrados.
|
#10
|
||||
|
||||
Como vía query no se me ocurre como sacar todos los años para todos los partidos, al margen de si tiene o nom votos registrados, lo h hecho de una forma un poco más pedestre, pero funciona.
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(""); } for (nItem = 1; nItem < Evolucion->Columns->Count; nItem ++) if (Evolucion->Columns->Items[nItem]->Caption == IntToStr(fMenu->Auxiliar->FieldByName("Fecha")->AsInteger)) pItem->SubItems->Strings[nItem - 1] = FormatFloat("###,##0", fMenu->Auxiliar->FieldByName("Votos")->AsInteger); } for (int nRow = 0; nRow < Evolucion->Items->Count; nRow ++) { fMenu->Auxiliar->First(); for (; !fMenu->Auxiliar->Eof; fMenu->Auxiliar->Next()) { if (Evolucion->Items->Item[nRow]->Caption == fMenu->Auxiliar->FieldByName("Sigla")->AsString) { Chart1->AddSeries(&TLineSeries(Chart1)); Chart1->Series[Chart1->SeriesCount() - 1]->Title = fMenu->Auxiliar->FieldByName("Sigla")->AsString; Chart1->Series[Chart1->SeriesCount() - 1]->SeriesColor = (TColor)fMenu->Auxiliar->FieldByName("Color")->AsInteger; break; } } for (int nCol = 1; nCol < Evolucion->Columns->Count; nCol ++) Chart1->Series[Chart1->SeriesCount() - 1]->Add(StrToIntDef(StringReplace(Evolucion->Items->Item[nRow]->SubItems->Strings[nCol - 1], ".", "", oReplace), 0), StrToInt(Evolucion->Columns->Items[nCol]->Caption), (TColor)fMenu->Auxiliar->FieldByName("Color")->AsInteger); } |
#11
|
||||
|
||||
En el select, si la suma es null puedes hacer que devuelva cero:
|
#12
|
||||
|
||||
Cita:
Si te fijas hay partidos que como no se presentaron en unos años no pueden tener resultados y haría falta que aparecieran aunque no tengan resultado. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Error al definir una FOREIGN KEY | Angel.Matilla | Firebird e Interbase | 21 | 12-04-2018 09:56:46 |
Definir impresora | Carliviris | Varios | 6 | 11-01-2008 03:12:17 |
definir campos de busqueda | fedelphi | Firebird e Interbase | 2 | 11-04-2007 21:46:51 |
Problemas al definir UDF (Funciones en una DLL) | pcicom | Firebird e Interbase | 2 | 21-06-2006 05:49:15 |
Definir Mis Propias Clases | jberaza | OOP | 1 | 27-09-2004 17:11:08 |
|