Page 1 of 1

Date scaling TeeChart 5 Pro

Posted: Wed Jan 14, 2004 7:51 pm
by 6922017
We have a massive database over 100,000 that hold a Date and a value. Our problem is that we have periods of missing data for example I may have a 100 values every year from 1950 to 1960 then nothing again until 1980 and then continuously since then. When the graph is displayed the is equally dividing the data points rather than scaling the graph to show the data gap. What do we need to do to properly scale the graph in accordance to the date range we have selected to display? Thanks for your help.

Posted: Fri Jan 16, 2004 9:54 am
by Pep
Hi,

are you sure you are adding your datetime XValues to the chart as values and not labels ?

Posted: Fri Jan 16, 2004 12:53 pm
by 6922017
We are using this entry:

while not rst.eof
if isnull(rst("min")) or rst("min")=0 then
chart.series(0).addnull rst("date")
else
chart.Series(0).Add rst("min"), rst("date"),RGB(34,150,123)
end if

Chart.Series(0).XValues.DateTime = True


rst.movenext

Thanks
Jason

Posted: Mon Jan 19, 2004 11:53 am
by Pep
Hi Jason,

which series type are you using ?
Using a Line series I'm able to see the gaps where there are null values using your code with a database with datetime and integer fields.

Posted: Tue Jan 20, 2004 2:34 pm
by 6922017
We are using a line.

Here is the Code if that helps

<!--METADATA NAME="TeeChart Pro v5 ActiveX Control" TYPE="TypeLib" UUID="{B6C10482-FB89-11D4-93C9-006008A7EED4}"-->
<!-- #include fileconnect.inc" -->

<%
response.buffer=true


dim h, w


h=request("h")
w=request("w")

'test for emply values
if w=0 then
h=300
w=600
end if

ChartType=Request("Chart")
if ChartType="" then
ChartType=0
end if

Response.BinaryWrite(RunChart)

Function RunChart()

dim img
dim Chart
dim MyVar

'Create Chart
Set Chart = CreateObject("TeeChart.TChart")

'Setup Series
Chart.AddSeries(ChartType)
Chart.Series(0).Marks.Visible=False
Chart.Series(0).Color=vbYellow
'Chart.Series(0).HorizontalAxis=2
Chart.Series(0).Name="Level"
Chart.Series(0).XValues.DateTime = True

Chart.Walls.Left.Transparent=True
Chart.Walls.Left.Color=RGB(35,70,128)

if ChartType=1 then
'**** Bar Look Edit Area

'Chart.Series(0).asBar.BarWidth=5 'Flat Setting in Pixels
Chart.Series(0).asBar.BarWidthPercent=70 'Percent Setting in Pixels
Chart.Series(0).asBar.BarPen.Visible = true 'this hides the 1 pixle outline
Chart.Series(0).asBar.BarPen.Color = RGB(16,138,214) 'If line is visible this is the color setting

' RGB(34,150,123) MCD Green Color RGB(16,138,214) MCD Blue Color

'**** ----------------------- *******
end if

'Chart appearance
Chart.Legend.Visible=false
Chart.Axis.Bottom.Labels.Angle=(-90)
Chart.Height=h
Chart.Width=w
Chart.Panel.Gradient.Visible=True
Chart.Header.Text(0)="Goundwater Levels for " & Request("wellname") & " from " & request("datestart") & " to " & request("dateend")
Chart.Header.Font.Bold=True
Chart.Header.Font.Height=14

Chart.Axis.Bottom.Title.Caption="Collection Date"
Chart.Axis.Bottom.Title.Font.Bold=True
Chart.Axis.Left.Title.Font.Bold=True

Chart.Aspect.View3D=0





Chart.Panel.Gradient.StartColor= RGB(255,255,255)
Chart.Panel.Gradient.EndColor=RGB(255,255,255)
Chart.Axis.Left.Title.Caption="Groundwater Level"
Set RSt = Server.CreateObject("ADODB.RecordSet")



sql="SELECT MIN([GroundWater Elevation]) as MIN, [date], [TIME] FROM [GroundwaterLevel-Citizen-Based-Monitoring] WHERE UNID = '" & Request("wellname") & "' GROUP BY [Date], [TIME] HAVING [Date] BETWEEN'" & request("datestart") & "'AND'" & request("dateend") & "'" & _
" UNION SELECT MIN([GroundWater Elevation]) as MIN,[date], [TIME] FROM [GroundwaterLevel-MCD-Archived-Data] WHERE UNID ='" & Request("wellname") & "' GROUP BY [Date], [TIME] HAVING [Date] BETWEEN'" & request("datestart") & "'AND'" & request("dateend") & "'" & _
" UNION SELECT MIN([GroundWater Elevation]) as MIN,[date], [TIME] FROM [GroundwaterLevel-MCD-Groundwater-Levels] WHERE UNID ='" & Request("wellname") & "' GROUP BY [Date], [TIME] HAVING [Date] BETWEEN'" & request("datestart") & "'AND'" & request("dateend") & "'" & _
" UNION SELECT MIN([GroundWater Elevation]) as MIN,[date], [TIME] FROM [GroundwaterLevel-ODNR-Observation-Wells] WHERE UNID = '" & Request("wellname") & "' GROUP BY [Date], [TIME] HAVING [Date] BETWEEN'" & request("datestart") & "'AND'" & request("dateend") & "' ORDER BY [date], [Time]"


