Ir para conteúdo
Fórum Script Brasil
  • 0

Passando datatable para Crystal


Xistyle

Pergunta

Pessoal, boa tarde!

Tenho uma dúvida chata com o Crystal. Eu e ele não nos damos muito bem, pra falar a verdade...

Tenho uma aplicação que realiza dois tipos de pesquisa: local e remota via webservice. Tenho um relatório que está funcional quando a pesquisa é feita localmente: passo os parâmetros dinamicamente em tempo de execução e tá chique!

O problema ocorre quando vou gerá-lo remotamente pelo webservice. Decidi executar a procedure e armazenar o retorno dela em um data table. Passo esse data table para o data source do relatório e vinculo o relatório ao Crystal Viewer.

Contudo, ocorre que o relatório ou dá um erro (informando que um campo é inválido) ou são solicitados os parâmetros de entrada da procedure.

Alguém sabe de alguma forma de eu definir que o data source é uma stored procedure já "retornada" (com o select final), evitando a solicitação dos parâmetros?

Segue um código que usei para testes:

Dim lrptRelatorio As New ReportDocument
            Dim cnn As New SqlClient.SqlConnection("Data Source=SERVER;Initial Catalog=BASE;User Id=USER;Password=SENHA;")
            Dim dtb As New DataTable
            Dim exec As New SqlClient.SqlCommand("PRC_REL_PRODUTIVIDADE", cnn)
            Dim DTA As New SqlClient.SqlDataAdapter

            exec.CommandType = CommandType.StoredProcedure

            exec.Parameters.AddWithValue("@I_DTSOLICITACAOINICIAL", IIf(mdatSolicitacaoInicial = "00:00:00" Or mdatSolicitacaoInicial = "0001-01-01 00:00:00", DBNull.Value, CDate(mdatSolicitacaoInicial)))
            exec.Parameters.AddWithValue("@I_DTSOLICITACAOFINAL", IIf(mdatSolicitacaoFinal = "00:00:00" Or mdatSolicitacaoFinal = "0001-01-01 00:00:00", DBNull.Value, CDate(mdatSolicitacaoFinal)))

            exec.Parameters.AddWithValue("@I_DTCONCLUSAOINICIAL", IIf(mdatConclusaoInicial = "00:00:00" Or mdatConclusaoInicial = "0001-01-01 00:00:00", DBNull.Value, CDate(mdatConclusaoInicial)))
            exec.Parameters.AddWithValue("@I_DTCONCLUSAOFINAL", IIf(mdatConclusaoFinal = "00:00:00" Or mdatConclusaoFinal = "0001-01-01 00:00:00", DBNull.Value, CDate(mdatConclusaoFinal)))

            exec.Parameters.AddWithValue("@I_IDTIPODILIGENCIA", mlngIDTipoDiligencia)
            exec.Parameters.AddWithValue("@I_IDSTATUSDILIGENCIA", mlngIDStatusDiligencia)

            exec.Parameters.AddWithValue("@I_CELULA", IIf(Trim(mstrCelula) = "", DBNull.Value, mstrCelula))
            exec.Parameters.AddWithValue("@I_COMARCA", IIf(Trim(mstrComarca) = "", DBNull.Value, mstrComarca))

            exec.Parameters.AddWithValue("@I_OPCAODILIGENCIA", mintOpcaoDiligencia)

            cnn.Open()
            DTA.SelectCommand = exec
            DTA.Fill(dtb)

            lrptRelatorio.Load(lstrCaminho + "Relatorios\relProdutividade.rpt")
            lrptRelatorio.SetDataSource(dtb)

    
            crvVisualizador.ReportSource = lrptRelatorio
            crvVisualizador.Refresh()

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Alguma idéia do que pode estar errado Bruno? Retorna o erro: This field name is not known.

Criei um item DataSet e dentro dele coloquei (pelo Designer) e configurei um DataAdapter, com a Stored Procedure. Esse DataSet chama-se dsProdutividade.

