水晶报表的一个小小的例子

这次我们做了一个程序.

访问数据库:

         使用数据库访问中间件,只要写一个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();
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章