www.gusucode.com > 运动用品商城网站系统源代码程序 > stat/inc_class_DrawPieGraph.asp

    <%

'this is to be included within a page to draw out pie graphs
	

'****************************************************************************************************************************	
'	
'	Author:		Mark Baekdal 23 September 2002
'
'	DrawPieGraph
'
'	Funnily enough DrawPieGraph does just that. It draws a Pie graph.
'	
'	Public Properties:		Please note that all properties are set defaults when the class is initialized.
'
'				Diameter					read/write int
'					Diameter is not strictly the diameter of the circle increasing this exponatially increases the
'					size of the circle.
'						
'				Shadow						read/write boolean
'					Draws a nice little shadow with your pie.
'
'				Title						read/write string
'					Set this to title your graph. You can also include html formating if desired. ie: <font size=5>
'
'				ShowLegend					read/write boolean
'					Set this to false if you don't want to display the legend.
'
'				LegendSize					read/write int
'					This sets the size of the images used for the legend. Personally I like 10.
'
'				HTMLinnerTableDef			read/write string
'					Set this to change the display of the graph.
'
'				HTMLouterTableDef			read/write string
'					Set this to change the display of the graph.
'
'				ShowValues					read/write boolean
'					Set this to false if you don't want to display the values.
'
'				FormatValuesAsCurrency		read/write boolean
'					Set this to format the value as n.nn
'
'				FontDef						read/write string
'					Set this to change the display of the legend characters.
'					
'	Public Methods:
'				AddValue				
'						Parameters
'									value: the value which will be converted to a percentage of the overall total
'											to display a segment of the pie graph.
'									label: a title/description of the value.
'									color: the color to use for this segment. Must be in hex format ie:#00ffdd etc
'						
'						call AddValue for all the different segments that you want to display.
'
'				DeleteAllAddedValues
'						Parameters	none
'
'						call DeleteAllAddedValues to delete all the values previously added. This is useful if you
'						are drawing multiple pie graphs, so you can use the one object to do them all. 
'
'				Draw
'						Parameters	none
'
'						call Draw to draw out the graph.
'
'****************************************************************************************************************************	

