在 Crystal Report 中使用公式
Crystal Report 中的公式字段是一项功能,用于在应用程序报告的记录显示/打印期间动态增强值的计算。
摘要
大多数商业软件的最终目标是生成有用且准确的报告,以满足用户在企业管理层面上增强决策过程的需求。尽管存在一些其他形式的报告工具,但 Crystal Report 在开发简洁可靠的报告方面已获得极大的赞誉。在本文中,利用其功能之一——公式——来演示电子库存卡(e-BinCard)的实现。库存卡用于手动跟踪大多数营销公司、商店/仓库(包括尼日利亚)的库存中各个项目。然而,这种情况正逐渐被能够执行相同功能的应用程序所取代。在本演示中,将展示一个库存管理应用程序,其中使用 Crystal Report 设计工具的公式字段来动态计算库存余额,从而实现 e-BinCard。
1.0 简介
Crystal Report 中的公式字段是一项功能,用于在应用程序报告的记录显示/打印期间动态增强值的计算。大多数开发人员通常未能有效利用 Crystal Report 此功能的潜力,而是更倾向于使用其他报告查看模块。Crystal Report 中的公式有两种语法形式:Basic 和 Crystal。在本文中,将演示一些关于语法、数据类型、返回值和区分大小写的细节。公式始终用于返回一个值或在需要的地方插入一个值。返回的数据类型必须是简单的,可以是 Number
、Currency
、String
、Boolean
、Date
、Time
和 DateTime
。您不能返回范围或数组等复杂数据类型。公式通过将值赋给 Formula 变量来返回值,并且必须始终返回值。这些值会自动分配给插入公式的字段。Stock Bin Card 将用于演示公式的使用,这将增强读者对 Crystal Report 中公式的知识。
2.0 库存卡
库存卡是一种在仓库中维护库存移动的手动技术。库存卡包含以下元素/字段;库存代码、描述、操作日期、期初余额、收货数量和发货/销售库存余额以及员工身份。(参见图 1)。虽然从 Crystal Report 模块中获取此类报告可能看起来很简单,但在计算库存余额时,Group By
或 Order By
功能可能会变得混乱,从而导致报告毫无意义。预计读者对 Visual Basic.NET 和 MySql 有最少的了解,以便在本文的演示过程中易于理解。该示例分为三个部分;表(MySql)、窗体(设计 – VB.NET 和 Crystal Report)以及程序(VB.NET)。
2.1. 数据库、表和列
使用指令“Create database nameofdatabase”在 MySql 中创建数据库,同时使用指令“Create table tablename”创建表。因此,创建了 bincard 数据库和 stockbincard
表。数据库和表的创建和使用在 MySQL 教程 中进行了说明。或者,也可以使用 MySQLAdmin
实现相同目的(如图 2 所示)。可以使用 MySQL 查询浏览器分别确认数据库和表以及列的创建。
3.0 StockBinCard 项目
Stockbincard
项目在 VB.NET 环境中创建,并创建了以下窗体:
- stkbinmenu.vb - 项目的主菜单窗体(图 3)。该窗体包含三个子菜单,用于访问 e-BinCard 的三个基本功能。(库存收货、库存发货和打印 e-BinCard)。
- dataentry.vb - 此窗体提供了将数据录入数据库的机制。注册库存项目的收货和发货。如果库存项目是新产品,则进入创建模式,否则接受(收货或发货)中的数据(参见图 4)。以下代码片段后缀
Public Function GetDetails(ByVal strCode As String) As Int16 Sql = "Select StockDescr From stockbincard Where StockCode = ?Dcode " Try Try With cmd .CommandText = Sql .CommandType = CommandType.Text .Connection = BconnectObj .Parameters.Add("?Dcode", MySqlDbType.VarChar).Value = strCode label = .ExecuteScalar // Returns the label if item is in the DB End With End Function
一旦在 e-BinCard 数据库中找到该项目,就会初始化各种对象并验证操作。在此有必要指出的是,数据库的
StockCode
列未用作键,因此允许多次出现记录。 - stkModule.vb 包含项目中常用变量(全局)的声明。
其中一些声明是项目中常用且可访问的变量或对象实例。
// stkmodule.vb Module MainModule Public myReport As New ReportDocument Public RData As New DataSet Public KAdapter As New OdbcDataAdapter Public XYcommand As New OdbcCommand Public cmd As New MySqlCommand Public BconnectObj As MySqlConnection = New MySqlConnection() Public MyConString As String Public Conn As New OdbcConnection() ' Public IsConnected As Boolean Public Gflag As Boolean 'Global error flag Public FormMain As New Form() Public toggleForm As Integer = 0 End Module
该文件还包含一些其他
public
函数,例如startup()
– 项目的起点,DatabaseConnection()
– 连接到BinCard
数据库,PrintBinCard()
– 生成 e-BinCard
。 - ReportBinCardView.vb – 实现 Crystal Report 查看器生成的报告的查看(参见图 5):这是“容纳”
ViewReportBinCard
对象的窗体。创建该窗体,并将
crystalreportviewer
对象拖放到窗体中,并对名称进行适当关联。以下代码段与查看器关联,以将选择语句的输出(参见图 7)加载到ViewReportBinCard
。Private Sub ViewReportBinCard_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ViewReportBinCard.Load ViewReportBinCard.ReportSource = myReport End Sub
- ReportBinCard.rpt -
StockBinCard
的 Crystal Report 文件(设计)(参见图 6)。在使用“Crystal Report 向导”创建“ReportBinCard.rpt”之前,应实现“
Rdata
”数据集的生成并将 XML 写入文件“StockBinCard.xml”。以下代码段以 XML 格式生成数据集 'RData'
XYcommand.Connection = Conn XYcommand.CommandText = Sql KAdapter.SelectCommand = XYcommand KAdapter.Fill(RData) RData.WriteXml("StockBin.xml", XmlWriteMode.WriteSchema)
Crystal Report 创建向导允许通过上传 XML 文件(StockBin.xml)创建“New Connection”,并将
StockBinCard
表附加到“ReportBinCard.rpt”。在图 6 中,显示了
StockBinCard
的相应字段以及公式字段,用于计算每次操作后的库存余额。
4.0 生成报告
生成报告涉及将数据库中的数据准备成报告加载器的数据集。以下代码将按顺序使用以实现所需结果(参见图 7)
select
语句- 数据库连接
OdbcCommand
实例 –Xycommand
OdbcDataAdapter
实例 –Kadapter
- 填充数据集 –
Rdata
- 加载报告 –
myreport
– 并设置 ReportReportSource
- 显示报告 -
ViewReportBinCard
5.0 公式字段
如前所述,将使用 Crystal Report 公式动态计算和显示库存余额。创建公式时,可以选择使用 Crystal 或 Basic 语法。用一种语法编写的几乎任何公式都可以用另一种语法编写。报告可以包含使用 Basic 语法的公式,也可以包含使用 Crystal 语法的公式,但单个公式只能使用一种语法。在计算库存余额时,我们将通过 Crystal 和 Basic 语法选项进行演示。
5.1. Basic 语法
Microsoft MSDN Library 清楚地解释了 Crystal Report 的 Basic 语法,并采用与 BASIC 语言相同的语法。例外情况是,必须在特殊变量 Formula 中返回值。它不区分大小写,并且包含 BASIC 中常用的字符串、整数等数据类型。在下面的图 8 中,选择了 Basic Syntax 选项,突出显示了表列,并且公式也被框了起来。
库存余额计算的公式在公式工作坊的代码部分给出
Global BalQty As Number - declares the global variable Balqty as an Integer
if {Table.Flag} = 1 Then - if the record is Receipt of Stock
BalQty = {Table.qtyRec} + Balqty - Add to the cumulative value of Balqty
else - otherwise
BalQty = BalQty – {Table.qtyDispa}
endif
Formula = Balqty - Return Balqty
5.2. Crystal 语法
MSDN Library 也同样说明和解释了 Crystal 语法。该语法与 Basic 语法有很大的不同。Crystal 语法返回的值不必附加到变量,而是变量本身的值。任何数据类型都可以作为值返回。这将在报告中包含公式的位置显示。下面将在图 9 中进行演示。
6.0 程序工作原理
一旦程序启动,并且成功连接到数据库 – bincard – ,将显示成功完成的消息,否则显示错误消息(参见图 10)。
之后,将显示主菜单,并附带以下选项:
- 收货 - 注册收货
- 发货 - 注册发货
- 打印库存卡 - 打印库存卡
在库存注册(收货或发货)期间,如果该项目是新的,程序将创建该项目,否则将显示库存信息,即库存描述。示例报告输出如图 11 所示。
7.0 结论
stockbincard
已用于演示电子库存卡的使用。目前的形式看起来很简单,但它很好地演示了 Crystal Report 中公式字段的使用。
可以插入其他功能,例如:选择定期打印电子库存卡、包含员工身份等,以及完整的库存报告,用于库存目的。希望读者能从这个例子中受益,并能够根据其他需求进行改进。
源代码可在此处下载。
8.0 建议进一步阅读
- MySQL 5.1 参考手册
https://dev.mysqlserver.cn/doc/refman/5.1/en/tutorial.html - MySQL 教程
http://www.tizag.com/mysqlTutorial/ - MSDN for Visual Studio 2008
http://www.microsoft.com/vs - Visual Basic .NET 编程入门
http://www.homeandlearn.co.uk/net/vbnet.html - Visual Basic 和 MySQL 开发者笔记
http://www.openwin.org/mike/index/index.php/articles
ABC 公司有限公司 尼日利亚阿布贾阿索科罗 43 号 库存卡 库存代码: 2633774 描述: 米其林轮胎 295/15 |
|||||
日期 (日/月/年) | Receipts (入库) | 发货/销售 | 库存余额 | 员工 ID/签名 | 注释 |
12/05/2011 | - | - | 200 | Tony | 期初余额 |
16/05/2011 | 20 | - | 220 | Tony | - |
22/05/2011 | - | 5 | 215 | Andrew | - |
23/05/2011 | 40 | - | 255 | Tony | - |
24/05/2011 | - | 55 | 200 | John | 传输 |
27/05/2011 | - | 12 | 188 | Andrew | 损坏 |
27/05/2011 | 7 | - | 195 | Tony | - |
Sql = "Select StockCode,StockDescr,DateMvt,qtyRec, qtyDispa,Comments, _
Flag From stockbincard " _
& " Where StockCode = '" & idtx & "' "
errflg = False
If Conn.State = ConnectionState.Closed Then
Conn.Open()
End If
XYcommand.Connection = Conn
XYcommand.CommandText = Sql
KAdapter.SelectCommand = XYcommand
KAdapter.Fill(RData)
myReport.Load("ReportBinCard.rpt")
myReport.SetDataSource(RData)
FormMain = New ReportBinCardView
FormMain.Text = FormMain.Text
FormMain.ShowDialog()