티스토리 뷰

VC에서 크리스탈리포트를 사용하자
VB에서는 크리스탈리포트를 사용하기가 쉬운데 비하여
VC에서는 사용하기가 까다롭죠!
그중에서도 리포트에서 참조하는 DB 파일의 위치가 바뀌면 ㅠㅠ
리포트가 DB 파일이 어쩌구저쩌구 하면서 리포트가 제대로 표시안되구!
샘플은 겁나게 어렵구! 필요한 자료 찾기도 힘들구 ㅠㅠ
어케해야 VB에서 처럼 데이터컨트롤을 지정해서 DB 파일의 위치와
상관없이 리포트를 구성할 수 있는가라는 생각을 하게됬습니다.
ADO를 이용해서 ADO::ReportsetPtr를 리포트에 넘겨줌으로써
레코드셋에 있는 내용을 리포트 파일에 적용할 수 있습니다.
주의할 점은 리포트 파일에서 표시되는 레코드셋의 데이터 멤버의 각 필드 이름과
ADO::레코드셋의 필드 이름이 동일하여야한 크리스탈리포트에 레코드셋의 내용이 정확하게 반영됩니다.
이름이 다르면 적용이 안되므로 조심하세요
그리고 미리보기를 사용하기 위해서는
VC에서 프로젝트-Add To Project - Component And Control 메뉴를 선택하고
크리스탈리포트 OCX를 프로젝트에 삽입하셔야합니다.
그리스탈리포트의 CRAXDRT 라이브러리에서는 미리보기가 지원이 안되더군요
글구 크리스탈리포트 제작사 샘플에서도 마찬가지로 OCX를 임포트해서 구현했습니다.
자세한 내용은 포함된 샘플 프로그램을 보구 참조하세요

1.크리스탈리포트 파일을 작성시
Data Explorer 대화상자에서 More Data Source-Active Data-Active Data(ADO)를 선택하여
리포트 파일을 만듭니다.

2.리포트 내용을 만들구요

3.크리스탈 리포트에서 File-Save Data Width Report 항목에 체크 표시가 되어있다면
체크표시를 없애고 파일 저장

4.대망의 VC로 크리스탈리포트를 사용하는 프로그램 작성
- 기본적으로 클리스탈 리포트를 사용하기 위하여 필요한 정의문은 첨부된 소스를 참조하세요
- 중요부분

ADODB::_ConnectionPtr Connection;
Connection.CreateInstance("ADODB.Connection");

ADODB::_RecordsetPtr pRs;
pRs.CreateInstance("ADODB.Recordset"); //질의 결과를 저장하는 레코드셋이다.

_variant_t vtDummy;
vtDummy.Clear();
vtDummy.vt = VT_EMPTY;
CRAXDRT::IReportPtr m_pReport;//리포트에대한 인텊이스 포인터

// connection string and query 만들기
try{
m_pReport = m_pReportApp->OpenReport( _bstr_t( (LPCTSTR) m_strReportFilePath ), &vtDummy ); //리포트 파일을 연다.

//ADO를 이용하여 데이터베이스에 접속한다.
if( m_strConnection != "" )
Connection->Open( _bstr_t( (LPCTSTR) m_strConnection ), _bstr_t(""), _bstr_t(""), ADODB::adConnectUnspecified);

//rs
if( m_strQuery != "" ) //리포트에 넘겨줄 데이터를 질의하여 레코드셋에 저장한다.
{
pRs->Open( _variant_t( _bstr_t( (LPCTSTR) m_strQuery ) ), _variant_t( (IDispatch*) Connection),
ADODB::adOpenStatic, ADODB::adLockOptimistic, ADODB::adOpenRecordUnspecified );

//리포트에 레코드셋을 넘준다.
m_pReport->Database->SetDataSource( _variant_t( (IDispatch*) pRs ), vtDummy, vtDummy);
m_pReport->Database->Verify();//리포트에게 데이터를 검증하라고 한다.
}
}
catch( _com_error e )
{
TRACE("\n" + e.Description() );
return;
}

if( IsWindow( m_Preview.GetSafeHwnd() ) )
{
m_Preview.SetReportSource( m_pReport ); //미리보기창에 리포트 포인터를 넘겨준다.이 짓을 해야만 미리보기에 리포트 파일이 보인다.
m_Preview.ShowFirstPage();//미리보기에 첫번째 페이지를 보이라고 설정한다.
m_Preview.ViewReport();//미리보기를 화면에 표시한다.
}

if( m_pReport != NULL )
m_pReport.Release(); //리포트 포인터는 더이상 필요 없으므로 해제한다.

반응형
댓글