VB - CRYSTAL

LSCHIAVINI 24/11/2006 13:48:46
#186163
Boa tarde...

criei um relatório no Crystal 9 sem um datasource setado...
após isso tentei passar um recordset como datasource:

Dim rCrApplication As New CRAXDDRT.Application
Dim rCrReport As CRAXDDRT.Report
Set rCrReport = rCrApplication.OpenReport("C:    estecr9.rpt")
rs.Open "Select nome_pessoa, codigo FROM cad_Cliente where Codigo < 100", BdContas, dOpenForwardOnly, adLockReadOnly
If Not rs.EOF Then
rCrReport.Database.SetDataSource rs
End If
Crystal.ReportSource = rCrReport
Crystal.ViewReport

só que está dando um erro: subscript out of range
então qd eu adiciono um datasource no relatório e tento passar o recordset não acontece mais o erro
gostaria de saber se tem que criar o relatorio com um datasource diferente ou sem um datasource
como posso fazer isso......?

obrigado
USUARIO.EXCLUIDOS 26/11/2006 12:59:33
#186267
Eu uso RDC com o CR9 (Active X).
Eu coloco um form no projeto VB com nome: frmCrystalViewer
Uso também o RPT externo.
No RPT está a referência ao BD que será usado no Relatório.
Já no projeto VB eu passo o CAMINHO do BD que será usado para gerar o Relatório. Isso resolve o problema, ou seja, vc tem um BD de testes para crir e testar o RPT (cujo caminho está gravado junto com o RPT) e tem o BD de produção cujo caminho é passado em tempo de execução do seu programa VB.

Segue o código do frmCrytalViewer

Option Explicit

' Crystal Reports Aplicacao
Dim crxApp As New CRAXDRT.Application
' Crystal Reports Relatorio
Dim crxRelatorio As CRAXDRT.Report

Private Sub Form_Load()

' Mouse Com Ampuleta durante Preparo do Relatorio
Screen.MousePointer = vbHourglass

' Cria o Objeto "Crystal Reports Application"
Set crxApp = CreateObject("CrystalRuntime.Application")

' Cria o Objeto Report
' Usando o Metodo ".OpenReport" do Objeto "Crystal Reports Application"
' Abre o Relatorio Externo .RPT passando caminho e nome do arquivo
Set crxRelatorio = crxApp.OpenReport(strCaminhoRPTs & "\" & strNomeRelatorioRPT)

' ReDefine Localizacao no BD no RPT
crxRelatorio.Database.Tables(1).Location = strCaminhoBD & "\" & strNomeBD

' Descarta dados salvos no arquivo RPT se for o caso
' Assegura que o Relatorio sera impresso com dados NOVOS de acordo com o RecordSet passado
crxRelatorio.DiscardSavedData

' Aplica FILTRO SQL - Nao Suportado por DAO DataBase
crxRelatorio.SQLQueryString = strSQL

' Criar objeto ADO RecordSet
Set rstRelatorio = New ADODB.Recordset

' Abre ADO RecordSet de acordo com comando SQL passado - strSQL
rstRelatorio.Open strSQL, cnCeramica, adOpenStatic, adLockReadOnly

' Passa RecordSet para o Relatorio RPT
crxRelatorio.Database.SetDataSource rstRelatorio

' Passa Titulo do Relatorio para o arquivo RPT
crxRelatorio.ReportTitle = strTituloRel

' Passao o RecordSet (ReportSource) para o Controle "CrViewer" e Mostra Relatorio
crxViewer.ReportSource = crxRelatorio
crxViewer.ViewReport

' Abre Relatorio em formato Tela Cheia
frmCrystalViewer.WindowState = vbMaximized

' Loop Enquanto o Relatorio eh Visualizado pelo Usuario
' Usando "DoEvents" permite que o Sistema Operacional tenha
' Controle durante a Visualizacao do Relatorio
While crxViewer.IsBusy
DoEvents
Wend

' Mostra Relatorio com 100% de Zoom
crxViewer.Zoom 100
Screen.MousePointer = vbDefault

End Sub


Private Sub Form_Resize()

' Ajusta o "CrViewer" no form quando tamanho eh alterado
crxViewer.Top = 0
crxViewer.Left = 0
crxViewer.Height = ScaleHeight
crxViewer.Width = ScaleWidth

End Sub


Private Sub Form_Unload(Cancel As Integer)
Set crxRelatorio = Nothing
Set crxApp = Nothing
' Descarrega o Form
frmCrystalViewer.Hide
Unload Me
End Sub


At,
LSCHIAVINI 29/11/2006 09:49:55
#186898
certo...
ainda tenho algumas dúvidas...
entao, para eu poder passar um recordset como datasource para o relatório, eu necessariamente devo setar um database para o relatório qd o crio?


eu quero fazer uma tela que seja genérica para visualização de relatórios....
eu queria saber se tem como criar um relatório sem database, inserir campos nele e depois passar um recordset como datasource contendo o que seria o database do relatório, entende?

mais uma vez, mto orbigado....

Tópico encerrado , respostas não são mais permitidas