以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]查询和统计结果结合图表的应用  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=69156)

--  作者:chnfo
--  发布时间:2015/5/31 20:25:00
--  [求助]查询和统计结果结合图表的应用
如附件所示,如何将交叉统计的结果生成图表。
例如将当期的值形成柱状图,同时将累计的值形成折线图?

查看了帮助,发现生成图表要绑定表的列值,但是交叉表的列不一样啊,咋个整法?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目28.foxdb


--  作者:大红袍
--  发布时间:2015/5/31 20:45:00
--  

 呃,首先,横坐标是什么,纵坐标是什么?

 

 而且,谁说一定要绑定列值? 看示例二

 

http://www.foxtable.com/help/topics/0968.htm

 

http://www.foxtable.com/help/topics/0970.htm

 


--  作者:chnfo
--  发布时间:2015/5/31 21:48:00
--  
图表会按照PID来过滤,即要么生成P1,要么生成P2,所以,我在里面加了个条件PID=‘P1’
然后是横坐标是per,纵坐标是V和累计的V值,要分Class类型。

问题是:
1、Per中没有=201403的值,为什么横坐标会自动插一个201403的值进来呢?
2、我是想V用柱状图,累计的V用折线图,也就是用双图来表示。
3、还有,这个图例看着很怪异,那个V_Up_1的“UP”让人看着很怪异,能不能显示为V_累计_1这样的呢?-----这个把Series.Text = c.name 改为Series.Text = c.caption就可以了 
[此贴子已经被作者于2015/5/31 22:51:08编辑过]

--  作者:chnfo
--  发布时间:2015/5/31 22:04:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目28.foxdb


--  作者:大红袍
--  发布时间:2015/5/31 23:10:00
--  

Dim DT As fxDataSource
Dim tbl As Table = e.Form.Controls("Table1").Table
Dim b As New SQLCrossTableBuilder("AA","D")
b.HGroups.AddDef("PID")
\'b.HGroups.AddDef("CID")
b.HGroups.AddDef("Per")
b.VGroups.AddDef("Class")
b.Totals.AddDef("V")
b.Totals.AddDef("V","累计",True) \'
b.Filter = "PID = \'P1\'"
Dt = b.BuildDataSource()
tbl.DataSource  = DT


Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
Chart.ChartType = ChartTypeEnum.Bar \'图表类型改为Bar(条形)
Chart.ChartType2 = ChartTypeEnum.XYPlot
Chart.DataSource = tbl.Name  \'设置绑定表
Chart.SeriesList.Clear() \'清除图表原来的图系
Chart.SeriesList2.Clear() \'清除图表原来的图系
For Each c As Col In tbl.Cols
    If c.Name <> "PID" And c.Name <> "CID" And  c.Name <> "Per" And  c.Name <> "Class" Then
        If c.Caption Like "*V*" Then
           
           
            Series = Chart.SeriesList.Add() \'增加一个图系
            Series.Text = c.Caption \'设置图系的标题
            Series.X.DataField = "Per" \'X轴绑定到产品列
            Series.Y.DataField = c.name \'设置Y轴的绑定列
        ElseIf c.Caption Like "*累计*" Then
           
            Series = Chart.SeriesList2.Add() \'给图表2增加一个图系
            Series.Text = c.Caption \'设置图系的标题
            Series.X.DataField = "Per" \'X轴绑定到产品列
            Series.Y.DataField = c.Name \'设置Y轴的绑定列
        End If
    End If
Next
Chart.VisualEffect = True \'加上这一行,让你的图表更漂亮
Chart.LegendVisible = True \'显示图列
Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端)


--  作者:chnfo
--  发布时间:2015/5/31 23:23:00
--  
理解了。关键点在这里
Chart.SeriesList.Clear() \'清除图表原来的图系
Chart.SeriesList2.Clear() \'清除图表原来的图系


1、Per中没有=201403的值,为什么横坐标会自动插一个201403的值进来呢?
----如果per的列类型为字符就没有问题,为什么是数字就不行?如何解决之?

--  作者:大红袍
--  发布时间:2015/6/1 9:29:00
--  
 回复6楼,方法1,把类型转成字符类型;方法2,不要绑定列的方式生成表,用代码一个一个赋值,看2楼
--  作者:chnfo
--  发布时间:2015/6/1 16:56:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目28.foxdb

红袍兄,参考了二楼做法,为什么绑定列就可以正常出图,写代码指定值不行呢?
--  作者:大红袍
--  发布时间:2015/6/1 17:12:00
--  

 要指定长度

 

Dim DT As fxDataSource
Dim tbl As Table = e.Form.Controls("Table1").Table
Dim b As New SQLCrossTableBuilder("AA","D")
b.HGroups.AddDef("PID")
\'b.HGroups.AddDef("CID")
b.HGroups.AddDef("Per")
b.VGroups.AddDef("Class")
b.Totals.AddDef("V","本期")
b.Totals.AddDef("V","累计",True) \'
b.Filter = "PID = \'P1\'"
Dt = b.BuildDataSource()
tbl.DataSource  = DT


Dim Chart As WinForm.Chart \'定义一个图表变量
Dim Series As WinForm.ChartSeries \'定义一个图系变量
Chart = e.Form.Controls("Chart1") \' 引用窗口中的图表
Chart.ChartType = ChartTypeEnum.Bar \'图表类型改为Bar(条形)
Chart.ChartType2 = ChartTypeEnum.XYPlot
Chart.DataSource = tbl.Name  \'设置绑定表
Chart.SeriesList.Clear() \'清除图表原来的图系
Chart.SeriesList2.Clear() \'清除图表原来的图系

For Each c As Col In tbl.Cols
    If c.Name <> "PID" And c.Name <> "CID" And  c.Name <> "Per" And  c.Name <> "Class" Then
        If c.Caption Like "*本期*" Then
            Series = Chart.SeriesList.Add() \'增加一个图系
        Else
            Series = Chart.SeriesList2.Add() \'给图表2增加一个图系
        End If
        Series.Text = c.caption \'设置图系的标题
        series.Length = tbl.Rows.Count
        For i As Integer = 0 To tbl.Rows.Count - 1
            series.x(i) = i
            series.y(i) = tbl.Rows(i)(c.Name)
            Chart.AxisX.SetValueLabel(i,tbl.Rows(i)("Per"))
        Next
        \'------------数据绑定列的做法
        \'Series.X.DataField = "Per" \'X轴绑定到产品列
        \'Series.Y.DataField = c.Name \'设置Y轴的绑定列
        \'--------------数据绑定列的做法结束
    End If
Next

Chart.AxisX.AnnoWithLabels = True
Chart.VisualEffect = True \'加上这一行,让你的图表更漂亮
Chart.LegendVisible = True \'显示图列
Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端)


--  作者:chnfo
--  发布时间:2015/6/2 16:46:00
--  
再请教,如何解决左侧切换行时图的横坐标的重叠问题?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:27.zip