Page 1 of 1

Function with time issue

Posted: Thu Jun 17, 2010 12:23 pm
by 10548769
Hi everyone.

I got a new issue and i would like to know if i'm getting this issue because i dont use teechart the right way i should. I found a really big issue with the function when i use a datetime for the X axis using psRange. It doesn't seems to calculate it correctly because i have 2 different chart (teeChart and Excel) and when i do check it manually, TeeChart doesnt do it right. When using add function, If i have some series with less data than the others, the fun begins. It seems it doesn nearly the same thing as if it were set to psNumPoint because it doesnt seem to care about my datetime but only the number of points.

I did add a screenshot that show how it goes. The teal series is the total (add function) and you can see easely that the slope doesnt follow the time line of the other series.
ss-add-issue.jpg
ScreenShot
ss-add-issue.jpg (489.08 KiB) Viewed 11925 times
I hope there is a simple answer to that because otherwise, i will have to do an other add function that work well with a datetime base.

* i forgot to tell you some stuff:
Series.SetFunction(TAddTeeFunction.Create(Chart))
Series.FunctionType.PeriodStyle := psRange
Series.FunctionType.Period := DateTimeStep[dtOneMinute];
Series.DataSources.Clear;
Looping for Series.DataSources.Add(SeriestoBeAdded)
Series.CheckDataSource;

D2010, TeeChart v8.06

Re: Function with time issue

Posted: Fri Jun 18, 2010 11:03 am
by yeray
Hi GoToXY,

I can't reproduce the problem with the following code:

Code: Select all

uses series, TeeFunci;

procedure TForm1.FormCreate(Sender: TObject);
var i, j: Integer;
    tmpdate: TDateTime;
begin
  Chart1.View3D:=false;

  for i:=0 to 1 do
  with Chart1.AddSeries(TFastLineSeries) do
  begin
    XValues.DateTime:=true;
    tmpdate:=Date;

    for j:=0 to 20 do
    begin
      if ((i = 0) and (j mod 10 > 5)) then
        AddXY(tmpdate + j, 10)
      else
        AddXY(tmpdate + j, 20);
    end;
  end;

  with Chart1.AddSeries(TFastLineSeries) do
  begin
    SetFunction(TAddTeeFunction.Create(self));
    FunctionType.PeriodStyle:=psRange;
    FunctionType.Period:=DateTimeStep[dtOneMinute];
    DataSources.Add(Chart1[0]);
    DataSources.Add(Chart1[1]);
  end;
end;
Do you see any important step that I could miss trying to reproduce the problem?
Please, modify the code above so we can run it as-is to reproduce the problem here (or send us a simple example project)

Re: Function with time issue

Posted: Fri Jun 18, 2010 12:14 pm
by 10548769
Hi YEray,

First i think you need more data than what you use otherwise it is hard to see the error.

You used days not minute in your example. adding 1 to a date will add a day, we have to work on minutes to see it (maybe we can see it too in days, be as we are using dtOneMinute, it would appear to be more realistic to use minute)

I will try to make a simple application to show you what i mean.

Re: Function with time issue

Posted: Fri Jun 18, 2010 12:49 pm
by 10548769
Ok, i found a way to show you the error and im pretty sure you gonna be very surprise with the result.

Here a Screenshot of the sample application
ss-add-issue2.jpg
screenshot
ss-add-issue2.jpg (124.87 KiB) Viewed 11841 times
As you can see, logically, add those lines would result in a straight Line with no stairs starting from 500. but what we are getting is how it add stuff in the wrong way.

I think we will have this issue with all the function so far, because it seems to be a DateTime baseline issue.

Re: Function with time issue

Posted: Mon Jun 21, 2010 9:16 am
by yeray
Hi GoToXY,

You are right. I think that the functions don't support sources with different increments in X. I've added it to the defect list to be fixed in future releases (TV52014986).
Thanks for reporting it.

Re: Function with time issue

Posted: Tue Jun 22, 2010 7:15 pm
by 10548769
Yeray wrote:Hi GoToXY,

You are right. I think that the functions don't support sources with different increments in X. I've added it to the defect list to be fixed in future releases (TV52014986).
Thanks for reporting it.
Any date on the next update because that kind of error really put us in a bad position toward our customer.I can't use any of the function in TChart because of that issue and to be honest with you, without that, TChart is becoming very useless for us.

Thanks again Yeray

Re: Function with time issue

Posted: Wed Jun 23, 2010 11:48 am
by yeray
Hi GoToXY,

Investigating this a little bit more, we've seen that this would be the expected result, similar to the discussed here and here.

The problem is that these calculations need their sources to have the same number of X values so they can be done correclty.
Here you have an example similar to yours and the workaround that consists on adding null points where a series hasn't a value but the other has:

Code: Select all

uses Series, TeeFunci, Math;