Dim dsProdutividade As New dsProdutividadeTableAdapters.PRC_REL_PRODUTIVIDADETableAdapter
            Dim dtbProdutividade As New dsProdutividade.PRC_REL_PRODUTIVIDADEDataTable
            Dim DTB As New DataTable

            dsProdutividade.Connection.ConnectionString = "Data Source=SERVER;Initial Catalog=DATABASE;User Id=USER;Password=PASSWORD;"

            dsProdutividade.Fill(dtbProdutividade, CDate(mdatSolicitacaoInicial), _
                                                                   CDate(mdatSolicitacaoFinal), _
                                                                   CDate(mdatConclusaoInicial), _
                                                                   CDate(mdatConclusaoFinal), _
                                                                   CInt(mlngIDTipoDiligencia), _
                                                                   CInt(mlngIDStatusDiligencia), _
                                                                   CStr(mstrCelula), _
                                                                   CStr(mstrComarca), _
                                                                   CInt(mintOpcaoDiligencia))

            DTB = dtbProdutividade
            lrptRelatorio.Load(lstrCaminho + "Relatorios\relProdutividade.rpt")
            lrptRelatorio.SetDataSource(DTB)
            
            crvVisualizador.ReportSource = lrptRelatorio
            crvVisualizador.Refresh()

Link para o comentário
Compartilhar em outros sites

  • 0

Não utilize o Adapter fisico, faça via código, crie apenas a estrutura do DataSet mesmo.

AbreConexao();
SqlDataAdapter adapter = new SqlDataAdapter(SuaStringQueExecutaProcedure, StringConexao);
DataSet ds = new DataSet();
adapter.Fill(ds, "SEU_APELIDO");
adapter.Dispose();
FechaConexao();

CrystalDecisions.Web.CrystalReportSource crs = new CrystalDecisions.Web.CrystalReportSource();
crs.Report.FileName = "NomeArquivoRpt";
crs.ReportDocument.SetDataSource(ds);

Tente desta forma.

Abraços...

Link para o comentário
Compartilhar em outros sites

  • 0

Bruno, obrigado pelo exemplo, mas não deu certo. Não apresentou erro algum, contudo é solicitado os parâmetros de entrada da procedure, bem como o login/senha do banco.

Infelizmente eu preciso executar essa procedure e armazená-la localmente, para passar para um datasource de report remoto.

Usei o seguinte código teste:

'# dsProdutividade é o DataSet físico que criei e apenas arrastei a procedure para ele
            Dim dsProdutividade As New dsProdutividade
            Dim dapSQL As SqlClient.SqlDataAdapter

            dapSQL = New SqlClient.SqlDataAdapter("EXEC PRC_REL_PRODUTIVIDADE NULL,NULL, NULL,NULL, NULL,NULL, NULL,NULL, 0", "Data Source=SERVIDOR;Initial Catalog=DATABASE;User Id=USER;Password=SENHA;")
            dapSQL.Fill(dsProdutividade, "RESULTADO")
            dapSQL.Dispose()

            lrptRelatorio.FileName = lstrCaminho & "\Relatorios\relProdutividade.rpt"
            lrptRelatorio.SetDataSource(dsProdutividade)

            crvVisualizador.ReportSource = lrptRelatorio
            crvVisualizador.Refresh()

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

Também não deu certo Bruno, solicitou a entrada de parâmetros. De qualquer forma, como não são filtros obrigatórios no relatório, existe a necessidade de passar esses valores nulos.

Estou procurando material na web, mas tá difícil :/

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, funciona normalmente.

Existem duas formas de abrir o relatório: localmente e remotamente.

Localmente eu passo os valores dos parâmetros dinamicamente, usando ParameterFieldDefinition, ParameterFieldDefinitions, ParameterDiscreteValue e ParameterValues. Funciona sem apresentar erros, com valores ou nulos.

Porém, como não conseguirei realizar a conexão diretamente do relatório da máquina remota em nosso banco de dados, pensei em realizar a pesquisa pelo DataSet.

Essa procedure retorna um select. Atribuindo ele ao DataSet e vinculando ao relatório, funciona sem erros também. Contudo, o relatório ainda pede que os parâmetros sejam passados.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      652k
×
×
  • Criar Novo...