CRYSTAL CONECTANDO COM ADO EM RUN TIME
Saudações:
Vasculhando o fórum, encontrei um tópico postado pelo Sr. CLAYTON http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=84021&varUltimaPagina=1 que explicava uma maneira de usar o Crystal reports usando uma conexão já ativa (ADO). Peguei o exemplo que ele postou e fiz. Só que a versão do Crystal que eu tenho é o 8.0 e a versão do exemplo dele é 8.5. Os objetos que são criados no exemplo dele usam a biblioteca CRAXDdRT e na minha versão do Crystal não tem esta biblioteca, tem uma com o nome ligeiramente similar CRAXDDT e também outra CRAXDRT, o interessante é que com esta diferenças, tanto as minhas bibliotecas quanto as do exemplo dele tem as mesmas classes, os mesmos métodos e as mesmas propriedades. Rodando o meu exemplo, não consegui obter a mesma fucionalidade demonstrada, pois no momento que passo a recordset para o objeto desta forma: crRPT.Database.SetDataSource rs , o procedimento é ignorado, aà o CrViewer carrega o Rpt com todos os registros que estão na tabela em que ele foi vinculado na criação dele e não é isso que quero, quero somente os que coloquei na minha instrução select. Então estou contando com uma luz vinda do pessoal para as seguintes dúvidas:
1. O exemplo que peguei do Sr. CLAYTON só funciona mesmo na versão 8.5?
2. Se funciona na 8.0 o que estou fazendo de errado?
3. Ao desenhar o arquivo rpt tem um procedimento necessário para obter a funcionalidade descrita no exemplo do Sr. CLAYTON?
Quem puder me orientar agradeço. Embaixo tá o meu código:
Dim CnxBD As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Abre o banco
CnxBD.CursorLocation = adUseClient
CnxBD.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\pmark\mrk.mdb;Jet OLEDB:DataBase Password =;"
CnxBD.Open
'Carrega o recordset
Set rs.ActiveConnection = CnxBD
rs.CursorLocation = adUseClient
rs.Source = "select top 10 * from financeiro where cdate(dtrec) >=#01/07/2006#"
rs.Open , , adOpenStatic, adLockReadOnly
If rs.RecordCount = 0 Then
MsgBox "Dados não encontrados.", vbCritical
Set rs = Nothing
Set CnxBD = Nothing
Exit Sub
Else
MsgBox rs.RecordCount & " registros encontrados.", vbInformation
End If
'Declara os objetos do Crystal
Dim crApli As New CRAXDRT.Application ‘-- > Essas são as bibliotecas diferentes
Dim crRPT As New CRAXDDT.Report ‘-- > Essas são as bibliotecas diferentes
'Passa propriedades para o objeto Report Todas elas deram um problema e eu tive que anular principalmente a DiscardSavedData
'crRPT.PaperOrientation = crPortrait
'crRPT.PaperSize = crPaperA4
'crRPT.UseIndexForSpeed = True
'crRPT.DiscardSavedData
'Seta e Abre o Relatorio Externo
Set crRPT = crApli.OpenReport("d:\pmark\finope.rpt")
'Seta o Recordset como base de Dados
crRPT.Database.SetDataSource rs ‘-- > Esse procedimento é como se não ocorresse
'Passa o relatório formado para o visualizador
CRViewer1.ReportSource = crRPT
'Visualiza o Relatorio
CRViewer1.ViewReport
'Fica Dando Loop Até o Crystal Carregar Todos os Dados
'Evitar que o Crystal Abra o Viewer sem os dados estarem
'Totalmente Carregados
Do While CRViewer1.IsBusy
DoEvents
Loop
'Fecha e Mata Todas as Variaveis e Declarcoes
Set rs = Nothing
Set CnxBD = Nothing
Set crRPT = Nothing
Set crApli = Nothing
Vasculhando o fórum, encontrei um tópico postado pelo Sr. CLAYTON http://www.vbmania.com.br/vbmania/vbmforum.php?varMethod=Abrir&varID=84021&varUltimaPagina=1 que explicava uma maneira de usar o Crystal reports usando uma conexão já ativa (ADO). Peguei o exemplo que ele postou e fiz. Só que a versão do Crystal que eu tenho é o 8.0 e a versão do exemplo dele é 8.5. Os objetos que são criados no exemplo dele usam a biblioteca CRAXDdRT e na minha versão do Crystal não tem esta biblioteca, tem uma com o nome ligeiramente similar CRAXDDT e também outra CRAXDRT, o interessante é que com esta diferenças, tanto as minhas bibliotecas quanto as do exemplo dele tem as mesmas classes, os mesmos métodos e as mesmas propriedades. Rodando o meu exemplo, não consegui obter a mesma fucionalidade demonstrada, pois no momento que passo a recordset para o objeto desta forma: crRPT.Database.SetDataSource rs , o procedimento é ignorado, aà o CrViewer carrega o Rpt com todos os registros que estão na tabela em que ele foi vinculado na criação dele e não é isso que quero, quero somente os que coloquei na minha instrução select. Então estou contando com uma luz vinda do pessoal para as seguintes dúvidas:
1. O exemplo que peguei do Sr. CLAYTON só funciona mesmo na versão 8.5?
2. Se funciona na 8.0 o que estou fazendo de errado?
3. Ao desenhar o arquivo rpt tem um procedimento necessário para obter a funcionalidade descrita no exemplo do Sr. CLAYTON?
Quem puder me orientar agradeço. Embaixo tá o meu código:
Dim CnxBD As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Abre o banco
CnxBD.CursorLocation = adUseClient
CnxBD.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\pmark\mrk.mdb;Jet OLEDB:DataBase Password =;"
CnxBD.Open
'Carrega o recordset
Set rs.ActiveConnection = CnxBD
rs.CursorLocation = adUseClient
rs.Source = "select top 10 * from financeiro where cdate(dtrec) >=#01/07/2006#"
rs.Open , , adOpenStatic, adLockReadOnly
If rs.RecordCount = 0 Then
MsgBox "Dados não encontrados.", vbCritical
Set rs = Nothing
Set CnxBD = Nothing
Exit Sub
Else
MsgBox rs.RecordCount & " registros encontrados.", vbInformation
End If
'Declara os objetos do Crystal
Dim crApli As New CRAXDRT.Application ‘-- > Essas são as bibliotecas diferentes
Dim crRPT As New CRAXDDT.Report ‘-- > Essas são as bibliotecas diferentes
'Passa propriedades para o objeto Report Todas elas deram um problema e eu tive que anular principalmente a DiscardSavedData
'crRPT.PaperOrientation = crPortrait
'crRPT.PaperSize = crPaperA4
'crRPT.UseIndexForSpeed = True
'crRPT.DiscardSavedData
'Seta e Abre o Relatorio Externo
Set crRPT = crApli.OpenReport("d:\pmark\finope.rpt")
'Seta o Recordset como base de Dados
crRPT.Database.SetDataSource rs ‘-- > Esse procedimento é como se não ocorresse
'Passa o relatório formado para o visualizador
CRViewer1.ReportSource = crRPT
'Visualiza o Relatorio
CRViewer1.ViewReport
'Fica Dando Loop Até o Crystal Carregar Todos os Dados
'Evitar que o Crystal Abra o Viewer sem os dados estarem
'Totalmente Carregados
Do While CRViewer1.IsBusy
DoEvents
Loop
'Fecha e Mata Todas as Variaveis e Declarcoes
Set rs = Nothing
Set CnxBD = Nothing
Set crRPT = Nothing
Set crApli = Nothing
Eu colocaria no camando SQL em vez de...
assim...
rs.Source = "select top 10 * from financeiro where cdate(dtrec) >= format$(#2006/07/01#, 'yyyy/mm/dd')"
Citação:rs.Source = "select top 10 * from financeiro where cdate(dtrec) >=#01/07/2006#"
assim...
rs.Source = "select top 10 * from financeiro where cdate(dtrec) >= format$(#2006/07/01#, 'yyyy/mm/dd')"
Muito obrigado CLAYTON, valeu também ROBERTOMARQUES pela dica, resolvi o problema seguindo as suas instruções, a princÃpio deu erro também mas passei para mais abaixo a parte das propriedades do objeto Report e consegui fazer funcionar o código ficou assim:
'Declara os objetos do Crystal
Dim crApli As New CRAXDDT.Application ‘-- > Igualei com a debaixo
Dim crRPT As New CRAXDDT.Report ‘-- > Essas são as bibliotecas diferentes
'Seta e Abre o Relatorio Externo
Set crRPT = crApli.OpenReport("d:\pmark\finope.rpt")
'Passa propriedades para o objeto Report
crRPT.PaperOrientation = crPortrait
crRPT.PaperSize = crPaperA4
crRPT.UseIndexForSpeed = True
crRPT.DiscardSavedData
'Seta o Recordset como base de Dados
crRPT.Database.SetDataSource rs ‘-- > Esse procedimento é como se não ocorresse
'Passa o relatório formado para o visualizador
CRViewer1.ReportSource = crRPT
'Visualiza o Relatorio
CRViewer1.ViewReport
'Fica Dando Loop Até o Crystal Carregar Todos os Dados
'Evitar que o Crystal Abra o Viewer sem os dados estarem
'Totalmente Carregados
Do While CRViewer1.IsBusy
DoEvents
Loop
'Fecha e Mata Todas as Variaveis e Declarcoes
Set rs = Nothing
Set CnxBD = Nothing
Set crRPT = Nothing
Set crApli = Nothing
'Declara os objetos do Crystal
Dim crApli As New CRAXDDT.Application ‘-- > Igualei com a debaixo
Dim crRPT As New CRAXDDT.Report ‘-- > Essas são as bibliotecas diferentes
'Seta e Abre o Relatorio Externo
Set crRPT = crApli.OpenReport("d:\pmark\finope.rpt")
'Passa propriedades para o objeto Report
crRPT.PaperOrientation = crPortrait
crRPT.PaperSize = crPaperA4
crRPT.UseIndexForSpeed = True
crRPT.DiscardSavedData
'Seta o Recordset como base de Dados
crRPT.Database.SetDataSource rs ‘-- > Esse procedimento é como se não ocorresse
'Passa o relatório formado para o visualizador
CRViewer1.ReportSource = crRPT
'Visualiza o Relatorio
CRViewer1.ViewReport
'Fica Dando Loop Até o Crystal Carregar Todos os Dados
'Evitar que o Crystal Abra o Viewer sem os dados estarem
'Totalmente Carregados
Do While CRViewer1.IsBusy
DoEvents
Loop
'Fecha e Mata Todas as Variaveis e Declarcoes
Set rs = Nothing
Set CnxBD = Nothing
Set crRPT = Nothing
Set crApli = Nothing
Tópico encerrado , respostas não são mais permitidas