powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Crystal reports VS 2005
3 сообщений из 3, страница 1 из 1
Crystal reports VS 2005
    #33997156
_traveller_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет

Народ, помогите с информацией по использованию Crystal Reports отчетов
в C++ (unmanaged). Интересует загрузка шаблона отчета RPT в коде и печать.
Какие библиотеки использовать?
Поиск дает только ссылки на примеры работы с полной версией CR. Меня интересует встроенная в VS2005.

спасибо!
...
Рейтинг: 0 / 0
Crystal reports VS 2005
    #34008886
vanoman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_traveller_Всем привет

Народ, помогите с информацией по использованию Crystal Reports отчетов
в C++ (unmanaged). Интересует загрузка шаблона отчета RPT в коде и печать.
Какие библиотеки использовать?
Поиск дает только ссылки на примеры работы с полной версией CR. Меня интересует встроенная в VS2005.

спасибо!

Дык потому они и даются, с полной версией, т.к. пользоваться API ты можешь только приобретя CR. Не хочешь покупать - пользуйся Управляемым С++.

В моей практике была след. работа...
1. Первый попавшийся магазин, приобретение книги с названием Crystal Report.
2. Был полный CR 7-ой версии. Под него всё компилировал и линковал...
3. Немного шаманя, уже трудно вспомнить, прикручивал его к той версии, что идёт с VS2003.

Всё что требуется лежало у меня в C:\Program Files\Seagate Software\Crystal Reports

Примеры работы следующие (на CR 7.0 или идущем с VS2003)
//БАШКА
// CCrystalView view
//классы Crystal Report
#include "crpe.h"
#include "peplus.h"

//Перечисление возможных отчётов
enum enmReports //перечисление-предопределённые отчёты
{
//бла бла бла
};
class CCrystalView
{
protected:
// afx_msg void OnDestroy(){}

public:
CCrystalView();
virtual ~CCrystalView();
void Empty();
BOOL SetPrintReport(CPrintInfo* pInfo);
CString m_CRpFilePath; //Путь к файлу отчёта
/*#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif*/
protected:
CRPEngine m_Engine;//Менеджер задач печати
CRPEJob *m_pJob;//Указатель на Тек задачу печати
// DECLARE_MESSAGE_MAP()
// Завершение задания на печать
void ClosePrintJob(void);
// Имеется-ли задание на печать
bool isPrintJobStarted(void);
public:
// Старт вывода на печать (поале Print Report)
BOOL StartPrintJob(void);
};

//РЕАЛИЗАЦИЯ

// CrystalView.cpp : implementation file
//

#include "stdafx.h"
//#include "CrystalView.h"
#include ".\crystalview.h"


// CCrystalView

//IMPLEMENT_DYNCREATE(CCrystalView, CView)

CCrystalView::CCrystalView()
{ m_CRpFilePath.Empty();
m_pJob=NULL;
}

CCrystalView::~CCrystalView()
{

}

//BEGIN_MESSAGE_MAP(CCrystalView, CView)
// ON_WM_DESTROY()
//END_MESSAGE_MAP()


// CCrystalView drawing
/*
void CCrystalView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}


// CCrystalView diagnostics

#ifdef _DEBUG
void CCrystalView::AssertValid() const
{
CView::AssertValid();
}

void CCrystalView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
*/
// Имеется-ли задание на печать
bool CCrystalView::isPrintJobStarted(void)
{ return (m_pJob!=NULL);
}

// Завершение задания на печать
void CCrystalView::ClosePrintJob(void)
{ if (isPrintJobStarted())
{
// m_pJob->IsJobFinished()
m_pJob->Close();
m_Engine.RemoveJob(m_pJob);
m_pJob=NULL;
}
}