procedure TForm1.FormCreate(Sender: TObject);
Var i: Integer;
begin
  Chart1.View3D:=false;

  For i := 0 To 2 Do
  begin
    Chart1.AddSeries(TLineSeries);
    (Chart1[i] as TLineSeries).Pointer.Visible:=true;
  end;

  Chart1[2].Color := clRed;
  Chart1[2].SetFunction(TAddTeeFunction.Create(Chart1));

  For i := 0 To 1 Do
    Chart1[2].DataSources.Add(Chart1[i]);

  CheckBox1Click(self);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
Var i,j,MaxCount: Integer;
begin
  For i:=0 To 1 Do
    Chart1[i].Clear;

  if CheckBox1.Checked then
  begin
    Chart1[0].AddXY(0,5);
    Chart1[0].AddXY(2,5);
    Chart1[0].AddXY(1,5);

    Chart1[1].AddXY(0,10);
    Chart1[1].AddXY(5,10);
    Chart1[1].AddXY(10,10);

    //workaround
    i:=0;
    while i < Max(Chart1[0].Count, Chart1[1].Count) do
    begin
      if ((i >= Chart1[0].Count) or (Chart1[0].XValue[i] > Chart1[1].XValue[i])) then
        Chart1[0].AddNullXY(Chart1[1].XValue[i],0)
      else
        if ((i >= Chart1[1].Count) or (Chart1[0].XValue[i] < Chart1[1].XValue[i])) then
          Chart1[1].AddNullXY(Chart1[0].XValue[i],0);
      i:=i+1;
    end;

    Chart1[0].XValues.Order:=loAscending;
    Chart1[1].XValues.Order:=loAscending;
    (Chart1[0] as TLineSeries).TreatNulls:=tnSkip;
    (Chart1[1] as TLineSeries).TreatNulls:=tnSkip;
    //end workaround
  end
  else
  begin
    Chart1[0].Add(5);
    Chart1[0].Add(5);
    Chart1[0].Add(5);
    Chart1[1].Add(10);
    Chart1[1].Add(10);
    Chart1[1].Add(10);
  end;

  Chart1[2].CheckDataSource;
end;

Re: Function with time issue

Posted: Thu Aug 26, 2010 6:53 pm
by 10548769
Sorry, i havent seen you had reply on this one. I did try the "workAround" but no, it doesnt work at all. i got lots of points that goes to 1899-12-30 (wierd because the AddNullXY(TheDate,0)

with the copy of the workaround
addfncbug1.jpg
addfncbug1.jpg (120.06 KiB) Viewed 11783 times

Re: Function with time issue

Posted: Thu Aug 26, 2010 7:24 pm
by 10548769
Ok, i did managed to solve the null date by doing

Code: Select all

while i < Max(Chart1[0].Count, Chart1[1].Count)-1 do
This is what i got
addfncbug3.jpg
addfncbug3.jpg (182.9 KiB) Viewed 11741 times
As you can see, It is very a theorical workaround and not a practical one. I did others test and the best i could get so far is this
addfncbug4.jpg
addfncbug4.jpg (123.24 KiB) Viewed 11745 times

To get that line i had to change the workaround by changing the Y= value 0 in the addNullXY to the nearest old value of the adding series

Code: Select all

   //workaround
    i:=0;
    while i < Max(Chart1[0].Count, Chart1[1].Count)-1 do
    begin
      if ((i >= Chart1[0].Count) or (Chart1[0].XValue[i] > Chart1[1].XValue[i])) then
        Chart1[0].AddNullXY(Chart1[1].XValue[i],Chart1[0].YValues[i-1])
      else
        if ((i >= Chart1[1].Count) or (Chart1[0].XValue[i] < Chart1[1].XValue[i])) then
          Chart1[1].AddNullXY(Chart1[0].XValue[i],Chart1[1].YValues[i-1]);
      i:=i+1;
    end;

    Chart1[0].XValues.Order:=loAscending;
    Chart1[1].XValues.Order:=loAscending;
    (Chart1[0] as TLineSeries).TreatNulls:=tnSkip;
    (Chart1[1] as TLineSeries).TreatNulls:=tnSkip;
    //end workaround
If you come across a beter idea, please let me know.

Re: Function with time issue

Posted: Fri Aug 27, 2010 4:09 pm
by yeray
Hi GoToXY,

That's right, if you want your function to consider the "missing points" to have the value on the line, another option could be calculating the interpolation point instead of using the last YValue.
Take a look at the demo at All features\Welcome!\Chart Styles\Standard\Line (Strip)\Interpolating Line series

Re: Function with time issue

Posted: Fri Aug 27, 2010 5:21 pm
by 10548769
Yes, i did it 1 hour ago, just havent got the time to paste my code here tho. Oh i didnt know you guys already had done those thing in the demo. Anyway, everything is working fine now.

Thanks again for your support!