精华内容
下载资源
问答
  • 摘要:因为公司一个项目需要动态生成图表,所以我就想到了OWC,一般我们都是把数据传送到客户端,然后利用客户浏览器的OWC Activex控件来显示图表,但是这样的缺点是需要在客户端部署这个dll。我这里演示的是在服务...

    摘要:因为公司一个项目需要动态生成图表,所以我就想到了OWC,一般我们都是把数据传送到客户端,然后利用客户浏览器的OWC Activex控件来显示图表,但是这样的缺点是需要在客户端部署这个dll。我这里演示的是在服务段生成图表图片,然后输出显示到浏览器后自动删除临时图片。我在对OWC构建报表的代码里做了很多详细的注释,几乎OWC常用的功能都涉及到了,也许能帮助你更多的了解一下OWC。示例中用的nwind.mdb数据库,如过你装了office或者vb6的话,在它们的安装目录里可以找到。这里有个技巧就是怎么用客户端的JS执行服务段的方法。我现在正在把这个示例移植到我正在开发的一个CRM系统上。

    %7B62B0EE7D-54CC-4D6C-8D4A-85928281637E%7D0.jpg

    代码:

     

    ExpandedBlockStart.gif<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
    ExpandedBlockStart.gif
    <%
    InBlock.gif
    '禁止浏览器缓存
    InBlock.gif
    Response.Buffer=true
    InBlock.gifResponse.Expires  
    =  0
    InBlock.gifResponse.ExpiresAbsolute     
    =     NewDate = DateAdd("d"1now())
    InBlock.gifResponse.AddHeader 
    "pragma","no-cache"
    InBlock.gif
    Response.AddHeader "cache-control","private"
    InBlock.gif
    Response.CacheControl="no-cache"
    InBlock.gif

    InBlock.gif
    '这是创建图表并生成临时图片的过程
    InBlock.gif
    sub CreateOwcChart
    InBlock.gif    
    '定义图表控件和数据源控件
    InBlock.gif
        Dim ChartSpace1,DataSourceControl1
    InBlock.gif    
    Set ChartSpace1 = server.CreateObject("OWC.Chart"
    InBlock.gif    
    Set DataSourceControl1 = server.CreateObject("OWC.DataSourceControl"
    InBlock.gif
    InBlock.gif    
    '为图表控件设置数据源控件
    InBlock.gif
        Dim rsd, chConstants
    InBlock.gif    
    Set chConstants = ChartSpace1.Constants    '创建一个允许脚本用户使用命名常量的对象
    InBlock.gif
        DataSourceControl1.ConnectionString = _
    InBlock.gif    
    "DRIVER={Microsoft Access Driver (*.mdb)}; " & _
    InBlock.gif    
    "DBQ="&server.mappath("nwind.mdb")
    InBlock.gif    
    Set rsd = DataSourceControl1.RecordsetDefs.AddNew( _
    InBlock.gif    
    "Select * from [Category Sales for 1995]"3)
    InBlock.gif    
    With ChartSpace1
    InBlock.gif        .Clear    
    '删除图表工作区的所有图表,并将所有格式恢复为默认值。
    InBlock.gif
            .Refresh    '刷新指定对象(重载源数据或重绘对象)。
    InBlock.gif
            .DataSource = DataSourceControl1    '设置图表控件的数据源控件
    InBlock.gif
            .DataMember = rsd.Name    '指定控件将从数据源请求获取的记录集名称
    InBlock.gif
        End With
    InBlock.gif
    InBlock.gif    
    '因为图表控件要显示两个图表,所以我们安排这两个图表水平排列
    InBlock.gif
        ChartSpace1.ChartLayout = chConstants.chChartLayoutHorizontal
    InBlock.gif
    InBlock.gif    
    '根据查询创建新的条形图
    InBlock.gif
        Dim oBarChart
    InBlock.gif    
    Set oBarChart = ChartSpace1.Charts.Add    '添加一个图表
    InBlock.gif
        With oBarChart
    InBlock.gif        
    '利用OWC常量指定新添加的图表为条形图,也可以选择ChartChartTypeEnum的其它枚举
    InBlock.gif
            .Type = chConstants.chChartTypeBarClustered
    InBlock.gif
    InBlock.gif        
    'SetData方法第一个参数ChartDimensionsEnum 常量,指定设置的数据维。
    InBlock.gif
            '第二个参数ChartSpecialDataSourcesEnum 常量,指定数据源类型
    InBlock.gif
            '最后一个参数指定提取数据源的数据范围,是可选的
    InBlock.gif
            .SetData chConstants.chDimCategories, 00    '设置用作分类的值        
    InBlock.gif
            .SetData chConstants.chDimValues, 01      '设置绘制图表的值
    InBlock.gif

    InBlock.gif        
    '设置底部坐标轴的一些信息
    InBlock.gif
            With .Axes(chConstants.chAxisPositionBottom)
    InBlock.gif            .NumberFormat 
    = "0"    '设置坐标轴刻度的数字格式为没有小数点的整数
    InBlock.gif
                .MajorUnit = 25000        '设置坐标轴的主要单位,就相当于间隔的大小
    InBlock.gif
                .HasMajorGridlines = False     '指定这个坐标轴没有网格线,因为是x轴嘛
    InBlock.gif
            End With
    InBlock.gif
    InBlock.gif        
    '改变条形块儿的颜色
    InBlock.gif
            'SeriesCollection返回的是图表控件上所有图表的集合,索引0就是指定
    InBlock.gif
            '第一个图表,就是刚刚新加的柱形图,interior表示图表的内部
    InBlock.gif
            .SeriesCollection(0).Interior.Color = RGB(1500150)
    InBlock.gif
    InBlock.gif        
    '改变绘图区域的背景色
    InBlock.gif
            'PlotArea返回表示图表的绘图区(绘制图表数据的区域)。
    InBlock.gif
            .PlotArea.Interior.Color = RGB(24024010)
    InBlock.gif    
    End With
    InBlock.gif
    InBlock.gif    
    '根据查询创建一个新的爆炸饼图
    InBlock.gif
        Dim oPieChart
    InBlock.gif    
    Set oPieChart = ChartSpace1.Charts.Add
    InBlock.gif    
    With oPieChart
    InBlock.gif        .Type 
    = chConstants.chChartTypePie    '指定新添加的图表为饼图
    InBlock.gif
            .SetData chConstants.chDimCategories, 00  '先设置类别数据域
    InBlock.gif
            .SetData chConstants.chDimValues, 01      '再设置数值数据域
    InBlock.gif
            '设置指定饼图或圆环图扇面的分离程度值,使用该属性可突出特定扇面
    InBlock.gif
            .SeriesCollection(0).Explosion = 20    
    InBlock.gif
    InBlock.gif        
    '创建一个图例并把它放在图表的下部分
    InBlock.gif
            .HasLegend = True    '指定饼形图有图例
    InBlock.gif
            .Legend.Position = chConstants.chLegendPositionBottom    '指定图例的位置为图表底部
    InBlock.gif

    InBlock.gif        
    '给图表添加标题
    InBlock.gif
            .HasTitle = True     '指定图表有标题
    InBlock.gif
            .Title.Caption = "1995年的销售记录"    '指定标题的标签
    InBlock.gif
            .Title.Font.Bold = True    '粗体
    InBlock.gif
            .Title.Font.Size = 11    '字体大小为11
    InBlock.gif

    InBlock.gif        
    '指定这个饼形图占据整个图表工作区的50%,
    InBlock.gif
            '若要使该属性生效,图表工作区中必须有多个图表
    InBlock.gif
            .WidthRatio = 50
    InBlock.gif
    InBlock.gif        
    '显示百分比标签
    InBlock.gif
            'DataLabelsCollection表示图表的数据标志,这里就是显示百分比的标签
    InBlock.gif
            With .SeriesCollection(0).DataLabelsCollection.Add
    InBlock.gif            .HasValue 
    = False    '因为并行图没有Y轴数据,所以把这个值设置成False
    InBlock.gif
                .HasPercentage = True    '指定数据标志当前显示其百分比值,该属性只适用于饼图、圆环图和堆积图
    InBlock.gif
                .Font.Size = 8    '设置数据标志字体为8象素
    InBlock.gif
                .Interior.Color = RGB(255255255)    '数据标志标签背景色为白色
    InBlock.gif
            End With
    InBlock.gif    
    End With
    InBlock.gif    
    InBlock.gif    
    '生成临时图片,并销毁OWC对象,不知道OWC会不会自动启用对象池
    InBlock.gif
        ChartSpace1.ExportPicture Server.MapPath(m_sFilePath), "gif",800,300
    InBlock.gif    
    Set ChartSpace1 = nothing
    InBlock.gif    
    Set DataSourceControl1= nothing
    InBlock.gif
    End Sub
    InBlock.gif
    InBlock.gif
    '这是删除临时文件的过程
    InBlock.gif
    sub delimg(imgname)
    InBlock.gif    
    Set fsoTemp = CreateObject("Scripting.FileSystemObject")
    InBlock.gif    fsoTemp.DeleteFile Server.MapPath(imgname), 
    True
    InBlock.gif    
    set fsoTemp = nothing
    InBlock.gif
    end sub
    InBlock.gif
    Function GetGuid
    InBlock.gif    
    Dim TypeLib,guid
    InBlock.gif    
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
    InBlock.gif    guid 
    = TypeLib.Guid
    InBlock.gif    GetGuid 
    = Left(guid,(Len(guid) - 2))
    InBlock.gif
    End Function
    InBlock.gif
    '定义临时图片名称
    InBlock.gif
    Dim  m_sFilePath 
    InBlock.gifm_sFilePath 
    = GetGuid & ".gif"
    InBlock.gif

    InBlock.gif
    '如果传递的delimg的查询字符串为true的话
    InBlock.gif'
    就执行delimg过程来删除临时图片
    InBlock.gif'
    因为当客户端的图片加载完后会利用xmlhttp
    InBlock.gif'
    发送一个delimg=true的查询字符串上来,这时候可以删除临时图片了
    InBlock.gif
    if request("delimg"<>""  then
    InBlock.gif    delimg(
    trim(request("delimg")))
    InBlock.gif
    else
    InBlock.gif    CreateOwcChart
    ExpandedBlockEnd.gif
    end if
    None.gif
    %>
    None.gif
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    None.gif
    <HTML>
    None.gif
    <HEAD>
    None.gif
    <TITLE> owc图表 </TITLE>
    ExpandedBlockStart.gif
    <SCRIPT LANGUAGE="JavaScript">
    InBlock.gif
    <!--
    InBlock.gif
    function delimg(imgsrc)
    ExpandedSubBlockStart.gif
    {
    ExpandedSubBlockStart.gif    imgsrc 
    = imgsrc.replace(/(.*)({.*})/g,"$2")
    InBlock.gif    
    var Http = new ActiveXObject("Microsoft.XMLHTTP");
    InBlock.gif    
    var url = window.location + "?delimg=" + imgsrc;
    InBlock.gif    Http.open(
    "GET",url,false);
    InBlock.gif    Http.send()
    ExpandedSubBlockEnd.gif}

    ExpandedBlockEnd.gif
    //-->
    None.gif
    </SCRIPT>
    None.gif
    </HEAD>
    None.gif
    <BODY>
    None.gif
    <img src="<%= m_sFilePath %>" onload="delimg(this.src)">
    None.gif
    </BODY>
    None.gif
    </HTML>


    小结:关于更多的OWC的介绍就不写了,如果安装了office的话,搜索一下office的目录会找到OWC手册的,其实网上流行的好多OWC显示的图表的方案,有的是在一个目录里生成临时图片,然后在session_end里删除这些图片,但是session_end触发的时间不确定,也不可靠。而有的是生成临时图片后把图片加载到一个内存流里,然后把流以gif方式输出,随后删除临时图片。总之都是为了及时删除临时图片,我这个用的是xmlhttp执行服务器方法来达到同样目的的,代码很少,而且也很方便。

    展开全文
  • 利用OWC创建图表的完美解决方案[ZT]

    千次阅读 2007-05-23 10:43:00
    利用OWC创建图表的完美解决方案 来自:蛙蛙池塘 http://onlytiancai.cnblogs.com/archive/2005/08/24/221761.aspx摘要:因为公司一个项目需要动态生成图表,所以我就想到了OWC,一般我们都是把数据传送到客户端,...
    利用OWC创建图表的完美解决方案
    来自:蛙蛙池塘  http://onlytiancai.cnblogs.com/archive/2005/08/24/221761.aspx

    摘要:因为公司一个项目需要动态生成图表,所以我就想到了OWC,一般我们都是把数据传送到客户端,然后利用客户浏览器的OWC Activex控件来显示图表,但是这样的缺点是需要在客户端部署这个dll。我这里演示的是在服务段生成图表图片,然后输出显示到浏览器后自动删除临时图片。我在对OWC构建报表的代码里做了很多详细的注释,几乎OWC常用的功能都涉及到了,也许能帮助你更多的了解一下OWC。示例中用的nwind.mdb数据库,如过你装了office或者vb6的话,在它们的安装目录里可以找到。这里有个技巧就是怎么用客户端的JS执行服务段的方法。我现在正在把这个示例移植到我正在开发的一个CRM系统上。

    代码:

     

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
    <%
    '禁止浏览器缓存
    Response.Buffer=true
    Response.Expires  
    =  0
    Response.ExpiresAbsolute     
    =     NewDate = DateAdd("d"1now())
    Response.AddHeader 
    "pragma","no-cache"
    Response.AddHeader "cache-control","private"
    Response.CacheControl="no-cache"

    '这是创建图表并生成临时图片的过程
    sub CreateOwcChart
        
    '定义图表控件和数据源控件
        Dim ChartSpace1,DataSourceControl1
        
    Set ChartSpace1 = server.CreateObject("OWC.Chart"
        
    Set DataSourceControl1 = server.CreateObject("OWC.DataSourceControl"

        
    '为图表控件设置数据源控件
        Dim rsd, chConstants
        
    Set chConstants = ChartSpace1.Constants    '创建一个允许脚本用户使用命名常量的对象
        DataSourceControl1.ConnectionString = _
        
    "DRIVER={Microsoft Access Driver (*.mdb)}; " & _
        
    "DBQ="&server.mappath("nwind.mdb")
        
    Set rsd = DataSourceControl1.RecordsetDefs.AddNew( _
        
    "Select * from [Category Sales for 1995]"3)
        
    With ChartSpace1
            .Clear    
    '删除图表工作区的所有图表,并将所有格式恢复为默认值。
            .Refresh    '刷新指定对象(重载源数据或重绘对象)。
            .DataSource = DataSourceControl1    '设置图表控件的数据源控件
            .DataMember = rsd.Name    '指定控件将从数据源请求获取的记录集名称
        End With

        
    '因为图表控件要显示两个图表,所以我们安排这两个图表水平排列
        ChartSpace1.ChartLayout = chConstants.chChartLayoutHorizontal

        
    '根据查询创建新的条形图
        Dim oBarChart
        
    Set oBarChart = ChartSpace1.Charts.Add    '添加一个图表
        With oBarChart
            
    '利用OWC常量指定新添加的图表为条形图,也可以选择ChartChartTypeEnum的其它枚举
            .Type = chConstants.chChartTypeBarClustered

            
    'SetData方法第一个参数ChartDimensionsEnum 常量,指定设置的数据维。
            '第二个参数ChartSpecialDataSourcesEnum 常量,指定数据源类型
            '最后一个参数指定提取数据源的数据范围,是可选的
            .SetData chConstants.chDimCategories, 00    '设置用作分类的值        
            .SetData chConstants.chDimValues, 01      '设置绘制图表的值

            
    '设置底部坐标轴的一些信息
            With .Axes(chConstants.chAxisPositionBottom)
                .NumberFormat 
    = "0"    '设置坐标轴刻度的数字格式为没有小数点的整数
                .MajorUnit = 25000        '设置坐标轴的主要单位,就相当于间隔的大小
                .HasMajorGridlines = False     '指定这个坐标轴没有网格线,因为是x轴嘛
            End With

            
    '改变条形块儿的颜色
            'SeriesCollection返回的是图表控件上所有图表的集合,索引0就是指定
            '第一个图表,就是刚刚新加的柱形图,interior表示图表的内部
            .SeriesCollection(0).Interior.Color = RGB(1500150)

            
    '改变绘图区域的背景色
            'PlotArea返回表示图表的绘图区(绘制图表数据的区域)。
            .PlotArea.Interior.Color = RGB(24024010)
        
    End With

        
    '根据查询创建一个新的爆炸饼图
        Dim oPieChart
        
    Set oPieChart = ChartSpace1.Charts.Add
        
    With oPieChart
            .Type 
    = chConstants.chChartTypePie    '指定新添加的图表为饼图
            .SetData chConstants.chDimCategories, 00  '先设置类别数据域
            .SetData chConstants.chDimValues, 01      '再设置数值数据域
            '设置指定饼图或圆环图扇面的分离程度值,使用该属性可突出特定扇面
            .SeriesCollection(0).Explosion = 20    

            
    '创建一个图例并把它放在图表的下部分
            .HasLegend = True    '指定饼形图有图例
            .Legend.Position = chConstants.chLegendPositionBottom    '指定图例的位置为图表底部

            
    '给图表添加标题
            .HasTitle = True     '指定图表有标题
            .Title.Caption = "1995年的销售记录"    '指定标题的标签
            .Title.Font.Bold = True    '粗体
            .Title.Font.Size = 11    '字体大小为11

            
    '指定这个饼形图占据整个图表工作区的50%,
            '若要使该属性生效,图表工作区中必须有多个图表
            .WidthRatio = 50

            
    '显示百分比标签
            'DataLabelsCollection表示图表的数据标志,这里就是显示百分比的标签
            With .SeriesCollection(0).DataLabelsCollection.Add
                .HasValue 
    = False    '因为并行图没有Y轴数据,所以把这个值设置成False
                .HasPercentage = True    '指定数据标志当前显示其百分比值,该属性只适用于饼图、圆环图和堆积图
                .Font.Size = 8    '设置数据标志字体为8象素
                .Interior.Color = RGB(255255255)    '数据标志标签背景色为白色
            End With
        
    End With
        
        
    '生成临时图片,并销毁OWC对象,不知道OWC会不会自动启用对象池
        ChartSpace1.ExportPicture Server.MapPath(m_sFilePath), "gif",800,300
        
    Set ChartSpace1 = nothing
        
    Set DataSourceControl1= nothing
    End Sub

    '这是删除临时文件的过程
    sub delimg(imgname)
        
    Set fsoTemp = CreateObject("Scripting.FileSystemObject")
        fsoTemp.DeleteFile Server.MapPath(imgname), 
    True
        
    set fsoTemp = nothing
    end sub
    Function GetGuid
        
    Dim TypeLib,guid
        
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
        guid 
    = TypeLib.Guid
        GetGuid 
    = Left(guid,(Len(guid) - 2))
    End Function
    '定义临时图片名称
    Dim  m_sFilePath 
    m_sFilePath 
    = GetGuid & ".gif"

    '如果传递的delimg的查询字符串为true的话
    '
    就执行delimg过程来删除临时图片
    '
    因为当客户端的图片加载完后会利用xmlhttp
    '
    发送一个delimg=true的查询字符串上来,这时候可以删除临时图片了
    if request("delimg"<>""  then
        delimg(
    trim(request("delimg")))
    else
        CreateOwcChart
    end if
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> owc图表 </TITLE>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function delimg(imgsrc)
    {
        imgsrc 
    = imgsrc.replace(/(.*)({.*})/g,"$2")
        
    var Http = new ActiveXObject("Microsoft.XMLHTTP");
        
    var url = window.location + "?delimg=" + imgsrc;
        Http.open(
    "GET",url,false);
        Http.send()
    }

    //-->
    </SCRIPT>
    </HEAD>
    <BODY>
    <img src="<%= m_sFilePath %>" onload="delimg(this.src)">
    </BODY>
    </HTML>


    小结:关于更多的OWC的介绍就不写了,如果安装了office的话,搜索一下office的目录会找到OWC手册的,其实网上流行的好多OWC显示的图表的方案,有的是在一个目录里生成临时图片,然后在session_end里删除这些图片,但是session_end触发的时间不确定,也不可靠。而有的是生成临时图片后把图片加载到一个内存流里,然后把流以gif方式输出,随后删除临时图片。总之都是为了及时删除临时图片,我这个用的是xmlhttp执行服务器方法来达到同样目的的,代码很少,而且也很方便。

    代码下载:
    http://www.cnblogs.com/Files/onlytiancai/owcchart.rar
    其它说明:
    如果你禁止了FSO,注册FSO组件的方法如下
    regsvr32.exe scrrun.dll
    另外注意一下OWC组件的版本,一般在C:/WINDOWS/system32目录下有个MSOWC.DLL,它可以单独部署。
    XmlHttp异步获取网站数据的例子
    http://www.52z.com/info/ArticleView/2004-11-7/Article_View_35764.Htm
    利用OWC服务器端组件动态生成图表
    http://www.daima.com.cn/Info/4/Info26297/
    客户端回调
    http://gigabyte.cnblogs.com/archive/2004/09/07/40633.aspx
    如何查找 Office Web 组件 (OWC) 编程文档和示例
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;319793
    HOW TO:在 Visual Basic .NET 中处理 Windows 窗体中的 Office XP 电子表格组件的事件
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;319342
    HOW TO:在 Visual C# .NET 中处理 Windows 窗体中 Office XP 电子表格组件的事件
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;319341
    HOW TO:在 Visual Studio .NET 中处理 Office 2003 Web 组件的事件
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;823982
    Office 2003 安装程序删除了 Office 2000 Web 组件
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;831590
    如何在 Office 2003 程序中部署 Office 2003 Web Components
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;828950
    Microsoft Office 2000 Web 组件基础
    http://www.microsoft.com/china/MSDN/library/archives/library/techart/msowcBasics.asp
    INFO:使用 Visual Studio .NET 开发 Microsoft Office 解决方案
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;311452
    在 Access 2002 中进行 Web 开发
    http://www.microsoft.com/china/MSDN/library/archives/library/DNAcc2k2/html/odc_adap.asp
    在 Microsoft Access 2002 中对数据透视表进行编程
    http://www.microsoft.com/china/msdn/archives/library/dnacc2k2/html/odc_acprogpvt.asp

    为了简单起见,我用VBS和ASP来演示OWC对象的一些操作,在.NET下面这些属性是不变的,只要引用一下MSOWC.DLL就可以操作了,而且有智能感知可用.文章把重点放在演示思路上了.

    我又改进了一下代码,生成的图片是用guid做名称的,保证在并发请求的时候不会误删别人正在查看的图片,而且还加了一些关于OWC编程的链接。

     
    展开全文
  • ASP.NET中利用Crystal Report创建图表 在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用crystal ...
    
    
     ASP.NET中利用Crystal Report创建图表

      在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用crystal report ,来制作一份报表,其中介绍了不少asp.net和水晶报表的技巧。

      在这个例子中,我们设想的应用要为一个销售部门制作一份报表,管理者可以查看某段时间之内的销售情况,以列表或者折线图的形式反映出销售的趋势。我们将使用SQL Server 2000做为数据库,使用VB.NET编写中间层逻辑层,而前端的表示层使用C#。我们先来看下数据库的结构。

     
      其中,tbitem表中存放的是每张订单中所订购的货品,tbsales存放的是每张订单,tblsalesperson是销售员表,存放该出版社的每位销售员。

      接下来,使用SQL Server 2000来创建这些表。表的结构如下所示:

    CREATE TABLE [dbo].[tblItem] (
    [ItemId] [int] NOT NULL ,
    [Description] [varchar] (50) NOT NULL
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[tblSalesPerson] (
    [SalesPersonId] [int] NOT NULL ,
    [UserName] [varchar] (50) NOT NULL ,
    [Password] [varchar] (30) NOT NULL
    ) ON [PRIMARY]
    CREATE TABLE [dbo].[tblSales] (
    [SaleId] [int] IDENTITY (1, 1) NOT NULL ,
    [SalesPersonId] [int] NOT NULL ,
    [ItemId] [int] NOT NULL ,
    [SaleDate] [datetime] NOT NULL ,
    [Amount] [int] NOT NULL
    ) ON [PRIMARY]

      并且用以下的代码创建表之间的约束关系。

    ALTER TABLE tblItem
    ADD CONSTRAINT PK_ItemId
    PRIMARY KEY (ItemId)
    GO
    ALTER TABLE tblSalesPerson
    ADD CONSTRAINT PK_SalesPersonId
    PRIMARY KEY (SalesPersonId)
    GO
    ALTER TABLE tblSales
    ADD CONSTRAINT FK_ItemId
    FOREIGN KEY (ItemId) REFERENCES tblItem(ItemId)
    GO
    ALTER TABLE tblSales
    ADD CONSTRAINT FK_SalesPersonId
    FOREIGN KEY (SalesPersonId) REFERENCES tblSalesPerson(SalesPersonId)
    GO
     
      创建中间逻辑层

      在中间逻辑层组件中,我们为每一张表都创建两个类。比如,对于tblItems表,创建item 和items类。Item类中记录每件销售的货品的详细情况,而items表则记录所有销售的货品并且有增加货品的方法。这样,就存在下面的六个类:

      Item and Items
      SalesPerson and SalesPersons
      Sale and Sales

      接下来,看一下每个类中的属性:

      Item类

       包括如下属性
        ItemId (货品id编号)
        Description (货品的描述)
        Items

      有一个方法,将根据item的编号返回一个item对象

    Public Function GetAllItems () As Collections.ArrayList

      SalesPerson

      该类有以下三个属性:

       SalesPersonId (销售员编号)
       Name (姓名)
       Password (密码)

      SalesPersons

      有一个方法,根据销售员登陆时输入的用户名和密码,在数据库中,验证销售员的登陆是否正确,如果正确,则返回零。

    Public Function ValidateUser (strUserName as String, strPassword as String) As Integer

      Sale

      有如下5个属性

      · SaleId
      · SalesPersonId
      · ItemId
      · SaleDate
      · Amount

      Sales

      有两个方法,其中getsales根据输入的参数返回sales对象的集合

    Public Function GetSales (Optional nSaleId As Integer = 0, Optional nSalesPersonId As Integer = 0,Optional nItemId As Integer = 0) As Collections.ArrayList

      还有一个addsales方法,用于增加一张订单

    Public Function AddSale (objSale As Sale)
      创建表现层页面

      接下来,开始创建表现层页面。首先,要创建一个可以给销售员登陆的页面,如下图所示。



      在销售员成功登陆后,可以给销售员输入某样货品销售的数量,如下图:



      此外,为了给业务主管看到某个时期的销售情况,创建如下页面。



      其中,业务主管可以选择查看某样货品在某个时期(选择开始日期,结束日期)的销售情况,以图表方式显示。

      这里特别值得一提的是,日历控件的使用。在页面中放置日历控件后,设置如下代码:

    <input type="image" οnclick="Page_ValidationActive=false;" src="datepicker.gif" alt="Show Calender" runat="server" onserverclick="ShowCal1" id="ImgCal1" name="ImgCal1">

      这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:

    public void ShowCal1(Object sender, System.Web.UI.ImageClickEventArgs e)
    { //显示日历控件
    DtPicker1.Visible = true;
    }

      当用户选择了相关的日期后,在文本框中可以获得相关的日期:

    private void DtPicker1_SelectionChanged(object sender, System.EventArgs e)
    {
    txtStartDate.Text = DtPicker1.SelectedDate.ToShortDateString();
    DtPicker1.Visible = false;
    }

      在提交的页面中,处理的代码如下:

    private void bSubmit_ServerClick(object sender, System.EventArgs e)
    {
    Response.Redirect("ViewReport.aspx?ItemId=" + cboItemType.SelectedItem.Value + "&StartDate=" + txtStartDate.Text + "&EndDate=" + txtEndDate.Text);}

      在提交页面后,将跳转到浏览报表的页面viewreport.aspx,传入相关的参数,如货品ID,开始和结束日期。
      用水晶报表创建报表

      首先,往窗体中添加水晶报表控件,之后,就可以用水晶报表的报表设计器设计一份报表了。新建一个水晶报表文件类型,命名为itemreport.rpt,接着使用报表设计专家,并选择设计标准型的报表,点下一步,出现如下画面:


      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。

      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。
    <input type="image" οnclick="Page_ValidationActive=false;" src="datepicker.gif" alt="Show Calender" runat="server" onserverclick="ShowCal1" id="ImgCal1" name="ImgCal1">

      这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:

    public void ShowCal1(Object sender, System.Web.UI.ImageClickEventArgs e)
    { //显示日历控件
    DtPicker1.Visible = true;
    }

      当用户选择了相关的日期后,在文本框中可以获得相关的日期:

    private void DtPicker1_SelectionChanged(object sender, System.EventArgs e)
    {
    txtStartDate.Text = DtPicker1.SelectedDate.ToShortDateString();
    DtPicker1.Visible = false;
    }

      在提交的页面中,处理的代码如下:

    private void bSubmit_ServerClick(object sender, System.EventArgs e)
    {
    Response.Redirect("ViewReport.aspx?ItemId=" + cboItemType.SelectedItem.Value + "&StartDate=" + txtStartDate.Text + "&EndDate=" + txtEndDate.Text);}

      在提交页面后,将跳转到浏览报表的页面viewreport.aspx,传入相关的参数,如货品ID,开始和结束日期。
      用水晶报表创建报表

      首先,往窗体中添加水晶报表控件,之后,就可以用水晶报表的报表设计器设计一份报表了。新建一个水晶报表文件类型,命名为itemreport.rpt,接着使用报表设计专家,并选择设计标准型的报表,点下一步,出现如下画面:


      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。

      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。
    Public Function GetAllItems () As Collections.ArrayList

      SalesPerson

      该类有以下三个属性:

       SalesPersonId (销售员编号)
       Name (姓名)
       Password (密码)

      SalesPersons

      有一个方法,根据销售员登陆时输入的用户名和密码,在数据库中,验证销售员的登陆是否正确,如果正确,则返回零。

    Public Function ValidateUser (strUserName as String, strPassword as String) As Integer

      Sale

      有如下5个属性

      · SaleId
      · SalesPersonId
      · ItemId
      · SaleDate
      · Amount

      Sales

      有两个方法,其中getsales根据输入的参数返回sales对象的集合

    Public Function GetSales (Optional nSaleId As Integer = 0, Optional nSalesPersonId As Integer = 0,Optional nItemId As Integer = 0) As Collections.ArrayList

      还有一个addsales方法,用于增加一张订单

    Public Function AddSale (objSale As Sale)
      创建表现层页面

      接下来,开始创建表现层页面。首先,要创建一个可以给销售员登陆的页面,如下图所示。



      在销售员成功登陆后,可以给销售员输入某样货品销售的数量,如下图:



      此外,为了给业务主管看到某个时期的销售情况,创建如下页面。



      其中,业务主管可以选择查看某样货品在某个时期(选择开始日期,结束日期)的销售情况,以图表方式显示。

      这里特别值得一提的是,日历控件的使用。在页面中放置日历控件后,设置如下代码:

    <input type="image" οnclick="Page_ValidationActive=false;" src="datepicker.gif" alt="Show Calender" runat="server" onserverclick="ShowCal1" id="ImgCal1" name="ImgCal1">

      这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:

    public void ShowCal1(Object sender, System.Web.UI.ImageClickEventArgs e)
    { //显示日历控件
    DtPicker1.Visible = true;
    }

      当用户选择了相关的日期后,在文本框中可以获得相关的日期:

    private void DtPicker1_SelectionChanged(object sender, System.EventArgs e)
    {
    txtStartDate.Text = DtPicker1.SelectedDate.ToShortDateString();
    DtPicker1.Visible = false;
    }

      在提交的页面中,处理的代码如下:

    private void bSubmit_ServerClick(object sender, System.EventArgs e)
    {
    Response.Redirect("ViewReport.aspx?ItemId=" + cboItemType.SelectedItem.Value + "&StartDate=" + txtStartDate.Text + "&EndDate=" + txtEndDate.Text);}

      在提交页面后,将跳转到浏览报表的页面viewreport.aspx,传入相关的参数,如货品ID,开始和结束日期。
      用水晶报表创建报表

      首先,往窗体中添加水晶报表控件,之后,就可以用水晶报表的报表设计器设计一份报表了。新建一个水晶报表文件类型,命名为itemreport.rpt,接着使用报表设计专家,并选择设计标准型的报表,点下一步,出现如下画面:


      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。

      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。
    <input type="image" οnclick="Page_ValidationActive=false;" src="datepicker.gif" alt="Show Calender" runat="server" onserverclick="ShowCal1" id="ImgCal1" name="ImgCal1">

      这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:

    public void ShowCal1(Object sender, System.Web.UI.ImageClickEventArgs e)
    { //显示日历控件
    DtPicker1.Visible = true;
    }

      当用户选择了相关的日期后,在文本框中可以获得相关的日期:

    private void DtPicker1_SelectionChanged(object sender, System.EventArgs e)
    {
    txtStartDate.Text = DtPicker1.SelectedDate.ToShortDateString();
    DtPicker1.Visible = false;
    }

      在提交的页面中,处理的代码如下:

    private void bSubmit_ServerClick(object sender, System.EventArgs e)
    {
    Response.Redirect("ViewReport.aspx?ItemId=" + cboItemType.SelectedItem.Value + "&StartDate=" + txtStartDate.Text + "&EndDate=" + txtEndDate.Text);}

      在提交页面后,将跳转到浏览报表的页面viewreport.aspx,传入相关的参数,如货品ID,开始和结束日期。
      用水晶报表创建报表

      首先,往窗体中添加水晶报表控件,之后,就可以用水晶报表的报表设计器设计一份报表了。新建一个水晶报表文件类型,命名为itemreport.rpt,接着使用报表设计专家,并选择设计标准型的报表,点下一步,出现如下画面:


      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。

      我们选择使用ADO类型的数据,在弹出的窗口中,设置好sql server的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:


      接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,最后,在图表类型中选择折线图,如下图:


      最后点击finish,可以看到如下的报表:


      再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。


      由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

    名称: 类型:
    ItemId Number
    StartDate Date
    EndDate Date
      
      最后,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:


      在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。最后,保存建立的公式。
      在程序中使用报表

      接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

    CrystalDecisions.CrystalReports.Engine
    CrystalDecisions.Shared
    在viewreport.aspx的Page_load事件中,加入以下代码

    //接收传递的参数
    nItemId = int.Parse(Request.QueryString.Get("ItemId"));
    strStartDate = Request.QueryString.Get("StartDate");
    strEndDate = Request.QueryString.Get("EndDate");
    //声明报表的数据对象
    CrystalDecisions.CrystalReports.Engine.Database crDatabase; CrystalDecisions.CrystalReports.Engine.Table crTable;
    TableLogOnInfo dbConn = new TableLogOnInfo();
    // 创建报表对象opt
    ReportDocument oRpt = new ReportDocument();
    // 加载已经做好的报表
    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");
    //连接数据库,获得相关的登陆信息
    crDatabase = oRpt.Database;
    //定义一个arrtables对象数组
    object[] arrTables = new object[1];
    crDatabase.Tables.CopyTo(arrTables, 0);
    crTable = (CrystalDecisions.CrystalReports.Engine.Table)arrTables[0]; dbConn = crTable.LogOnInfo;
    //设置相关的登陆数据库的信息
    dbConn.ConnectionInfo.DatabaseName = "WroxSellers"; dbConn.ConnectionInfo.ServerName = "localhost";
    dbConn.ConnectionInfo.UserID = "sa";
    dbConn.ConnectionInfo.Password = "test";
    //将登陆的信息应用于crtable表对象
    crTable.ApplyLogOnInfo(dbConn);
    //将报表和报表浏览控件绑定
    crViewer.ReportSource = oRpt;
    //传递参数
    setReportParameters();

      在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database, Table和 TableLogOnInfo 三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

    oRpt.Load("F://aspnet//WroxWeb//ItemReport.rpt");

      来装载已经做好了的报表。

      在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的第一个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。最后,将报表源与报表浏览控件绑定。

      传递参数到水晶报表

      定义一个新的过程,setReportParameters(),代码如下:

    private void setReportParameters()
    {
    // all the parameter fields will be added to this collection
    ParameterFields paramFields = new ParameterFields();
    // the parameter fields to be sent to the report
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";
    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue(); ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();

    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

    pfItemId.CurrentValues.Add(dcItemId);
    pfStartDate.CurrentValues.Add(dcStartDate); pfEndDate.CurrentValues.Add(dcEndDate);
    paramFields.Add(pfItemId);
    paramFields.Add(pfStartDate);
    paramFields.Add(pfEndDate);

    // 将参数集合绑定到报表浏览控件
    crViewer.ParameterFieldInfo = paramFields;
    }

      现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

    ParameterFields paramFields = new ParameterFields();
    ParameterField pfItemId = new ParameterField();
    ParameterField pfStartDate = new ParameterField();
    ParameterField pfEndDate = new ParameterField();
    // 设置在报表中,将要接受的参数字段的名称
    pfItemId.ParameterFieldName = "ItemId";
    pfStartDate.ParameterFieldName = "StartDate";
    pfEndDate.ParameterFieldName = "EndDate";

      接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受P arameterDiscreteValue类型的对象,所以,再创建相关的实例:

    ParameterDiscreteValue dcItemId = new ParameterDiscreteValue();
    ParameterDiscreteValue dcStartDate = new ParameterDiscreteValue();
    ParameterDiscreteValue dcEndDate = new ParameterDiscreteValue();
    dcItemId.Value = nItemId;
    dcStartDate.Value = DateTime.Parse(strStartDate);
    dcEndDate.Value = DateTime.Parse(strEndDate);

      最后,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

      运行的结果如下。


      本程序在VS.NET 2003,crystal report 9以上版本可以正确运行。



    <script type="text/javascript"> </script> <script type="text/javascript"> </script>
    <script language="javascript" type="text/javascript"> </script>  
    展开全文
  • Pycharm利用Flask展示图表数据

    千次阅读 多人点赞 2020-03-02 10:48:04
    日常工作中我们可能需要临时把数据分享给运营或者产品,如果购买或者开发一个新的框架成本比较高,那么我们可以用Flask做一个简单的数据展示进行分享。 flask 是python web开发的微框架,Echarts酷炫的功能主要是...

    日常工作中我们可能需要临时把数据分享给运营或者产品,如果购买或者开发一个新的框架成本比较高,那么我们可以用Flask做一个简单的数据展示进行分享。

    flask 是python web开发的微框架,Echarts酷炫的功能主要是javascript起作用,将两者结合起来,发挥的作用更大。

    一、安装Pycharm

    Pycharm是当下比较流行的python的IDE,下面可以直接创建flask项目

    首先到官网进行下载

    安装可以选择到网上找可以用的激活码

    二、创建Flask项目

    File - new project里面直接创建一个Flask

    创建完成后的目录

    三、第一个项目

    写一个最简单的程序

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
    
    	return 'Hello World!'
    
    if __name__ == '__main__':
    	app.run()

    下面会出现如下结果

    说明运行成功

    打开里面的网址便会出现

    四、创建第一个图表

    首先要先pip install pyecharts

    直接在pycharm里面打开终端进行下载

    from flask import Flask
    from jinja2 import Markup
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    app = Flask(__name__, static_folder="templates")
    def bar_base() -> Bar:
      c = (
        Bar()
          .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
          .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
          .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
          .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="AB数据对比"))
      )
      return c
    @app.route("/")
    def index():
      c = bar_base()
      return Markup(c.render_embed())
    if __name__ == "__main__":
      app.run()

    五、前后端分离

    前后端分离可以更好的把图表精细化处理

    我们需要下载一个文件echarts.min.js

    选择在线定制,把下载的文件放在static里面

    在templates里面建立一个html文件

    app.py里面

    from flask import *
    from pyecharts import options as opts
    from pyecharts.charts import Bar
    
    app = Flask(__name__)
    
    @app.route('/')
    def show_charts():
        bar = (
            Bar()
                .add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
                .add_yaxis("商家A",[5, 20, 36, 10, 10, 20])
                .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
    
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="AB数据对比"))
        )
    
    
        return render_template('show_charts.html',
                               bar_options=bar.dump_options())
    
    if __name__ == "__main__":
    
        app.run(debug = True)

    show_charts.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>ECharts</title>
        <!-- 引入 echarts.js 这里使用flask的url_for-->
        <script src="{{ url_for('static', filename='echarts.min.js') }}"></script>
    </head>
    <body>
        <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
        <div id="main" style="width: 600px;height:400px;"></div>
        <script type="text/javascript">
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));
    
            // 指定图表的配置项和数据
            var option ={{ bar_options | safe }};
    
            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        </script>
    </body>
    </html>
    

    六、多图展示

    代码:

    from flask import *
    from pyecharts import options as opts
    from pyecharts.charts import Bar,Pie
    
    app = Flask(__name__)
    
    @app.route('/')
    def show_charts():
        bar = (
            Bar()
                .add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
                .add_yaxis("商家A",[5, 20, 36, 10, 10, 20])
                .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
    
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="AB数据对比"))
        )
    
    
        pie = (
          Pie()
            .add("", [("商家A", 100), ("商家B", 88), ("商家C", 166)])
            .set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例"))
            .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    
        )
    
        return render_template('show_charts.html',
                               bar_options=bar.dump_options(),
                               pie_options=pie.dump_options())
    
    if __name__ == "__main__":
    
        app.run(debug = True)

    html

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>ECharts</title>
        <!-- 引入 echarts.js 这里使用flask的url_for-->
        <script src="{{ url_for('static', filename='echarts.min.js') }}"></script>
    </head>
    <body>
        <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
        <h1>柱形图</h1>
        <div id="bar" style="width: 600px;height:400px;"></div>
        <h1>饼图</h1>
        <div id="pie" style="width: 600px;height:400px;"></div>
        <script type="text/javascript">
            // 基于准备好的dom,初始化echarts实例
            var barChart = echarts.init(document.getElementById('bar'));
            var pieChart = echarts.init(document.getElementById('pie'));
    
    
            // 使用刚指定的配置项和数据显示图表。
            barChart.setOption({{ bar_options | safe }});
            pieChart.setOption({{ pie_options | safe }});
        </script>
    </body>
    </html>

    七、远程访问

    远程服务器部署需指定 host='0.0.0.0' , 其他机器才能正常访问远程服务,即如下方式

    app.run(host='0.0.0.0',port=8000)

     

    指定host后远程服务可被其他任何机器访问。

    八、问题实例

    如果在终端运行出现如下问题

    Environment: production
    WARNING: This is a development server. Do not use it in a production deployment.
    Use a production WSGI server instead.

    其实就是flask未使用 WSGI 启动,所以使用wsgi启动就行了

     

    from gevent import pywsgi
     
    if __name__ == '__main__':
        server = pywsgi.WSGIServer(('0.0.0.0', 8000), app)
        server.serve_forever()

     

     

     

     

     

     

     

    展开全文
  • Python创建图表

    2019-04-19 09:37:02
    资源选自《Python变成从入门到实践》一书,该书提供三个Python入门项目,此为第二个项目数据可视化,利用Python的matplotlib和Pygal模块提取数据生成一系列常见的图表,例如折线图、散点图、直方图,更多的图形类别...
  • ASP.NET中利用水晶报表创建图表

    千次阅读 2004-10-15 15:11:00
    在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用crystal ...全文阅读:ASP.NET中利用水晶报表创建图表
  • 在处理电子表格时,要对大量烦琐的数据进行分析和研究,有时需要利用图形方式再现数据变动和发展趋势。Excel提供了强有力的图表处理功能,使得...一、创建图表可以选取一行或一列数据,也可选取连续或不连续的数据区...
  • 课程简介: 本次课程将介绍如何在Excel 2010中创建图表,以及对图表元素的外观进行极...在Excel 2010中,用户不仅能快速创建图表,更值得称道的是还可以利用各种选项让图表看起来更加美观动人。本次课程将介绍如何在...
  • 本文详细介绍ASP.NET中利用水晶报表创建图表 在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用...
  • 最近一段时间,在学习和研究Python的时候发现有一个非常强大的类库pyecharts可以用来开发动态数据分析图表,这个类库性能非常优异,利用这个类库可以非常便捷地开发出可以人机互动的动态数据分析图表,而在其他实现...
  • 在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的ASP.NET程序为例,介绍如何使用crystal report ,来制作一份报表,其中介绍了不少...
  • 为了让自己制作的数据透视图更具吸引力,小刘费尽心思将图表打扮的十分漂亮。但是,在以后的工作中,如果他需要再创建类似的图表时,是否还要重新对图表进行修饰美化呢?答案是否定的。其实,在Excel 2010中,利用...
  • 曾经在在PHP中使用FusionCharts一文中介绍如何在PHP中使用...本文主要介绍如何利于C#创建FusionCharts图表。 1、在项目引用中添加FusionCharts.dll 2、生成XML格式的字符串与选定图表对应的Flash文件,采用FusionC...
  • ASP.NET中利用Crystal Report创建图表

    千次阅读 2005-09-13 10:56:00
    在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用crystal report ,来制作一份报表,其中介绍了不少...
  • 利用Kibana图表化Elasticsearch中的数据

    万次阅读 2017-11-28 18:18:23
    利用Kibana图表化Elasticsearch中的数据1. 背景Kibana 是一个开源分析和可视化平台,旨在可视化操作 Elasticsearch 。Kibana可以用来搜索,查看,和存储在 Elasticsearch 索引中的数据进行交互。可以轻松地进行高级...
  • 下面,我们讲解创建五星单元格图表的技术。这项技术利用了公式和条件格式。首先,准备数据,如下图1所示。第1列为电影名称,第2列为观众评分,从1到5,可以为小数。图1然后,在数据旁边使用5列用来放置星星,如下图2...
  • 动态图表实现原理(理解图表中的数据系列,手工修改系列中的数值与坐标轴数据利用IF创建简单的动态图表利用OFFSET函数与控件创建动态图表(OFFSET函数概述,OFFSET函数的动态引用示例,动态图表:永远返回最后10...
  • @TOC#python编程从入门到实践# 16-6练习 利用网上下载的json数据绘制图表 生成的是一个数据仪表盘的html文件,效果如图 数据文件是在https://datahub.io/下载 位置为:进入网站-核心数据集-参考资料-最受欢迎的数据...
  • 本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀… Flask 模板渲染 1. 新建一个项目 flask-echarts 在编辑器中选择 New Project...
  • 本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀...Flask 模板渲染1. 新建一个项目 flask-echarts在编辑器中选择 New Project,...
  • 本文将介绍如何在 web 框架 flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀...flask 模板渲染1. 新建一个项目 flask-echarts在编辑器中选择 new project,...
  • 本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法! Django 模板渲染 1. 新建一个 Django 项目 命令行中输入以下命令 django-...
  • 在很多的应用程序中,报表是不可缺少的,一张好的报表能直观地让人把握数据的情况,方便决策。在这篇文章中,我们将以一个三层结构的asp.net程序为例,介绍如何使用crystal report ,来制作一份报表,其中介绍了不少...
  • 本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!Django 模板渲染1. 新建一个 Django 项目命令行中输入以下命令django-adminstartprojectpyecharts_...
  • 本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!Django 模板渲染1. 新建一个 Django 项目命令行中输入以下命令django-admin startproject ...
  • 本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀…Flask 模板渲染1. 新建一个项目flask_pyecharts在编辑器中选择 New Project,...
  • 本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀… Flask 模板渲染 1. 新建一个项目flask_pyecharts 在编辑器中选择 New ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 911
精华内容 364
关键字:

利用数据创建图表