none
VARIOS COMMANDS NO CRYSTAL REPORTS 2010 [VB.NET] RRS feed

  • Pergunta

  • Olá amigos... a tempos venho encontrado problema ao usar o crystal reposts com vb.net 2010.

    Como faço para passar varios comands no crystal reports?
    eu monto o report com conexão pelo ADO(RDB) e insiro os camandos (SQL)

    no VB6 eu passava apenas o 1 SQL ( comand principal) mudava a fonte da base de dados pelo DSN e o crystal exibia normalmente.

    e agora no VBnet? como deve proceder?

    desde já agradeço
    Kleisson Maximiano de Oliveira Softmax soluçoes em Sistema
    domingo, 17 de julho de 2011 17:29

Todas as Respostas

  • Você deseja alimentar os parâmetros de um relatório ou apenas passar os parâmetros de um SQLCommand?
    "Mas a persistência é o que leva a perfeição."
    segunda-feira, 18 de julho de 2011 14:50
  • Obrigado leonardo pelo interesse.

    desejo alimentar o Crystal reports com SQLCOMMAND.

     


    Kleisson Maximiano de Oliveira Softmax soluçoes em Sistema
    segunda-feira, 18 de julho de 2011 15:27
  • Maxcim, você pode executar sua consulta e alimentar um DataSet, depois vincular o ReportViewer (acredito que está usando esse componente) pela propriedade ReportSource.

    Por exemplo:

    Dim SQLQuery, stringConexao As String
    
    stringConexao = "..."
    SQLQuery = "SELECT ... FROM ... "
    
    Dim minhaConexao As New SqlConnection(stringConexao)
    Dim dap         As New DataAdapter(SQLQuery, minhaConexao)
    Dim ds          As New DataSet
    Dim relRelatorio   As New CrystalReport
    
    dap.Fill(ds, "Resultado")
    relRelatorio.SetDataSource(ds.Tables("Resultado"))
    
    ReportViewer.ReportSource = relRelatorio
    ReportViewer.Refresh()
    



    "Mas a persistência é o que leva a perfeição."
    segunda-feira, 18 de julho de 2011 17:48
  • Justamente, leonardo, O processo é igual a esse!  porem no relatório eu tenho a:

    •     SQLquery dos dados que quero exibir. 
    •     SQLquery dos dados da empresa.  
    •     SQLquery dos dados  adicionais  ( rodapé do relatório). 

     

    no Vb6, eu criava o relatorio no crystal XI  ( no modo de conenxão pelo ODBC  usando o DSN)  colocava a qyery principal ( a que chamarei pelo VB) e tbm as querys adcionais  ( com relacionamento ou não).

    ao chamar o report pelo VB6 eu passavao DNS do banco.. e a query principal. e tudo funcionava.

     

    Agora No VBNET 2010,  se passo apenas a query principal , o relatorio ignora as demais querys  exibindo o corpo do relatorio, sem os dados do cabeçalho ( dados empresa_ e nem do radapé ( dados Adcionais).

     

    assim tbm foi tentado.. abrindo o DATASET com todos os camandos embutidos no Crystal reports


    crReportDocument.Database.Tables("Cliente").SetDataSource(ds.Tables("Cliente"))
    crReportDocument.Database.Tables("Cli_Cob").SetDataSource(ds.Tables("Cli_Cob"))
    crReportDocument.Database.Tables("DE").SetDataSource(ds.Tables("DE"))
    crReportDocument.Database.Tables("DA").SetDataSource(ds.Tables("DA"))

     

    mesmo assim. não funcoina!

     


    Kleisson Maximiano de Oliveira Softmax soluçoes em Sistema
    segunda-feira, 18 de julho de 2011 18:00
  • Entendo. Esses seus demais dados são subreports ou fazem apenas parte de um grupo do relatório?
    "Mas a persistência é o que leva a perfeição."
    segunda-feira, 18 de julho de 2011 18:04
  • são parte do report principal.

     DE   são daos da empresa ( razão, logotipo, endereço),

     DA são dados adcionais.. ( emial do departamento de compras, comdição para forercimento. obs. etc)

    CLIENTE ( query principal) dados do cliiente

    Cli_Cob  são dados de cobrança do cliente.

     

    Grato pelo atenção.


    Kleisson Maximiano de Oliveira Softmax soluçoes em Sistema
    segunda-feira, 18 de julho de 2011 18:28
  • Bom acredito que a forma mais simples então seja de trabalhar com parâmetros. Cada um desses campos no seu cabeçalho é um parâmetro no Crystal, por exemplo: @Razao, @EmailDepartamentoCompras, etc.

    Tendo esses parâmetros você pode criar uma rotina específica ou genérica (que será usada para outros relatórios) de passagem de parâmetro para o Crystal. Fiz um exemplo aqui de uma rotina genérica:

    Public Sub lsubCarregaRelatorio(ByVal lobjValorParametros() As Object, ByVal lstrNomeParametros() As String, ByVal lstrNomeProcedure As String)
    
      Dim lrptRelatorio  As New ReportDocument
      Dim lconInfo   As New ConnectionInfo
      Dim ltblInfo   As New TableLogOnInfo
      Dim lparParametro As ParameterFieldDefinition
      Dim lfilCampo   As ParameterFieldDefinitions
      Dim ldisDiscrete  As ParameterDiscreteValue
      Dim lvalValor   As ParameterValues
    
      '# Passa os dados para conexão
      lconInfo.DatabaseName = nomeMeuBanco
      lconInfo.ServerName = nomeMeuServer
      lconInfo.UserID = meuUsuario
      lconInfo.Password = minhaSenha
    
      '# Carrega o arquivo rpt
      lrptRelatorio.Load("caminhoMeuRelatorio")
    
      '# Realiza a conexão das tabelas do relatório
      '# Apenas usado caso exista mais de uma tabela no relatório, o que normalmente é feito
      For Each ltblTable As Table In lrptRelatorio.Database.Tables
       ltblInfo.ConnectionInfo = lconInfo
       ltblTable.ApplyLogOnInfo(ltblInfo)
      Next
    
      '# Recebe os parâmetros existentes no rpt
      lfilCampo = lrptRelatorio.DataDefinition.ParameterFields
    
      '# Loop que irá configurar cada parâmetro
      For lintContador As Integer = 0 To UBound(lobjValorParametros)
    
       lparParametro = lfilCampo.Item(lstrNomeParametros(lintContador))
       lvalValor = lparParametro.CurrentValues
       ldisDiscrete = New ParameterDiscreteValue
    
       '# Verifica o tipo de dado para passar o valor correto
       If IsDate(lobjValorParametros(lintContador)) Then
        ldisDiscrete.Value = IIf(lobjValorParametros(lintContador) = "00:00:00" Or lobjValorParametros(lintContador) = "0001-01-01 00:00:00", "1899-12-30", lobjValorParametros(lintContador))
    
       ElseIf IsNumeric(lobjValorParametros(lintContador)) Then
        ldisDiscrete.Value = lobjValorParametros(lintContador)
    
       Else
        ldisDiscrete.Value = IIf(Trim(lobjValorParametros(lintContador)) = "NULL", DBNull.Value, Trim(lobjValorParametros(lintContador)))
    
       End If
    
       '# Adiciona e confirma os valores
       lvalValor.Add(ldisDiscrete)
       lparParametro.ApplyCurrentValues(lvalValor)
      Next
    
      meuReportViewer.ReportSource = lrptRelatorio
      meuReportViewer.Refresh()
    
     End Sub


    Sendo que lobjValorParametro é um array que contém os valores dos parâmetros numa ordem que você especificar. O lstrNomeParametros é um array que contém o nome dos seus parâmetros (@Razao, @EmailDepartamentoCompra, etc), e está na mesma ordem do array lobjValorParametro. Exemplo:

    lstrNomeParametros       lobjValorParametro

    "@Razao"                     "minha empresa S/A"

    "@EmailDepartamento"  "compras@minhaempresaSA.com"

    E assim sucessivamente. Esse é um snippet que tenho faz um tempo, e deve auxiliá-lo na resolução do problema. Com esses valores atribuidos, o Crystal irá executar a Query que está no menu Crystal Reports -> Show SQL Query, substituindo os valores e retornando-as para o Viewer.


    "Mas a persistência é o que leva a perfeição."
    segunda-feira, 18 de julho de 2011 18:41