본문 바로가기

work/crystal_reports

코딩 사용 방식 비교 - 예)리포트 제어

사용 방식별 코드 비교
다음 코드들은 리포트 제어의 가장 기본적인 방법에 대한 비교입니다.

API 엔진(Crystal Report Print EngineAPI) 코딩
'일반 선언
Public MainJob As Integer
Public SubJob As Integer

Private Sub Form_Load()
'Crystal Engine 열기
If PEOpenEngine() = 0 Then
   MsgBox "PEOpenEngine 열기에 실패했습니다!" & Str$(PEGetErrorCode(0))
End If

'리포트 열기
Dim FilePath As String
FilePath = App.Path & "\API_to_RDC.rpt" & vbNullChar
MainJob = PEOpenPrintJob(FilePath)

If MainJob = 0 Then
MsgBox "PEOpenPrintJob 열기에 실패했습니다!" & Str$(PEGetErrorCode(0))
End If

'database 소스 연결
Dim tableLocation As PETableLocation

tableLocation.StructSize = PE_SIZEOF_TABLE_LOCATION
tableLocation.Location = App.Path & "\xtreme.mdb" & vbNullChar

'첫번 째 테이블에 연결
If PESetNthTableLocation(MainJob, 0, tableLocation) = 0 Then
MsgBox "PESetNthTableLocation: " & Str$(PEGetErrorCode(MainJob))
End If

'메인 리포트의 parameter 값 지정
Dim paramInfo As PEParameterFieldInfo
Dim valueInfo As PEValueInfo

paramInfo.StructSize = PE_SIZEOF_PARAMETER_FIELD_INFO
valueInfo.StructSize = PE_SIZEOF_VALUE_INFO

If PEGetNthParameterField(MainJob, 0, paramInfo) = 0 Then
MsgBox "PEGetNthParameterField Failed: " & Str$(PEGetErrorCode(MainJob))
Else

'set default values
paramInfo.DefaultValueSet = 1
paramInfo.CurrentValueSet = 1
paramInfo.Prompt = "" & Chr$(0)

If paramInfo.valueType = 4 Then
  valueInfo.valueType = PE_PF_STRING
  valueInfo.viString = "This is parameter1" & Chr$(0)
End If

If PEConvertVInfoToPFInfo(valueInfo, valueInfo.valueType, _ 
   & paramInfo. currentValue)  = 0 Then
  MsgBox "PEConvertVInfoToPFInfo Failed: " & Str$(PEGetErrorCode(MainJob))
End If

If PESetNthParameterField(MainJob, 0, paramInfo) = 0 Then
  MsgBox "PESetNthParameterField Failed: " & Str$(PEGetErrorCode(MainJob))
End If
End If

' 서브 리포트 작업
SubJob = PEOpenSubreport(MainJob, "Subreport1")

If SubJob = 0 Then
MsgBox "PEOpenPrintJob failed: " & Str$(PEGetErrorCode(MainJob))
Else
tableLocation.StructSize = PE_SIZEOF_TABLE_LOCATION
tableLocation.Location = App.Path & "\xtreme.mdb" & vbNullChar
'서브 리포트의 첫 번 째 테이블에 연결
If PESetNthTableLocation(SubJob, 0, tableLocation) = 0 Then
  MsgBox "PESetNthTableLocation Failed: " & Str$(PEGetErrorCode(SubJob))
End If

If PESetFormula(SubJob, "Formula1", "'This is Subreport1'") = 0 Then
  MsgBox "PESetFormula Failed: " & Str$(PEGetErrorCode(SubJob))
End If
End If

' 리포트 열기
If PEOutputToWindow(MainJob, "", 0, 50, 800, 350, 0, 0) = 0 Then
MsgBox "PEOutputToWindow Failed: " & Str$(PEGetErrorCode(MainJob))
End If

If PEStartPrintJob(MainJob, 1) = 0 Then
MsgBox "PEStartPrintJob Failed: " & Str$(PEGetErrorCode(MainJob))
End If

End Sub

MsgBox "PEOutputToPrinter Failed: " & Str$(PEGetErrorCode(MainJob))
End If
If PEStartPrintJob(MainJob, 1) = 0 Then
MsgBox "PEStartPrintJob Failed: " & Str$(PEGetErrorCode(MainJob))
End If


OCX(Crystal ActiveX (OCX) control) 코딩
리포트를 사용하기 위해 Crystl32.ocx를 사용합니다.

Private Sub Form_Load()
'리포트 열기
CrystalReport1.ReportFileName = App.Path &  \OCX_to_RDC.rpt"

'데이터베이스 소스 지정
CrystalReport1.DataFiles(0) = App.Path &  \xtreme.mdb"
'메인 리포트의 parameter 값 지정
CrystalReport1.ParameterFields(0) = "Param1;Main Report Param;True"

'레코드 선택 수식 지정
CrystalReport1.ReplaceSelectionFormula ="{Customer.Last Year s Sales} < 50000.00"

'서브 리포트 제어를 위해 열기
CrystalReport1.SubreportToChange = "Sub1"

