PDA

Ver la Versión Completa : Problemas con tchart


guitarrahugo
10-03-2012, 05:35:38
Hola amigos, me surgió el siguiente problema. Estoy ingresando resultados de análisis por fecha y los muestro en un tchart. Lo cierto, es que cuando yo voy ingresando los valores para un mes los puntos los grafica perfectos Ejemplo: ingreso el valor para el 01-02-2012 y luego el valor para el 22-02-2012, estos se grafican primero 01 y después el 22. Ahora bien, el problema está cuando cambio el mes, ingreso el 02-03 y lo que hace es grafica primero el 01-02 luego 02-03 y por último el 22-02. Yo necesito que siga el orden de las fechas primero 01-02 luego 22-02 y por ultimo 02-03. Bueno espero haber sido claro, desde ya agradezco su dedicación y paciencia.

ecfisa
10-03-2012, 16:24:43
Hola Hugo.

Sin ver el código es difícil saber que esta pasando, deberías poner al menos la parte donde ingresas los datos.

De todos modos hice un pequeño ejemplo que carga valores aleatorios por mes (días aleatorios) y los datos aparecen en el órden en que son ingresados:

...
var
i,x: Byte;
d,m: string;
begin
Series1.Clear;
Randomize;
for i:= 1 to 12 do
begin
x:= Random(31)+1;
d:= StringOfChar('0', 2-Length(IntToStr(x))) + IntToStr(x);
m:= StringOfChar('0', 2-Length(IntToStr(i))) + IntToStr(i);
Series1.Add(Random(100), d + '/' + m + '/2012');
end;
end;


Saludos.

guitarrahugo
10-03-2012, 16:35:33
Hola gracias por tu respuesta y por tu tiempo. Este es el código que carga los resultados y sus respectivas fechas de la base de datos. El tema es que me los ordena mal, y no me doy cuenta porque.

for I := 1 to NumeroResultados do
begin
nomen.RecordSetIndex:= i;
y := StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
x := StrToFloat(copy( (Nomen.field['fecha']),1,5));
titulo:= copy( (Nomen.field['fecha']),1,5);

if strToInt(Nomen.field['ANULADO'])= 1 then
begin
Series5.AddBubble(x,y,0.2,titulo); //grafica punto anulado
PuntoAnulado := PuntoAnulado + 1
end
else begin
Series1.AddBubble(x,y,0.2,titulo);
CantResultados := CantResultados + 1;
SumaResultados := SumaResultados + StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
ValordeAnalisis[i]:= StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
end;


if GraficaHasta < StrToInt(copy( (Nomen.field['fecha']),1,2)) + 2 then
GraficaHasta := StrToInt(copy( (Nomen.field['fecha']),1,2)) + 2;

end;

ecfisa
11-03-2012, 03:57:14
Hola Hugo.

Estuve revisando tu código y tengo bastantes dificultades con él por tener versiones más antiguas, hay métodos y propiedades que no dispongo para poder evaluarlo.

De todos modos, tengo baches para entender la lógica de muchas partes del código. Quizá ayudaría que nos comentaras que campos y de que tipo hay tu DataSet, así como también cuales, en que formato y bajo que condiciones queres mostrarlos en el TChart.

Un saludo.

guitarrahugo
11-03-2012, 18:01:17
Hola ecfisa gracias por tu respuesta.
Los campos que tengo que mostrar son básicamente dos. Resultados, que es de tipo float y fecha que es de tipo string (este lo fuerzo a float o int después por que es el tipo de datos que espera la serie para poder graficar el eje x). Con respecto al formato, seria sobre el eje Y voy a mostrar los valores del resultado ejemplo: 2.6 y en el eje X los días ejemplo: 01-03. Ahí debería graficar el punto.
Pero esto no es el problema, sino es que los ordena mal, no respeta los meses. Junta 01-01 con 03-02 y luego grafica 22-01. Probé ver si en las propiedades del grafico había algún orden automático que estuviera molestando, pero no veo nada fuera de lo común.
Intente también subirles una imagen del grafico para que lo puedan ver, pero no me deja, dice que aun no tengo permisos para subir imágenes ni link en el foro.
Espero ser claro, y desde ya agradezco la intención de ustedes en ayudarme y su tiempo. Gracias.