session("SQLIS") = sql

RSt.open sql,cn,1,1
showLow = 1000


while not rst.eof


if isnull(rst("min")) or rst("min")=0 then
chart.series(0).addnull rst("date")
else
Chart.Series(0).Add rst("min"), rst("date"),RGB(34,150,123)


showLow = rst("min")



end if

rst.movenext
wend


Dim TheMin, TheMax

TheMin = 1072.5 * .02

TheMax = 1077.19 * .02


Chart.Axis.Left.AutomaticMinimum = True


session("Testing") = "X:" & showLow & ":X"

'Cleanup and set Chart to send to browser
Rst.close
Set Rst=nothing
img=Chart.Export.Stream(stJpeg)

Set Chart=nothing
RunChart=img
end function


%>

Posted: Wed Jan 21, 2004 11:13 am
by Chris
Hi --

Rather than using:

Code: Select all

if isnull(rst("min")) or rst("min")=0 then 
chart.series(0).addnull rst("date") 
else 
Chart.Series(0).Add rst("min"), rst("date"),RGB(34,150,123)
have you tried using:

Code: Select all

if isnull(rst("min")) or rst("min")=0 then 
chart.series(0).addnullXY rst("date"), 0, ""
else 
Chart.Series(0).AddXY rst("min"), rst("date"),"",RGB(34,150,123)

Posted: Wed Jan 21, 2004 5:32 pm
by 6922017
That makes the graph change so it looks correct I think.... however the Data Left vertcal data is ranging from 37,500 to like 33,000 and what is not right is the data points only range from 626 to 608 and the date range 8/30/1901 to 9/17/1901 and the actual date range is 4/26/1990 to 9/1/2003 so something has caused the data and the date to mal form. I checked the SQL and it is fine bringing up the correct dates and values. Any suggestions?

Posted: Thu Jan 22, 2004 12:52 pm
by Chris
Hi --
I checked the SQL and it is fine bringing up the correct dates and values. Any suggestions?
Mmm .. the following code seems to work OK here:

Code: Select all

Private Sub Form_Load()
Dim i, count
With TChart1
    .AddSeries scLine
    For i = DateValue("4/26/1990") To DateValue("9/1/2003")
        count = count + 1
        .Series(0).AddXY count, i, "", clTeeColor
    Next i
    .Series(0).YValues.DateTime = True
End With
End Sub
This code is being run with Regional Options being set to US format.

Does this code work OK for you?

Posted: Thu Jan 22, 2004 1:44 pm
by 6922017
I found the problem

if isnull(rst("min")) or rst("min")=0 then ' there is a null value here, we should not show it

chart.series(0).addxy rst("date"),rst("min"),"",RGB(255,255,255)

else

chart.series(0).addxy rst("date"),rst("min"),"",RGB(34,150,123)
showLow = rst("min")
Lastdate = rst("date")

end if



This one works however it does not seem to creat a line break between missing data.

We creted a IF Then that works but I can not see to find how we can tell TeeChart to drop a Line connecting to records

If DateDiff("D", LastDate, rst("date")) > 30 then ' Detect if there is more than 30 dats since the last record

'Now wee need to sever the line from the previous record to this ne record

End if


If we can get this fixed then everything is ok Also we should be upgrading to 6 with support today so thnks for your help

Posted: Fri Jan 23, 2004 12:28 pm
by Chris
Hi --

Shouldn't this:

Code: Select all

if isnull(rst("min")) or rst("min")=0 then ' there is a null value here, we should not show it 

chart.series(0).addxy rst("date"),rst("min"),"",RGB(255,255,255) 
be using AddNullXY, e.g.

Code: Select all

if isnull(rst("min")) or rst("min")=0 then ' there is a null value here, we should not show it 

chart.series(0).addnullxy rst("date"),rst("min"),"" 
??

Posted: Fri Jan 23, 2004 1:33 pm
by 6922017
Thanks for you continued support with this. We had another coder fix the problem and here is our Solution .. hopefully this will help others



' FINDING THE FIRST DATA AND DATE
rst.movefirst
dim PreviousDate, PreviousLevel ' These variables hold the last date and observed Level
while isnull(rst("min")) or rst("min")=0 ' This loop finds the first valid date and Level at the query result
PreviousDate=rst("date")
PreviousLevel=rst("min")
rst.movenext
wend

' GRAPH STARTS HERE
while not rst.eof
if isnull(rst("min")) or rst("min")=0 then 'there is a date but not a valid rst("min")
chart.series(0).addxy rst("date"),PreviousLevel,"",RGB(255,255,255) ' draw it white
else
if DateDiff("d",PreviousDate,rst("date")) > 30 then ' date difference between sequential data is more than 30 days there must be a gap
chart.series(0).addxy (rst("date")-0.25),rst("min"),"",RGB(255,255,255) 'if there is a gap between dates, draw white line
chart.series(0).addxy (rst("date")+0.25),rst("min"),"",RGB(34,150,123) 'attached to the white line draw a line for half a day
else ' if dates come one after another draw the line
chart.series(0).addxy rst("date"),rst("min"),"",RGB(34,150,123) '
end if
PreviousLevel=rst("min") ' getting last observed Level
showLow = rst("min")
end if
PreviousDate=rst("date") ' getting last date
rst.movenext
wend