返回
中国计算机报1999年第35期

如何用Visual FoxPro实现图形统计报表

刘俊强 李冬梅

  本文介绍采用OLE技术,实现图形统计报表功能。

  VFP提供了一种称为“通用类型(General)”的字段,可以用于存储OLE对象的引用。而OLE绑定型控件则可以在表单(Form)或报表(Report)中,显示数据库表General字段对应的OLE对象的内容。在VFP的表单设计器和报表设计器中都可以使用OLE绑定型控件。


  图形统计报表的实现


  要实现图形统计报表,需要一个支持OLE的图形软件绘制图形。由于Microsoft Graph(以下简称MsGraph)支持OLE技术,并且支持的图表类型众多,因此,我们选用MsGraph进行图形的显示输出。

  MsGraph支持的图表类型主要有柱形图、条形图、折线图、饼图、XY(散点)图等等。MsGraph对各种图表类型都给出了相应的常量定义,如三维簇状柱形图(xl3DclumnClustered)、三维簇状条形图(xl3DbarClustered)、折线图(xlLine)、折线散点图(xlXYScatterLines)等等,在程序中需要确定图表类型时可方便地加以引用。

  MsGraph采用面向对象技术,对MsGraph对象提供了清晰的对象层次,用于程序中对图表的各个部分(如分类轴、数据轴、标题、图例等等)进行控制。利用MsGraph所提供的各个对象,可以通过程序对MsGraph图表对象的各个部分进行精细的控制,下面的例子列举了如何对MsGraph图表对象施加控制。

  为叙述方便,这里假设有一个需要统计的数据库表,名为Details,其中的两个字段定义如下:Date(日期型)和Value(数值型,假设为某一设备的电气参数,如绝缘电阻)。现在需要统计出该设备电气参数从某一年以来(nFirstYear)的历年变化趋势。另外定义了一个统计数据库表(名为Statistics),其中的一个字段定义为GraphRec,字段类型为General。

  将统计数据送入临时表中:

  Close Tables All

  Select Date,Value From Details Where Year(Date)>=nFirstYear;

   Order by Date Into Cursor MyTemp

  生成数据串:

  MsGraph可以根据字符串数据生成图形,但要求字符串数据具有表格型式(实际上字符串数据就是按这种格式填入MsGraph数据表中的),在本例中,字符串数据格式如下表所示:

    1990 1991 1999
绝缘电阻(mΩ) 123456.234 654321.432 654321.432


  实现代码为:

  Local lcData,lcYear

  Select MyTemp

  lcYear=′′

  lcData=′绝缘电阻(MΩ)′

  Scan

lcYear=lcYear+TAB+AllTrim(Str(Year(Date)))

  lcData=lcData+TAB+AllTrim(Str(Value,16,3))

  EndScan

  lcData=lcYear+CRLF+lcData

  Use

  数据串传递给MsGraph:

  Use Statistics

  Append Blank

  Append General GraphRec Data lcData Class ″MsGraph.Chart″

  Use


  修改图形类型


  上面生成的图形类型是MsGraph的默认类型,并不总是能满足要求,因此需要软件对它加以修改。本文的例子是将MsGraph的图表类型设置为折线散点图(xlXYScatterLines),并分别设置它的分类轴(xlCategory)与数值轴(xlValue)的标题与字体大小。方法如下:

  (1) 新建表单Form1,在上面放置OLE绑定型控件,名为Ole1,设置Ole1的ControlSource属性为Statistics.GraphRec。

  (2) 在Form1.Init方法程序中添加如下代码:

  #define xlXYScatterLines 74

  #define xlCategory 1

  #define xlValue 2

  #define xlTickLabelOrientationUpward -4171

  #define xlUpward -4171

  #define xlTickLabelOrientationHorizontal -4128

  If Not Used('Statistics')

Use Statistics

  EndIf

  Select Statistics

  Scan

ThisForm.Refresh

With This.Ole1

.hasTitle=.F. &&没有标题

.hasLegend=.F. &&没有图例

.chartType=xlXYScatterLines

With .Axes(xlValue) &&设置数值轴

.hasTitle=.T.

.AxisTitle.Caption=′绝缘电阻(MΩ)′

.AxisTitle.Font.size=9

.AxisTitle.Orientation=xlUpward

.TickLabels.Font.size=9

EndWith

With .Axes(xlCategory) &&设置分类轴

.hasTitle=.T.

.AxisTitle.Caption=′年份′

.AxisTitle.Font.size=9

.TickLabels.Font.size=9

.TickLabels.Orientation=;

  xlTickLabelOrientationHorizontal

EndWith

  EndScan

  (3) 已经完成对图形类型的设定,生成的图形如图1所示。
fox47_1.jpg (10693 字节)
    图1 上述代码生成图形的示意图

  (4) 以上步骤已经完成了图形的生成与图形类型的设定,并保存在Statistics表中的GraphRec字段中。要输出图形统计报表,只需在报表(数据环境设为Statistics.Dbf)相应位置放置一个图片/OLE绑定型控件,设置它的字段属性为Statistics.GraphRec即可。