class DrawPieGraph

	private pvDiameter
	private pvShadow
	private pvTitle
	private rsPieGraphValues
	private pvShowLegend
	private pvLegendSize
	private pvHTMLinnerTableDef
	private pvHTMLouterTableDef
	private pvShowValues
	private pvFormatValuesAsCurrency
	private pvFontDef
	
	'----------------------------------------------------------------------------------------------------------------------

	private function ReturnRecordset

		dim rs
		
		set rs = CreateObject("ADODB.Recordset")
		'value fld is currency data type (6)
		rs.Fields.append "value",6
		'label fld is varchar type (200), length is 50 chars long max
		rs.Fields.append "label",200,50
		'color fld is varchar type (200), length is 20 chars long, must be hex value
		rs.Fields.append "color",200,20
		'open the rs ready for adding records
		rs.Open 
		
		set ReturnRecordset = rs
	end function

	'----------------------------------------------------------------------------------------------------------------------
	
	private function ReturnValueWithFontTags(value)
		ReturnValueWithFontTags = pvFontDef & value & "</font>"
	end function

	'----------------------------------------------------------------------------------------------------------------------
	
	private sub Class_Initialize

		set rsPieGraphValues = ReturnRecordset
				
		pvDiameter = 100
	
		pvShadow = true

		pvTitle = ""
		
		pvShowLegend = true
		
		pvLegendSize = 20
		
		pvHTMLinnertableDef = "<table cols=""2"" border=1>"
		
		pvHTMLouterTableDef = "<table cellpadding=""12"" style=""border: 2px outset;"">"
		
		pvShowValues = true
		
		pvFormatValuesAsCurrency = false
		
		pvFontDef = "<font size=2>"
		
	end sub

	'----------------------------------------------------------------------------------------------------------------------
	
	'the diameter of the circle, integer
	public property let Diameter(value)
		pvDiameter=cint(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get Diameter
		Diameter=pvDiameter
	end property

	'----------------------------------------------------------------------------------------------------------------------
	'the shadow true/false
	public property let Shadow(value)
		pvShadow=cbool(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get Shadow
		Shadow=pvShadow
	end property

	'----------------------------------------------------------------------------------------------------------------------
	'the title - string value
	public property let Title(value)
		pvTitle=cstr(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get Title
		Title=pvTitle
	end property
	
	'----------------------------------------------------------------------------------------------------------------------
	'draw out the legend
	public property let ShowLegend(value)
		pvShowLegend=cbool(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get ShowLegend
		ShowLegend=pvShowLegend
	end property
	
	'----------------------------------------------------------------------------------------------------------------------
	'the legend size
	public property let LegendSize(value)
		pvLegendSize=cstr(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get LegendSize
		LegendSize=pvLegendSize
	end property
	
	'----------------------------------------------------------------------------------------------------------------------
	'table definition for inner table to allow customisation
	public property let HTMLinnerTableDef(value)
		pvHTMLinnertableDef=cstr(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get HTMLinnerTableDef
		HTMLinnerTableDef=pvHTMLinnertableDef
	end property
		
	'----------------------------------------------------------------------------------------------------------------------
	'table definition for inner table to allow customisation
	public property let HTMLouterTableDef(value)
		pvHTMLouterTableDef=cstr(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get HTMLouterTableDef
		HTMLouterTableDef=pvHTMLouterTableDef
	end property

	'----------------------------------------------------------------------------------------------------------------------
	'show the values or not
	public property let ShowValues(value)
		pvShowValues=cbool(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get ShowValues
		ShowValues=pvShowValues
	end property
	
	'----------------------------------------------------------------------------------------------------------------------
	'the size of the font for the value display
	public property let FontDef(value)
		pvFontDef=cstr(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get FontDef
		FontDef=pvFontDef
	end property
	

	'----------------------------------------------------------------------------------------------------------------------
	'format the values as currency or not
	public property let FormatValuesAsCurrency(value)
		pvFormatValuesAsCurrency=cbool(value)
	end property
	'----------------------------------------------------------------------------------------------------------------------
	public property get FormatValuesAsCurrency
		FormatValuesAsCurrency=pvFormatValuesAsCurrency
	end property
	

	'----------------------------------------------------------------------------------------------------------------------
	'add the values for the different segments of the pie chart
	public sub AddValue(value,label,color)
		with rsPieGraphValues
			.AddNew
			.Fields("value") = value
			.Fields("label") = label
			.Fields("color") = color
			.Update  
		end with
	end sub
	'----------------------------------------------------------------------------------------------------------------------
	
	public sub DeleteAllAddedValues
		set rsPieGraphValues = nothing
		set rsPieGraphValues = ReturnRecordset
	end sub
	
	'----------------------------------------------------------------------------------------------------------------------
	'draw the actual graph
	public sub Draw
		
		Dim startPoint, endPoint, sumOfValues, percentage, i
		Dim strTitle, magicNumber
		dim Height, Width
	
		if rsPieGraphValues.EOF and rsPieGraphValues.BOF then exit sub
		
		magicNumber = 23592960	' It's mystical, magical, kinda nutty even
		startPoint = 5850000	' this setting is approximately 12:00 noon
		strTitle=pvTitle
		
		'height to width ratio is h:w = 0.75:1
		'we work out the height and width from the diameter given
		'the formula is diameter=100 therefore height=375pt; width=500pt
		Height = round(pvDiameter * 3.75,0)
		Width  = round(pvDiameter * 5,0)
		
		with response
		
		' GET SUM OF VALUES ****************
		rsPieGraphValues.MoveFirst 
		do while not rsPieGraphValues.EOF 
			sumOfValues = sumOfValues + rsPieGraphValues("value").Value 
			rsPieGraphValues.MoveNext 
		loop
		if sumOfValues=0 then exit sub
		
		' VML tags ***********************************
		.Write "<xml:namespace prefix=""v""/>"
		.Write "<object id=""VMLRender"" classid=""CLSID:10072CEC-8CC1-11D1-986E-00A0C955B42E"" width=""0"" height=""0""></object>"
		.Write "<style> v\:* {behavior=url(#VMLRender)}</style>"
		' ********************************************
		
		' ********************************************
		' Start Outer Table //
		.Write pvHTMLouterTableDef & vbCrLf 
		.Write "<tr>" & vbCrLf 
		.Write "<td>" & vbCrLf 
		' ********************************************
		
		' ********************************************
		' Start Inner Table //
		.Write pvHTMLinnertableDef & vbCrLf
		if pvTitle<>"" then
			.Write "<tr align=""center"" >" & vbCrLf
			' Create Title //
			if pvShowLegend then
				.Write "<td colspan=""2""><b>" & strTitle & "</b><br><br></td>" & vbCrLf
			else
				.Write "<td><b>" & strTitle & "</b><br><br></td>" & vbCrLf
			end if
			.Write "</tr>" & vbCrLf
		end if
		' ********************************************
		
		' Start Building Pie //
		.Write "<tr>" & vbCrLf
		.Write "<td>" & vbCrLf
		'VML tags
		.Write "<div style=""margin-top=0pt"">" & vbCrLf
		.Write "<v:group style=""height=" & Height & "pt; width=" & Width & "pt"" coordsize=""4320,3240"">" & vbCrLf
		
		

		' BUILD THE SHADOW ***************
		if pvShadow then
			.Write("<v:shape style='position:relative; width:4320; height:3240' fillcolor=#C0C0C0 path=""M 790 760 AE 790 760 707 707 " & startPoint & " " & magicNumber & " X E"">" & vbCrLf)
			.Write("<v:stroke on=""False""/>" & vbCrLf)
			.Write("</v:shape>" & vbCrLf)
		end if

		' BUILD THE PIE ********************
		rsPieGraphValues.MoveFirst 
		do while not rsPieGraphValues.EOF 
			percentage = FormatNumber(rsPieGraphValues("value").Value / sumOfValues, 3)
			endPoint = magicNumber * percentage
			endPoint = FormatNumber(endPoint, 0)
			if IsNumeric(endPoint) then
			  endPoint = Fix(endPoint)
			else
			  endPoint=0
			end if
			.Write("<v:shape style='width:4320; height:3240' strokeweight=0.5pt fillcolor=" & rsPieGraphValues("color").Value & " path=""M 750 720 AE 750 720 707 707 " & startPoint & " " & endPoint & " X E""/>" & vbCrLf)
			startPoint = startPoint + endPoint
			rsPieGraphValues.MoveNext 
		loop

		' VML tag
		.Write("</v:group></div>" & vbCrLf)
		.Write("</td>" & vbCrLf)
		' End Build Pie ******************************


		' ********************************************
		' Start Legend Table //
		if pvShowLegend then
			.Write("</tr><tr><td>" & vbCrLf)
			.Write("<table bordercolor=""white"" border=""0"" cellpadding=""0"" cellspacing =""0"" align=""center"">" & vbCrLf)
	
			' Step 6)	BUILD THE LEGEND
			rsPieGraphValues.MoveFirst 
			do while not rsPieGraphValues.EOF 
				.Write("<tr height=""18"">" & vbCrLf)
				' Color //
				.Write "<td><img align=absmiddle src='style/images/touming.gif' border=1 width='" & pvLegendSize & "' height='" & pvLegendSize & "' style='background:" & rsPieGraphValues("color").Value & ";'/></td>"
				' Category	//
				.Write("<td>")
				.Write ReturnValueWithFontTags(rsPieGraphValues("label").Value)
				.Write("</td>" & vbCrLf)
				' Value or Percent //
				if pvShowValues then
					.Write("<td align=""right"">" & vbCrLf)
					if pvFormatValuesAsCurrency then
						.Write ReturnValueWithFontTags(formatnumber(rsPieGraphValues("value").Value,2,true,false,false)) & vbCrLf
					else
						.Write ReturnValueWithFontTags(rsPieGraphValues("value").Value) & vbCrLf
					end if
					.Write("</td>" & vbCrLf)
				end if
				.Write("</tr>" & vbCrLf)
				rsPieGraphValues.MoveNext 
			loop
				
			' End Legend Table ***************************
			.Write("</table>" & vbCrLf)
			.Write("</td>" & vbCrLf)
		end if
	
		' End Inner Table ****************************
		.Write("</tr>" & vbCrLf)
		.Write("</table>" & vbCrLf)
	
		' End Outer Table ****************************
		.Write("</td>" & vbCrLf)
		.Write("</tr>" & vbCrlf)
		.Write("</table>" & vbCrLf)
	
		end with
		
	end sub
	'----------------------------------------------------------------------------------------------------------------------
	
end class	
	
%>