RELATÓRIOS LENTOS!
Tenho percebido o seguinte ocorrido no meu sistema, os relatórios são enormes e para fazer os relatórios eu jogo no banco Acess temporário e de lá só puxo
os campos..
Porém venho percebendo que alguns relatórios há muita lentidão na hora de imprimir, já tentei trabalhar com DataSet Tipado direto no Mysql más não gostei muito achei ainda assim bastante trabalhoso e a cada dia que passa eu fico mais insatisfeito com o Crystal Reports..
Alguém possui uma dica?
Pensei na seguinte solução: eu criar um módulo web de relatórios feito em WebForms mesmo do meu sistema desktop onde a página web será a página do relatório assim irá carregar os dados muito mais rápido do que é hoje com o Crystal Reports.. só que ai tem um porém também tem relatórios que chegam a ser 15 páginas..
Daria certo essa minha idéia? Tive até olhando um plugin postado em algum tópico não lembro qual do JQuery Plugin To Print que seria utilizado também para imprimir o relatório em .PDF.
Abraços!
pois bem, nesse ponto tenho dataset, datatable e o rpt pronto....
faco a query ao banco de dados, e o retorno eu uso pra preencher o datatable....
esse datatable sera o o datasource do rpt
sinceramente fiquei surpreso num projeto grande q gera coisa de 4000 boletos, pois ainda trabalhei essa parte de buscar as informações no banco de dados, fazer os cálculos pra linha digitavel, código de barras, ai o preenchimento do datatable, e tudo mais, dentro de uma thread, o fim dela eu joguei apenas para exibição do rpt já fora da thread secundaria, gostei, não ficou demorado não....
Crie um list com os campos que precisar, e na hora de setar o banco no crystal, set o list, pronto, depois adicione e ou retire o campo que quiser do list sem problemas.
A questão da demora para abrir diminuiu, mas nem tanto, a questão da melhora é a facilidade em manusear os campos.
A demora do crystal para min é compensada pela enorme quantidade de opções que ele oferece, vale o preço.
Inclusive, um exemplo que postei aqui.
fonte
Citação:Eu já disse aqui em outros post, resolvi meus problemas com o crystal reports utilizando objetos list.
Crie um list com os campos que precisar, e na hora de setar o banco no crystal, set o list, pronto, depois adicione e ou retire o campo que quiser do list sem problemas.
A questão da demora para abrir diminuiu, mas nem tanto, a questão da melhora é a facilidade em manusear os campos.
A demora do crystal para min é compensada pela enorme quantidade de opções que ele oferece, vale o preço.
Inclusive, um exemplo que postei aqui.
Fogo é aguentar os cara chato reclamando que tem um delay.. Entendi vou dar uma olhada no exemplo, obrigado
Citação:veja, meus relatórios eu monto da seguinte forma, inicialmente crio um dataset no projeto, e dentro desse um datatable com exatamente os campos q precisarei no relatório, a partir desse dataset e datatable, eu monto o relatório, puxando no caso todos os campos, afinal, tenho q montar o datatable com o mÃnimo possÃvel, não tem pq usar recursos ai, se não usarei na exibição do relatório......
pois bem, nesse ponto tenho dataset, datatable e o rpt pronto....
faco a query ao banco de dados, e o retorno eu uso pra preencher o datatable....
esse datatable sera o o datasource do rpt
sinceramente fiquei surpreso num projeto grande q gera coisa de 4000 boletos, pois ainda trabalhei essa parte de buscar as informações no banco de dados, fazer os cálculos pra linha digitavel, código de barras, ai o preenchimento do datatable, e tudo mais, dentro de uma thread, o fim dela eu joguei apenas para exibição do rpt já fora da thread secundaria, gostei, não ficou demorado não....
Teria um exemplo ou material?
Citação:ja tentou utilizar indexes ?
Não como seria?
@NILSONTRES dei uma olhada na sua source e achei muito boa, porém achei boa pra relatórios pequenos, relatórios enormes já complica eu acho..
Complicado esses relatórios grandes
Citação:NILSONTRES dei uma olhada na sua source e achei muito boa, porém achei boa pra relatórios pequenos, relatórios enormes já complica eu acho..
Não entendi porque vc achou isso ?
Eu gero um list para cada tabela do meu banco de dados, então basta vc setar o list corresponde a tabela NO CRYSTAL e pronto, inclusive o list serve para o sistema num todo, não só para relatórios. Não imagina como minha programação rendeu depois de conhecer isso, santos objetos.
Citação:Uso o Crystal Report da seguinte maneira, no Command do Crystal Report., Lá eu passo o Select que eu quero e com isso o Crystal Report monta uma espécie de View. Coloco os campos no Layout do Crystal e abraço.....vira um raio.....
Teria um exemplo? continua um raio mesmo num relatório de 20 páginas? KKKKKK.. no Command dentro do relatório ou no Form do relatório ex: CrptViewer?
Citação:Não entendi porque vc achou isso ?
Eu gero um list para cada tabela do meu banco de dados, então basta vc setar o list corresponde a tabela NO CRYSTAL e pronto, inclusive o list serve para o sistema num todo, não só para relatórios. Não imagina como minha programação rendeu depois de conhecer isso, santos objetos.
Huum boa.. é que achei que ia me atrapalhar devido a ser muitas coisas .. más me dei bem com essa forma que você faz.. vou esperar pra ver se o jeito que o F001E disse porque queria o máximo de performance pro pessoal não botar defeito.. pq aqui o pessoal é complicado bota defeito em tudo!
más por exemplo como ficaria na hora de eu definir o DataSource para várias classes ?
Dim _ListaCorrecao As New List(Of cls_Lista_Instru)
Citação:
Dim rpt As New Relatorio_Correcao
rpt.SetDataSource(_ListaCorrecao.ToList)
Citação:Teria um exemplo? continua um raio mesmo num relatório de 20 páginas? KKKKKK.. no Command dentro do relatório ou no Form do relatório ex: CrptViewer?
20 páginas ?.....eu diria 100 páginas.....fica mais rápido que a Luz do próprio Raio......no Command dentro do Relatório...vou achar aqui e posto um exemplo....
Private Sub Impressao()
Try
[ô]recuperar os campos fixos
Dim _BoletoFixo As New bllBoletoFixo
_BoletoFixo.BuscaDados()
[ô]Declarando Variáveis para impressao
Dim TabelaBoletos As New dsCadastro.dtBoletoDataTable [ô]<<<<<<aqui o dataset q inclui no projeto, o datatable q cuida exclusivo de boletos....
Dim LinhaBoleto As dsCadastro.dtBoletoRow
[ô]buscando dados aniversariantes
Dim CriterioBusca As String = [Ô]select boletos.*,registros.* from boletos inner join registros on boletos.idregistro=registros.id where boletos.enviado=[ô]true[ô] and datepart(month ,registros.nascimento) = datepart(month ,boletos.vencimento)[Ô] [ô]aniversariantes
[ô]declara as variaveis da pesquisa
Dim Busca As New dalManipulaBD
Dim ds As New DataSet
ds = Busca.RetornaDS(CriterioBusca)
If ds.Tables(0).Rows.Count = 0 Then
MessageBox.Show([Ô]Não foram gerados boletos para impressão[Ô])
Exit Sub
End If
For pR = 0 To ds.Tables(0).Rows.Count - 1
[ô]informacoes recuperadas, precisa jogar na tabela virtual
LinhaBoleto = TabelaBoletos.NewRow()
[ô]campos fixos
LinhaBoleto([Ô]agenciacodigocedente[Ô]) = Agencia & [Ô]/[Ô] & Conta [ô]fixo
LinhaBoleto([Ô]instrucoes[Ô]) = Instrucoes [ô]fixo
[ô]campos q variam
LinhaBoleto([Ô]datavenc[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]vencimento[Ô]).ToString
LinhaBoleto([Ô]datadoc[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]datadoc[Ô]).ToString
LinhaBoleto([Ô]numdoc[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]numerodoc[Ô]).ToString
LinhaBoleto([Ô]dataproc[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]dataproc[Ô]).ToString
LinhaBoleto([Ô]nossonum[Ô]) = String.Format([Ô]{0}/{1}-{2}[Ô], ds.Tables(0).Rows(pR).Item([Ô]nossonumero[Ô]).ToString.Substring(0, 2), ds.Tables(0).Rows(pR).Item([Ô]nossonumero[Ô]).ToString.Substring(2, 11), ds.Tables(0).Rows(pR).Item([Ô]nossonumero[Ô]).ToString.Substring(13, 1))
LinhaBoleto([Ô]nomesacado[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]nome[Ô]).ToString
LinhaBoleto([Ô]enderecosacado[Ô]) = Trim(ds.Tables(0).Rows(pR).Item([Ô]endereco[Ô]).ToString) & [Ô] - [Ô] & Trim(ds.Tables(0).Rows(pR).Item([Ô]bairro[Ô]).ToString)
LinhaBoleto([Ô]cep[Ô]) = String.Format([Ô]{0}-{1}[Ô], ds.Tables(0).Rows(pR).Item([Ô]cep[Ô]).ToString.Substring(0, 5), ds.Tables(0).Rows(pR).Item([Ô]cep[Ô]).ToString.Substring(5, 3)) [ô]ds.Tables(0).Rows(pR).Item([Ô]cep[Ô]).ToString
LinhaBoleto([Ô]municipio[Ô]) = Trim(ds.Tables(0).Rows(pR).Item([Ô]cidade[Ô]).ToString)
LinhaBoleto([Ô]uf[Ô]) = Trim(ds.Tables(0).Rows(pR).Item([Ô]uf[Ô]).ToString)
LinhaBoleto([Ô]codigosacado[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]codigo[Ô]).ToString
LinhaBoleto([Ô]linha[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]linha[Ô]).ToString
LinhaBoleto([Ô]barra[Ô]) = ds.Tables(0).Rows(pR).Item([Ô]barra[Ô]).ToString
TabelaBoletos.AdddtBoletoRow(LinhaBoleto)
Next
Dim CategoriasDT As DataTable = TabelaBoletos
[ô]Instanciando/Setando Objeto ReportDocument
Dim oRP As ReportDocument
oRP = New crpBoleto [ô]nome do relatorio
oRP.SetDataSource(CategoriasDT)
[ô]Exibindo Relatório
Dim tela As New frmBoletoImpressao
tela.Tag = [Ô]Boletos de Aniversariantes[Ô]
tela.CrystalReportViewer1.ReportSource = oRP
tela.CrystalReportViewer1.RefreshReport()
tela.ShowDialog()
eu tentei dar uma cortada em algumas partes q não tinham a ver com a geração do relatório, algumas partes mais de manipulação dos dados....até a criação dos dados pro boleto ficaram de fora, é a parte q trabalha numa thread a parte....
não sei se ficou pior de entender, pq trabalho em classes então manda a busca pra uma classe q retorna dados, e assim vai....mas creio q tenha como entender sem problemas, to de olho nesse método mais rápido q o raio, ainda mais q to com um projeto q o programa e banco de dados vao estar em uma cidade e via internet precisa ter acesso a relatório em outra cidade....
acredito q esse dataset tenha quase o mesmo papel do list dito antes....
veja a imagem do dataset q uso unicamente pra gerar os relatórios, cada relatório vejo os campos q preciso, monto o DT, crio o relatório e uso como source, ai via esse código q postei alimento o DT.....