'서브 리포트의 데이터베이스 소스 지정
CrystalReport1.DataFiles(0) = App.Path &  \xtreme.mdb"

'서브 리포트의 수식 필드 내용 변경
CrystalReport1.Formulas(0) = "Formula1= " & " Subreport Formula " 

'메인 리포트로 제어
CrystalReport1.SubreportToChange = ""

'출력을 모니터로
CrystalReport1.Destination = crptToWindow

'리포트 미리보기 창 열기
CrystalReport1.Action = 1

End Sub


Automation Server 방식
                  (Crystal Report Automation Server) 코딩
'Automation 방식으로 사용하기 위한 선언
Dim CrystalApp As CRPEAuto.Application
Dim CrystalReport As CRPEAuto.Report
Dim CrystalSubreport As CRPEAuto.Report
Dim CrystaTable As CRPEAuto.DatabaseTable
Dim CrystaParameter As CRPEAuto.ParameterFieldDefinition
Dim CrystaFormula As CRPEAuto.FormulaFieldDefinition
Dim CrystalExportOptions As CRPEAuto.ExportOptions

Private Sub Form_Load()
'CPEAUT application 생성
Set CrystalApp = CreateObject("Crystal.CRPE.Application")

'리포트 열기
Set CrystalReport = CrystalApp.OpenReport(App.Path &  \CPEAUT_to_RDC.rpt")

'모든 테이블에 소스 지정을 위해 Loop 사용
For Each CrystaTable In CrystalReport.Database.Tables
CrystaTable.Location = App.Path & "\xtreme.mdb"
Next

''parameter 값 지정
Set CrystaParameter = CrystalReport.Parameters.Item(1)
CrystaParameter.SetCurrentValue "Main Report Param", crStringField

'레코드 선택 수식 지정
CrystalReport.RecordSelectionFormula = "{Customer.Last Year s Sales} < 50000.00"

'서브 리포트 "Sub1"을 사용하기 위해 열기
CrystalSubreport = CrystalReport.OpenSubreport("Sub1")
'서브 리포트의 모든 테이블에 소스 지정을 위해 Loop 사용
For Each CrystaTable In CrystalSubreport.Database.Tables
CrystaTable.Location = App.Path & "\xtreme.mdb"
Next

'서브 리포트의 수식 필드 내용 변경
Set CrystalFormula = CrystalReport.FormulaFields
CrystalFormula.Text = " Subreport Formula " 
'리포트 미리보기 창 열기
CrystalReport.Preview "My Report"

End Sub

RDC(Report Designer Component) 코딩
'리포트 파일을 RDC 방식으로 사용하기 위한 선언
Dim crxApplication As New CRAXDRT.Application

'리포트 파일을 열기 위한 선언
Public Report As CRAXDRT.Report

Private Sub Form_Load()
' DatabaseTable Object 선언
Dim crxDatabaseTable as craxdrt.DatabaseTable

'서브 리포트 사용을 위한 Report object 선언
Dim crxSubreport As CRAXDRT.Report

'리포트 열기
Set Report = crxApplication.OpenReport (App.Path & "/API_to_RDC.rpt", 1)

'모든 데이터 테이블을 열기 위해 Loop를 사용
For Each crxDatabaseTable In Report.Database.Tables
crxDatabaseTable.Location = App.Path & "/xtreme.mdb"
Next crxDatabaseTable

'Parameter 값 지정
Report.ParameterFields.Item(1).AddCurrentValue "Main Report Parameter"

'서브 리포트 제어를 위해 서브 리포트 열기
Set crxSubreport = Report.OpenSubreport("Sub1")

'서브 리포트의 모든 데이터 테이블을 지정하기 위해 Loop를 사용
For Each crxDatabaseTable In crxSubreport.Database.Tables
crxDatabaseTable.Location = App.Path & "/xtreme.mdb"
Next crxDatabaseTable

'서브 리포트의 수식 필드 내용 지정
CrxSubreport.FormulaFields.Item(1).Text = " Subreport Formula " 

'리포트를 보기 위해 Form2 폼을 연다.
Form2.Show
End Sub

RDC 방식에서는 리포트를 보거나 제어하기 위해 크리스탈 리포트 뷰어 컨트롤이라는 컴포넌트를 사용합니다. 이 뷰어는 자신의 폼에 두고 사용할 수도 있고, 다른 폼에 올려놓고 사용을 할 수 있습니다. 예를 들어 Form2 폼에 이 컴포넌트를 올려놓고 작업을 할 수가 있는데, 다음은 이때의 Form2 폼의 코드입니다.

Private Sub Form_Load()

'리포트 뷰어 컴포넌트에 리포트 소스를 지정
CRViewer91.ReportSource = Form1.Report

'리포트 보기
CRViewer91.ViewReport

End Sub

Private Sub Form_Resize()

' 폼의 사이즈가 변경되었을 때 뷰어 크기를 폼 크기에 맞추기
CRViewer91.Top = 0
CRViewer91.Left = 0
CRViewer91.Height = ScaleHeight
CRViewer91.Width = ScaleWidth

End Sub