这次我们做了一个程序.
访问数据库:
使用数据库访问中间件,只要写一个XML文件,通过Hibrate访问到真正的数据库,它将会返回一个XML文档给我们做为记录集.
做报表使用的方式:
生成静态的报表.写出一个TTX文件.基于这个做一个静态报表.把一些需要显示的内容都把它谋划好.还有一些公式也要做好.之后,数据来源是这样的.读出XML文档中的记录集,打开一个没有连接到数据库上的一个ADO的记录集.然后一条一条的把记录集加入.然后使用水晶报表对象将一个报表中的表结构与我的一个ADO记录集梆定,这样就能很方便的把内容显示出来了.
例子代码我在这里帖一些吧.可能今后会要用到.
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->CursorLocation=adUseClient;
try{
//加入列
m_pRecordset->Fields->Append(_bstr_t("id"),adVarChar, 40, adFldIsNullable);
//打开这个记录集,(com里,有一些默认值可以使用vtMissing来填写)
m_pRecordset->Open(vtMissing,vtMissing,adOpenStatic, adLockBatchOptimistic,adCmdUnknown);
//创建DOM,加载XML文档
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(Dlg.GetPathName().GetBuffer(0));
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("rowdata");
if (pRootNode==NULL)
{
return ;
}
//读出记录集
MSXML::IXMLDOMNodeListPtr pListNode = pRootNode->selectNodes("row");
for(int i=0;i< pListNode->length;i++)
{
MSXML::IXMLDOMNodePtr pNode=pListNode->Getitem(i);
MSXML::IXMLDOMNodeListPtr pListNode2=pNode->selectNodes("*");
for(int j=0;j<pListNode2->length;j++)
{
MSXML::IXMLDOMNodePtr pNode2=pListNode2->Getitem(j);
_bstr_t info=pNode2->Gettext();
//插入行
m_pRecordset->AddNew();///添加新记录
m_pRecordset->PutCollect("id",_variant_t(info));
m_pRecordset->Update();///保存到库中
}
}
//梆定一个数据源
m_report->m_Report->Database->Tables->Item[1]->SetDataSource(_variant_t((IDispatch *)m_pRecordset));
m_report->m_CRViewer1.SetReportSource(m_report->m_Report);
//刷新
m_report->m_CRViewer1.ViewReport();
m_report->m_CRViewer1.Refresh();
m_pRecordset->Close();
}