Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con tchart (https://www.clubdelphi.com/foros/showthread.php?t=77984)

guitarrahugo 10-03-2012 05:35:38

Problemas con tchart
 
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:
Código Delphi [-]
...
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.
Código Delphi [-]
       
      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.

Código Delphi [-]
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.:)

Código Delphi [-]
             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;


La franja horaria es GMT +2. Ahora son las 16:04:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi