12-01-2009
Crystal Smart Viewer Ligação de uma aplicação MCF a um relatório do Crystal Reports
Prof. Nuno Ramalho
Prof. Nuno Ramalho
Crystal Smart Viewer Ligação de uma aplicação MCF a um relatório do Crystal Reports A utilização do Crystal Smart Viewer como interface de visualização de relatórios produzidos no Crystal Reports possibilita o desenvolvimento de aplicações complexas de cliente/servidor ou multi-camada para o acesso, preparação e visualização de dados existentes localmente ou através de uma infra-estrutura de rede.
Integração do Smart Viewer ActiveX control numa aplicação MFC Neste capítulo é demonstrada a criação de uma aplicação MFC com o Microsoft Visual C++ 2008. A máquina utilizada tem como Sistema Operativo o Microsoft Windows XP SP3 e uma instalação do Crystal Reports XI Release 2. A criação de uma aplicação MFC para a apresentação de um relatório do Crystal Reports pode ser feita da seguinte forma: 1. Criação de um projecto MFC Aplication baseado em caixas de diálogo (Dialog Based). 2. Inserção de um controlo ActiveX para o Crystal Reports (Crystal ActiveX Report Viewer Control) 3. Integração das classes CrystalReportViewer11 e CRVTrackCursorInfo através das livrarias do Crystal Report Designer Component Automation Server, também conecido como RDC – Report Designer Component (Automation server component - Craxdrt.dll e Crystal Report Viewer control - Crviewer.dll.) 4. Programação da aplicação MFC.
Criação do projecto MFC Aplication, Dialog Based Começamos por criar um novo projecto: File -> New Project e seleccionamos MFC Aplication.
1
Prof. Nuno Ramalho
Configuramos o nosso projecto como Dialog Based.
Inserção do Crystal ActiveX Report Viewer Control Para a inserir o controlo ActieX Report Viewer do Crystal Reports podemos clicar com o botão direito do rato na nossa caixa de dialogo e e escolher a opção
2
Prof. Nuno Ramalho
Escolhemos o Crystal ActiveX Report Viewer Control 11.5
Integração das classes CrystalReportViewer11 e CRVTrackCursorInfo através das livrarias do RDC Para adicionar as classes necessárias podemos clicar com o botão direito do rato no nosso projecto e escolher a opção Add class
3
Prof. Nuno Ramalho
Adicionamos uma MFC Class From ActiveX Control
Vamos adicionar as classes CrystalReportViewer11 e CRVTrackCursorInfo através da livraria CRViewer.dll (C:\Programas\Business Objects\Common\3.5\crystalreportviewers115\ActiveXControls\ CRViewer.dll)
4
Prof. Nuno Ramalho
Adicionamos a livraria craxdrt.dll. Podemos fazê-lo no ficheiro header stdax.h. Esta livraria expõe a interface IApplication. A palavra reservada #import adiciona “Prt” ao final do nome de cada interface para indicar que transformou as interfaces em smart pointers. Os smart pointers facilitam-nos, na medida em que fazem a gestão do ciclo de vida dos objectos.
Programação da aplicação MFC. Neste exemplo vamos criar na nossa aplicação um botão para accionar a visualização do relatório. O botão criado tem o identificador IDC_BUTTON_MOSTRA e a função associada ao clique OnBnClickedButtonMostra() No ficheiro header da nossa aplicação (MFCMostraRelatorioCRDlg.h) incluímos a classe CCrystalReportViewer11 e criamos o objecto m_Viewer que representa uma instância do Smart Viewer control do Crystal Reports. Utilizamos a interface IApplicationPtr para declarar um objecto da aplicação (m_Application). Criamos ainda os objectos m_Report do tipo IReportPtr.
// MFCMostraRelatorioCRDlg.h : header file // ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// #include "CCrystalReportViewer11.h" ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// #pragma once // CMFCMostraRelatorioCRDlg dialog class CMFCMostraRelatorioCRDlg : public CDialog { // Construction public: CMFCMostraRelatorioCRDlg(CWnd* pParent = NULL);
// standard constructor
5
Prof. Nuno Ramalho
// Dialog Data enum { IDD = IDD_MFCMOSTRARELATORIOCR_DIALOG }; ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// CCrystalReportViewer11 m_Viewer; ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// IApplicationPtr IReportPtr VARIANT
m_Application; m_Report; dummy;
////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedButtonMostra(); };
No ficheiro *Dlg.cpp passamos os dados provenientes de m_Viewer para o nosso controlo de ActiveX IDC_ACTIVEXREPORTVIEWER1 ... ... ... void CMFCMostraRelatorioCRDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_ACTIVEXREPORTVIEWER1, m_Viewer); } ... ... ...
Na função associada ao nosso botão criamos o seguinte código void CMFCMostraRelatorioCRDlg::OnBnClickedButtonVer() { m_Application.CreateInstance("CrystalRuntime.Application"); m_Report = m_Application->OpenReport("C:\\MovimentosFornecedor1.rpt"); m_Viewer.put_ReportSource(m_Report); m_Viewer.ViewReport(); }
6