1。水晶报表在。NET中打包
原理:
用 Microsoft Installer (MSI)在您的安装包中包括的合并模块 (MSM) 分发。
MSI 合并模块(MSM)可在“C:/Program Files/Common Files/Merge Modules”目录中找到。
合并模块(MSM)分为三类:托管组件、数据库访问和密钥号码。
托管组件 MSM 处理所有托管组件的分发,其中包括 Windows 窗体查看器、Web 窗体查看器和所有 Crystal Decisions 命名空间。对于使报表运行所需的所有其他文件,由数据库访问 MSM 处理其分发。其中包括数据库、导出和图表驱动程序。KeyCode MSM 处理 Crystal Decisions 密钥号码的安装,这样您的用户在查看报表时,就不会被要求注册他们的 Crystal版本。
具体操作步骤:
1)新建“安装和部署项目”-->“安装向导”
2)选择项目类型(这里选“创建用于windows应用程序的安装程序”)-->下一步
3)选择要包含的文件:添加你的程序文件 + C:/Program Files/Common Files/Merge Modules下的managed.msm、managed_chs.msm、database_access.msm、database_access_chs.msm、regwiz.msm、VC_CRT.msm、VC_STL.msm。-->完成
具体功能如下:
managed.msm、managed_chs.msm、(托管组件 MSM 处理所有托管组件的分发,其中包括 Windows 窗体查看器、Web 窗体查看器和所有 Crystal Decisions 命名空间)
database_access.msm、database_access_chs.msm、(对于使报表运行所需的所有其他文件,由数据库访问 MSM 处理其分发。其中包括数据库、导出和图表驱动程序。)
regwiz.msm、(KeyCode MSM 处理 Crystal Decisions 密钥号码的安装)
VC_CRT.msm、VC_STL.msm(这个在msdn上绝对没提起,是vc的运行库,估计是Crystal Report或涉及到的某些程序是用vc写的,所以需要它!)
选择要包含的文件:添加你的程序文件 + C:/Program Files/Common Files/Merge Modules下的managed.msm、managed_chs.msm、database_access.msm、database_access_chs.msm、regwiz.msm、VC_CRT.msm、VC_STL.msm。-->完成
这里的添加是在“解决方案资源管理器”里,安装项目,弹右键,选“合并模块”,来添加。
4)打开解决方案-->右键点击regwiz.msm的属性,在“MergeMouduleProperties”里的“License Key”填入:AAP5GKS0000GDE100DS(这个是你生成Crystal Report是用到的注册号的密码!)
5)生成解决方案(或直接按Ctrl+Shift+B)
已经解决了!原来要使用如下方法,看到许多人在提这问题,贴于下面 :
----------------------------------
解决方案一:
报表数据访问使用推模型
需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。
----------------------------------
解决方案二:
记录选定公式运行时自定义
1、通过查看器控件传递选定公式
[Visual Basic]
Dim SelectFormula As String
SelectFormula = "{客户.去年销售额} > " & textBox1().Text
crystalReportViewer1.SelectionFormula = SelectFormula
[C#]
string selectFormula;
selectFormula = "{客户.去年销售额} > " + textBox1.Text;
crystalReportViewer1.SelectionFormula = selectFormula;
[C++]
String* selectFormula;
selectFormula->Concat
("{客户.去年销售额} > ", textBox1->Text);
crystalReportViewer1->SelectionFormula = selectFormula;
2、通过报表对象传递选定公式
[Visual Basic]
Dim selectFormula As String
selectFormula = "{客户.去年销售额} > " & textBox1().Text
Report.DataDefinition.RecordSelectionFormula = selectFormula
[C#]
string selectFormula;
selectFormula = "{客户.去年销售额} > " + textBox1.Text;
Report.DataDefinition.RecordSelectionFormula = SelectFormula;
[C++]
String* selectFormula;
selectFormula->Concat
("{客户.去年销售额} > ", textBox1->Text);
Report->DataDefinition->RecordSelectionFormula = selectFormula;
3、刷新相应的报表,方法是使用以下代码行结束这段代码:
CrystalReportViewer1.RefreshReport()
该公式得以更新,将使用新的最小值(上年度的销售额)。
----------------------------------
解决方案三:
将参数合并到记录选定公式
参数字段不必放入报表中即可在记录或组选定公式中使用。创建参数字段,然后像插入其他字段那样将其输入到公式中。
用公式进行记录选定
若要减少从数据库服务器传输的数据量并改善性能,请将参数字段直接合并到记录选定公式中。
下面的记录选定公式提请用户输入销售配额,并只显示去年销售额超过销售配额的所有客户。
{客户.去年销售额} > {?SalesQuota}
需要开发人员编写代码在运行时传递参数值……
2。数字转化成货币汉字
Function GetChinaNum(OrgNum As Double, Optional IsMoney As Integer, Optional dotNum As Integer) As String
'参数OrgNum: 为数字
'参数IsMoney: 为是不是返回人民币大写(1返回)
'参数dotNum: 为设置小数点后面的位数,默认为0,最大为8位
Dim OrgNum As Double
OrgNum = 123.45
Dim IsMoney As Integer
IsMoney = 1
Dim dotNum As Integer
dotNum = 2
Dim GetChinaNum As String
Dim NumDigit(1) As String, NumChar(1) As String
Dim AfterDotNum As String, NewNum As Double, StrNum As String
Dim RepPostNum As Variant, i As Integer, RepNum(1)
Dim MoenyNum As Variant, DotSite As Integer
NumDigit(0) = "0千0百0十0亿0千0百0十0万0千0百0十0"
NumDigit(1) = "0仟0佰0拾0亿0仟0佰0拾0万0仟0佰0拾0元0角0分"
NumChar(0) = "零一二三四五六七八九十"
NumChar(1) = "零壹贰叁肆伍陆柒捌玖拾"
RepNum(0) = Array("零十", "零百", "零千", "零零", "零零")
RepNum(1) = Array("零拾", "零佰", "零仟", "零角", "零零", "零零")
RepPostNum = Array("零万", "零亿", "零元")
If dotNum > 8 Then dotNum = 8
OrgNum = FormatNumber(OrgNum, dotNum, , , vbFalse)
If IsMoney Then
NewNum = Replace(Format(OrgNum, "############.00"), ".", "")
Else
NewNum = Int(OrgNum)
End If
StrNum = Format(NewNum, Right(NumDigit(IsMoney), 2 * Len(Trim(NewNum)) - 1 + IsMoney))
For i = 0 To 10
StrNum = Replace(StrNum, i, Mid(NumChar(IsMoney), i + 1, 1))
Next i
For i = 0 To UBound(RepNum(IsMoney))
StrNum = Replace(StrNum, RepNum(IsMoney)(i), Left(RepNum(IsMoney)(i), 1))
Next i
For i = 0 To 1 + IsMoney
StrNum = Replace(StrNum, RepPostNum(i), Right(RepPostNum(i), 1))
Next i
If OrgNum < 20 * (1 + IsMoney * 99) Then
If IsMoney Then
StrNum = Replace(StrNum, "壹拾", "拾")
Else
StrNum = Replace(StrNum, "一十", "十")
End If
End If
If dotNum <> 0 Then
DotSite = InStr(1, OrgNum, ".")
If DotSite > 0 And DotSite + IsMoney * 2 + 1 <= Len(OrgNum) Then
AfterDotNum = Mid(OrgNum, DotSite + IsMoney * 2 + 1, dotNum)
For i = 0 To 10
AfterDotNum = Replace(AfterDotNum, i, Mid(NumChar(IsMoney), i + 1, 1))
Next i
End If
End If
If IsMoney Then
GetChinaNum = StrNum & AfterDotNum & "整"
If dotNum <= 2 Then
GetChinaNum = Replace(GetChinaNum, "零分", "")
End If
Else
GetChinaNum = StrNum & "点" & AfterDotNum
If OrgNum > 0 Then
GetChinaNum = Replace(GetChinaNum, "零点", "点")
End If
End If
Erase NumDigit
Erase NumChar
Erase RepNum
End Function
本文介绍了水晶报表在.NET中的打包方法,包括原理、具体操作步骤及各合并模块功能,还给出报表数据访问、记录选定公式等问题的解决方案。此外,提供了将数字转化成货币汉字的函数,包含参数设置及详细代码逻辑。

3169

被折叠的 条评论
为什么被折叠?