//Вывод отчёта на печать из OnPreparePrinting
BOOL CCrystalView::SetPrintReport(CPrintInfo* pInfo)
{ BOOL retval=pInfo->m_bContinuePrinting;
if (!retval){return retval;}
retval=!retval;
pInfo->m_bContinuePrinting=retval;//Подавелние MFC вывода на печать
//Очистка тек. Печати
ClosePrintJob();
m_Engine.Close();
retval=m_Engine.Open();
if (retval)
{ m_pJob=m_Engine.OpenJob(m_CRpFilePath);
if (m_pJob==NULL){retval=FALSE;return retval;}//Проверка открытия задачи
{ retval=TRUE;
//Настройка параметров печати
CRPEPrintOptions PrintOptions;
m_pJob->GetPrintOptions(&PrintOptions);
LPDEVMODE pDevMode=pInfo->m_pPD->GetDevMode();
PrintOptions.m_nReportCopies=(pDevMode!=NULL)?pInfo->m_pPD->GetCopies():1;
PrintOptions.m_startPageN=pInfo->GetMinPage();
PrintOptions.m_stopPageN=pInfo->GetMaxPage();
m_pJob->SetPrintOptions(&PrintOptions);
//Установка принтера
m_pJob->SelectPrinter( pInfo->m_pPD->GetDriverName() //Драйвер
,pInfo->m_pPD->GetDeviceName() //Принтер
,pInfo->m_pPD->GetPortName() //Порт
,pDevMode //Параметры принтера
);//Конец "Установка принтера"
// pJob->SetPrintDate(2010,2,15);
//m_pJob->SetReportTitle("Заголовок отчёта HEADER OF REPORT");
} //Конец "Настройка параметров печати"

if (pInfo->m_bPreview)//Предварительный просмотр?
{ {//Настройка окна предв. просмотра
CRPEWindowOptions RPEOptions;
m_pJob->GetWindowOptions(&RPEOptions);
RPEOptions.m_hasPrintSetupButton=1;
RPEOptions.m_hasSearchButton=1;
RPEOptions.m_hasProgressControls=1;
RPEOptions.m_hasRefreshButton=1;
//RPEOptions.m_canDrillDown=1;
RPEOptions.m_hasGroupTree=1;
m_pJob->SetWindowOptions(&RPEOptions);
m_pJob->ShowPrintControls(TRUE);//Выяснить

RECT rctSize,rctSize2;
rctSize.bottom=rctSize2.bottom=0;
rctSize.left=rctSize2.left=0;
rctSize.right=rctSize2.right=0;
rctSize.top=rctSize2.top=0;
DWORD wndStyle=NULL;

CWnd* pMainWnd=NULL;
try{
pMainWnd=AfxGetMainWnd();
}catch(...)
{pMainWnd=NULL;}
if (pMainWnd!=NULL)
{
pMainWnd->GetWindowRect(&rctSize);
rctSize.left=rctSize.left<0?0:rctSize.left;//Если окно Распахнуто координаты угла м.б.<0
rctSize.top=rctSize.top<0?0:rctSize.top;
pMainWnd->GetClientRect(&rctSize2);
wndStyle=pMainWnd->GetStyle();
}
pMainWnd=NULL;
retval=m_pJob->OutputToWindow(_T("")//_T("Заголовок")
,rctSize.left,rctSize.top,rctSize2.right,rctSize2.bottom
,wndStyle,pMainWnd);
}//Конец "Настройка окна предв. просмотра"

}
else//Печать на принтер
{retval=m_pJob->OutputToPrinter((pInfo->m_pPD->GetDevMode()!=NULL)?pInfo->m_pPD->GetCopies():1);}
CRPEPrintOptions PrintOptions;
m_pJob->GetPrintOptions(&PrintOptions);
}
return retval;
}

void CCrystalView::Empty()
{
m_CRpFilePath.Empty();
m_pJob=NULL;
}
// Старт вывода на печать (поале Print Report)
BOOL CCrystalView::StartPrintJob(void)
{ BOOL retval=isPrintJobStarted();
if (retval)
{retval=m_pJob->Start();}//Печать/Предв. просмотр
return retval;
}

//ПРИМЕР ВЫЗОВА
if (retval)//Форирование, в памяти, DBF-файла прошло без проблем
{retval=StartReport(&DbfCreator,IDS_PRINT_BALLS_FILENAME/*Идентификатор строки содержащей имя .rpt - файла выводимого на печать*/,pInfo);}
...
Рейтинг: 0 / 0
Crystal reports VS 2005
    #34011185
_traveller_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут поковырял... Походу все что нужно лежит в
C:\Program Files\Common Files\Business Objects\2.7\Bin\

Пока смог только запустить готовый отчет. Делал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#import "C:\craxddrt.dll" no_namespace
...

try {
     ...
     HRESULT hr = S_OK;
     
     IApplicationPtr pApp;
     hr = pApp.CreateInstance(__uuidof(Application));

     if (FAILED(hr)) _com_issue_error(hr);

     IReportPtr pRpt;
     pRpt = pApp->OpenReport(_bstr_t("D:\\Documents\\Visual Studio 2005\\Projects\\rep1.rpt"));

     m_CRViewer.put_ReportSource(pRpt);
     m_CRViewer.ViewReport();

}
catch(const _com_error& e)
{
     ...
}

Все отлично. Отображается отчет с предустановленным рекордсетом. Но мне в идеале нужно строить отчет динамически (определять поля). Или хотябы подставлять в отчет свой ADODB::Recordset.

Делал через IDatabase интерфейс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
     _bstr_t ConnStr = "Provider=SQLOLEDB; Server=SKYNET3\\SKYNET;Database=Northwind; uid=sa; pwd=welcome;";

     _ConnectionPtr pConn;
     pConn.CreateInstance(__uuidof(Connection));
     pConn->Open(ConnStr, "", "", adConnectUnspecified);
     
     _CommandPtr pCmd;
     pCmd.CreateInstance(__uuidof(Command));
     pCmd->ActiveConnection = pConn;
     pCmd->CommandType = adCmdText;
     pCmd->CommandText = "select ProductName, QuantityPerUnit, UnitPrice, UnitsInStock from products where ProductName like 'S%'";
		
     IApplicationPtr pApp;
     hr = pApp.CreateInstance(__uuidof(Application));

     if (FAILED(hr)) _com_issue_error(hr);

     IReportPtr pRpt;
     pRpt = pApp->OpenReport(_bstr_t("D:\\Documents\\Visual Studio 2005\\Projects\\rep1.rpt"));

     IDatabasePtr pDB;

     pRpt->get_Database((IDatabase**) &pDB);
     
     VARIANT var, var2;

     VariantInit(&var);
     VariantInit(&var2);
     var.vt = VT_DISPATCH;
     var.pdispVal = (IDispatch*)pConn;
     var2.vt = VT_DISPATCH;
     var2.pdispVal = (IDispatch*)pCmd;

     hr = pDB->AddADOCommand(var, var2);

     m_CRViewer.put_ReportSource(pRpt);
     m_CRViewer.ViewReport();

Выдает ошибку о том что сервер не существует.
Вопрос. Помогите кто нибудь с инфой по этим интерфейсам. Неверю что никто не сталкивался.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Crystal reports VS 2005
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]