ecfisa
11-03-2012, 19:58:07
Hola Hugo.

De acuerdo a lo que pude entender, te hice un ejemplo muy reducido considerando sólamente el aspecto fecha/resultado. En el mismo supongo el formato de la fecha almacenada como 'dd/mm/yyyy', ej: '01/01/2012'. Esto último es esencial al momento de elegir como extraer el día, mes o año con la función Copy.


procedure TForm1.Button1Click(Sender: TObject);
var
x, y: Double;
AXLabel: string;
begin
with DataSet do
begin
First;
while not Eof do
begin
x:= StrToFloat(Copy(FieldByName('FECHA').AsString, 4, 2)+ // mes (--/mm/----)
Copy(FieldByName('FECHA').AsString,1,2)); // día (dd/--/----)
y:= FieldByName('RESULTADO').AsFloat;
if FieldByName('ANULADO').AsInteger = 1 then
Series2.AddBubble(x, y, 1, Copy(FieldByName('FECHA').AsString,1,5), clRed) // se muestra: dd/mm
else
Series1.AddBubble(x, y, 1, Copy(FieldByName('FECHA').AsString,1,5), clLime); // se muestra: dd/mm
Next;
end;
end;
end;

El quid para ordenar las fechas almacenadas como cadena, es invertirla como hago arriba en la obtención del valor de x. De otro modo y ejemplificando, la fecha '31/03/2000' es mayor que '01/01/2144'... Espero te sea de ayuda.

Saludos.

guitarrahugo
11-03-2012, 20:39:55
Bien, funciono de maravilla. Muchas gracias. Había que invertir el día por le mes. Ahora lo ordena perfecto.
Aprovecho para preguntarte otra cosa sin abusar de tu buena voluntad.
Al mezclar fechas de 2 meses distintos ejemplo desde 22-02 hasta el 09-03 me agrupa del 22-02 hasta el 28-02 a la izquierda del grafico todo apretado y 01-03 hasta 09-03 a la derecha del grafico todo apretado, como que del 28 al 01 tendría que contar hasta el 99 para volver a empezar del 1 otra vez o algo así. La pregunta es ¿existe la posibilidad de decirle que llegado el numero 31 empiece a contar de 1 en el eje X?. De esta manera el punto del 28-02 quedaría al lado del punto del 01-03.

guitarrahugo
13-03-2012, 00:02:32
Tema solucionado, lo que había que hacer era convertir en date el eje X, de esta manera llega hasta el día 31 y agrupa de manera inmediata el día 1. Gracias por tu ayuda. Como dije antes, una vez más tema solucionado gracias al foro.Asi quedó el código.:)

for I := 1 to NumeroResultados do
begin
nomen.RecordSetIndex:= i;
y := StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
x := StrTodate(copy( (Nomen.field['fecha']),1,2)+'/'+ copy( (Nomen.field['fecha']),4,2));
titulo:= copy( (Nomen.field['fecha']),1,5);
if strToInt(Nomen.field['ANULADO'])= 1 then
begin
Series5.AddBubble(x,y,0.2,titulo,clRed); //grafica punto anulado
PuntoAnulado := PuntoAnulado + 1
end
else begin
Series1.AddBubble(x,y,0.2,titulo);
CantResultados := CantResultados + 1;
SumaResultados := SumaResultados + StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
ValordeAnalisis[i]:= StrToFloat(StringReplace(Nomen.field['RESULTADO'], '.',',',[rfReplaceAll]));
end;

//Le digo que trace la media a partir de la fecha mas alta que encontro entoces va a ir de 0 a 31 x ejemplo
if GraficaHasta < StrToInt(copy( (Nomen.field['fecha']),1,2)) then//+ copy( (Nomen.field['fecha']),1,2))+2 then
GraficaHasta := StrToInt(copy( (Nomen.field['fecha']),1,2)) + 2;

end;