鉴于许多访客让我发相关水晶报表的代码,在此,我写一篇关于水晶报表在VC6.0应用的文章。
首先,必须安装水晶报表软件,建议安装Seagate Crystal Reports 8.0。虽然该版本在目前不是最新,但比较稳定,控件也容易使用。安装该软件后,水晶报表控件就会添加到VC6.0的控件库。
将控件库中的"Crystal Report Viewer"控件加入到当前工程。
现在设计一对话框ReportDlg (以下红色部分表示根据具体应用需要变化的部分,蓝色表示基本不变的部分)
在ReportDlg 的头文件中加入如下代码:(该代码是固定的,本人也不怎么理解)
#include "comdef.h"
//#include "craxddrt.h"
#import "craxddrt.tlb" no_namespace
const CLSID CLSID_Application = {0xb4741fd0,0x45a6,0x11d1,{0xab,0xec,0x00,0xa0,0xc9,0x27,0x4b,0x91}};
const IID IID_IApplication = {0x0bac5cf2,0x44c9,0x11d1,{0xab,0xec,0x00,0xa0,0xc9,0x27,0x4b,0x91}};
const CLSID CLSID_ReportObjects = {0xb4741e60,0x45a6,0x11d1,{0xab,0xec,0x00,0xa0,0xc9,0x27,0x4b,0x91}};
const IID IID_IReportObjects = {0x0bac59b2,0x44c9,0x11d1,{0xab,0xec,0x00,0xa0,0xc9,0x27,0x4b,0x91}};
对话框中加入控件"Crystal Report Viewer"
自动关联变量 CCrystalReportViewer3 m_Report;
头文件中加入下面成员变量
IApplicationPtr m_Application;
IReportPtr m_ReportPtr;
CString m_ReportName; //报表名称
CString m_ReportFormula; //检索条件
在OnInitDialog事件中加入代码:
BOOL CPrintDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if(m_Application == NULL)
{
HRESULT hr = CoCreateInstance(CLSID_Application, NULL, CLSCTX_INPROC_SERVER , IID_IApplication, (void **) &m_Application);
}
m_ReportPtr=m_Application->OpenReport(_bstr_t(m_ReportName;));
if(m_ReportPtr == NULL)
{
MessageBox("打开报表失败!","提示");
return false;
}
_bstr_t varDB,varPWD,varUser,varServer,varDSN;
varDSN="Test"; //数据源名 (水晶报表采用数据源,使得可以访问远程数据库的数据)
varDB="Test"; //数据库名称
varPWD="Test"; //数据库密码
varUser="Test"; //数据库用户
varServer="Test"; //数据库服务器名称 (IP)
m_ReportPtr->Database->LogOnServer("p2sodbc.dll",varDSN,varDB,varUser,varPWD);
m_ReportPtr->put_SQLQueryString(_bstr_t(m_ReportFormula));
//显示报表
m_Report.SetReportSource(m_ReportPtr);
m_Report.SetEnableGroupTree(FALSE);
m_Report.SetDisplayBackgroundEdge(FALSE);
m_Report.SetDisplayBorder(FALSE);
m_Report.SetEnableSearchControl(FALSE);
m_Report.SetEnableRefreshButton(TRUE);
m_Report.ViewReport();
m_Report.Refresh();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//添加点击打印按钮响应函数OnPrintButtonClickedPrjReport
void CPrintDlg::OnPrintButtonClickedPrjReport(BOOL FAR* UseDefault)
{
// TODO: Add your control notification handler code here
UseDefault = FALSE;
m_ReportPtr->PrinterSetup(0);
}
//使用方法:
CPrintDlg dlg;
dlg.m_ReportName="D:\\test.rpt"; //报告路径
dlg.m_ReportFormula="select * from test"; //报告检索条件
dlg.DoModal(); //显示报表
最后,是关于水晶报表生成安装文件打包的问题了。如果没有添加相应的DLL文件,则程序放在没有安装水晶报表的机子上就无法运行。
所需要打包的文件有:
p2sodbc.dll
p2lodbc.dll
crviewer.dll
craxddt.dll
craxdrt.dll
Crystl32.OCX
p2ssql.dll
在8与8.5 中,你要注册以下dll
craxddrt.dll 如果报表中有动态创建字段等功能。需要它。
craxddt.dll 如果报表中有动态创建字段等功能。需要它。
craxdrt.dll 如果报表中有动态创建字段等功能。需要它。
crdesignerctrl.dll 报表设计器控件
crystalwizard.dll 报表向导
crviewer.dll 具有报表浏览器。
p2smon.dll 数据库驱动
以下是vb6 中 crystal report9 安装需要的文件:(
msvbvm60.dll
oleaut32.dll
olepro32.dll
asycfilt.dll
comcat.dll
vb6chs.dll
crviewer9.dll
craxdrt9.dll
unicows.dll
msvcrt.dll
crtowords_en.dll
ufmanager.dll
u2l2000.dll
u2lcom.dll
u2ldts.dll
u2lexch.dll
u2lfinra.dll
u252000.dll
u25dts.dll
u25samp1.dll
sscsdk80.dll
implode.dll
crqe.dll
crdb_ado.dll
crdb_dao.dll
crdb_odbc.dll
querybuilder.dll
exlate32.dll
crxf_rtf.dll
exportmodeller.dll
crtslv.dll
crxf_wordw.dll
crxf_xls.dll
crxf_pdf.dll
u2fcr.dll
u2fsepv.dll
u2ftext.dll
u2fxml.dll
u2ddisk.dll
u2dpost.dll
u2dapp.dll
keycode.dll
craxddrt9.dll
sscrc.dll
sscdlg.dll
cranalyzer.dll
p2ixbse.dll
crdb_dictionary.dll
filedialog.dll
sacommoncontrols.dll
vb6stkit.dll )