PEPINO DATASET

MESTRE 23/06/2015 16:39:26
#448072
Fala pessoal beleza? sou funcionário de uma empresa que é prestadora de serviços, e o lucro da empresa é dado atráves dos relatórios que elaboramos e enviamos aos clientes..

Ja tentei de diversas formas:
1. Criei um banco temporário no Access e dava Inserts e Deletes (incluindo e depois limpando as tabelas) porém muito trabalhoso
2. Utilizei parametros etc.
3. Utilizei DataSet.

O Grande problema, os relatórios mudam muito, ou seja algumas datatables ficam vazias em várias ou algumas situações então o meu relatório do crystal acaba saindo totalmente em branco por causa disso, como devo proceder para resolver isso?

Foto do meu DataSet pra vocês verem o tamanho do Pepino:



Meu Código:
      Dim DA1, DA2, DA3 As MySqlDataAdapter
Dim dsAltura As New Altura14626

Try
Dim sql As String
dsAltura.Clear()


sql = [Ô]SELECT * FROM CLIENTES WHERE CODCLI = 1[Ô]
objConexao.Open()
DA1 = New MySqlDataAdapter(sql, objConexao)
DA1.Fill(dsAltura, [Ô]CLIENTE[Ô])

sql = [Ô]SELECT * FROM CLIENTES WHERE CODCLI = 11[Ô]
DA2 = New MySqlDataAdapter(sql, objConexao)
DA2.Fill(dsAltura, [Ô]SOLICITANTE[Ô])

sql = [Ô]SELECT OS,DESCRPROD FROM tb_quedadescr_14626 WHERE OS = 123456[Ô]
DA3 = New MySqlDataAdapter(sql, objConexao)
DA3.Fill(dsAltura, [Ô]tb_quedadescr_14626[Ô])

Dim oRPxz As ReportDocument
oRPxz = New Rel_14626_Completo
oRPxz.SetDataSource(dsAltura)

Dim tela2 As New Impressao14626
tela2.Tag = [Ô]CRPT --> ALTURA[Ô]
tela2.CrptAltura.ReportSource = oRPxz
tela2.CrptAltura.RefreshReport()
tela2.ShowDialog()

DA1.Dispose()
DA2.Dispose()
DA3.Dispose()


Catch ex As Exception
MsgBox(ex.ToString)
[ô] Response.Write([Ô]Erro Conexão![Ô])
Finally
objConexao.Close()
End Try
NILSONTRES 23/06/2015 16:44:38
#448074
Pois é mestre, por isso que bolei aquele esquema dos list, esses datasets ninguém merece, uma pena não ter achado a saída para utilizar duas tabelas ao mesmo tempo, é que estou sem tempo agora para isso, infelizmente.
MESTRE 23/06/2015 16:49:26
#448075
Citação:

Pois é mestre, por isso que bolei aquele esquema dos list, esses datasets ninguém merece, uma pena não ter achado a saída para utilizar duas tabelas ao mesmo tempo, é que estou sem tempo agora para isso, infelizmente.



Então complicado, para utilizar duas tabelas deve ser daquele jeito de criar uma classe e utilizar For nos grids, só que imagina eu carregando todas essas informações por list? é muita coisa é meio que impossível..
NILSONTRES 23/06/2015 17:05:35
#448076
Mestre,
Olha, sei não hem se ainda não é vantagem fazer assim.
Não precisa de grid, ali era só um exemplo para facilitar, ao invés de carregar de um bco carregava de um grid, Eu crio uma classe para cada tabela nos meus projetos, essas classes são os objetos que são carregados no crystal, então para cada relatorio que for preciso cruzar as tabelas vc cria uma classe com um list com os campos das tabelas envolvidas, faz a query normalmente e carrega essa classe no crystal.
Acho que no exemplo eu não postei a função das as classes que utilizo para automatizar esse processo, segue uma ai.
____________________
Public Function List(ByVal StrSql As String) As List(Of Tab_nag_clientes)
[ô]Tab_nag_clientes=nome da classe
Try
_ListClientes.Clear()
Dim i As Integer = 0
If SQL_NAG.SEL(StrSql, False) = True Then[ô]caso encontre registros carrega o list
While SQL_NAG.MY_RE.Read()
_ListClientes.Add(New Tab_nag_clientes)
_ListClientes.Item(i).Codigo = SQL_NAG.MY_RE.Item([Ô]Codigo[Ô]).ToString
_ListClientes.Item(i).Data_Cad = SQL_NAG.MY_RE.Item([Ô]Data_Cad[Ô]).ToString
_ListClientes.Item(i).Nome = SQL_NAG.MY_RE.Item([Ô]Nome[Ô]).ToString
_ListClientes.Item(i).Empresa = SQL_NAG.MY_RE.Item([Ô]Empresa[Ô]).ToString
_ListClientes.Item(i).Logradouro = SQL_NAG.MY_RE.Item([Ô]Logradouro[Ô]).ToString
_ListClientes.Item(i).Numero = SQL_NAG.MY_RE.Item([Ô]Numero[Ô]).ToString
_ListClientes.Item(i).Complemento = SQL_NAG.MY_RE.Item([Ô]Complemento[Ô]).ToString
_ListClientes.Item(i).CEP = SQL_NAG.MY_RE.Item([Ô]CEP[Ô]).ToString
_ListClientes.Item(i).Bairro = SQL_NAG.MY_RE.Item([Ô]Bairro[Ô]).ToString
_ListClientes.Item(i).Municipio = SQL_NAG.MY_RE.Item([Ô]Municipio[Ô]).ToString
_ListClientes.Item(i).Cod_Municipio = SQL_NAG.MY_RE.Item([Ô]Cod_Municipio[Ô]).ToString
_ListClientes.Item(i).UF = SQL_NAG.MY_RE.Item([Ô]UF[Ô]).ToString
_ListClientes.Item(i).DDD = SQL_NAG.MY_RE.Item([Ô]DDD[Ô]).ToString
_ListClientes.Item(i).Telefone = SQL_NAG.MY_RE.Item([Ô]Telefone[Ô]).ToString
_ListClientes.Item(i).DDDFone = SQL_NAG.MY_RE.Item([Ô]DDDFone[Ô]).ToString
_ListClientes.Item(i).Fone = SQL_NAG.MY_RE.Item([Ô]Fone[Ô]).ToString
_ListClientes.Item(i).DDDCelular = SQL_NAG.MY_RE.Item([Ô]DDDCelular[Ô]).ToString
_ListClientes.Item(i).Celular = SQL_NAG.MY_RE.Item([Ô]Celular[Ô]).ToString
_ListClientes.Item(i).Operadora = SQL_NAG.MY_RE.Item([Ô]Operadora[Ô]).ToString
_ListClientes.Item(i).DDDCel = SQL_NAG.MY_RE.Item([Ô]DDDCel[Ô]).ToString
_ListClientes.Item(i).Cel = SQL_NAG.MY_RE.Item([Ô]Cel[Ô]).ToString
_ListClientes.Item(i).Operadora2 = SQL_NAG.MY_RE.Item([Ô]Operadora2[Ô]).ToString
_ListClientes.Item(i).Email = SQL_NAG.MY_RE.Item([Ô]Email[Ô]).ToString
_ListClientes.Item(i).PTREF = SQL_NAG.MY_RE.Item([Ô]PTREF[Ô]).ToString
_ListClientes.Item(i).Logradouro2 = SQL_NAG.MY_RE.Item([Ô]Logradouro2[Ô]).ToString
_ListClientes.Item(i).Numero2 = SQL_NAG.MY_RE.Item([Ô]Numero2[Ô]).ToString
_ListClientes.Item(i).Complemento2 = SQL_NAG.MY_RE.Item([Ô]Complemento2[Ô]).ToString
_ListClientes.Item(i).CEP2 = SQL_NAG.MY_RE.Item([Ô]CEP2[Ô]).ToString
_ListClientes.Item(i).Bairro2 = SQL_NAG.MY_RE.Item([Ô]Bairro2[Ô]).ToString
_ListClientes.Item(i).Municipio2 = SQL_NAG.MY_RE.Item([Ô]Municipio2[Ô]).ToString
_ListClientes.Item(i).UF2 = SQL_NAG.MY_RE.Item([Ô]UF2[Ô]).ToString
_ListClientes.Item(i).Telefone2 = SQL_NAG.MY_RE.Item([Ô]Telefone2[Ô]).ToString
_ListClientes.Item(i).Celular2 = SQL_NAG.MY_RE.Item([Ô]Celular2[Ô]).ToString
_ListClientes.Item(i).Email2 = SQL_NAG.MY_RE.Item([Ô]Email2[Ô]).ToString
_ListClientes.Item(i).PTREF2 = SQL_NAG.MY_RE.Item([Ô]PTREF2[Ô]).ToString
_ListClientes.Item(i).Contato = SQL_NAG.MY_RE.Item([Ô]Contato[Ô]).ToString
_ListClientes.Item(i).x_Pais = SQL_NAG.MY_RE.Item([Ô]x_Pais[Ô]).ToString
_ListClientes.Item(i).c_Pais = SQL_NAG.MY_RE.Item([Ô]c_Pais[Ô]).ToString
_ListClientes.Item(i).CPF = SQL_NAG.MY_RE.Item([Ô]CPF[Ô]).ToString
_ListClientes.Item(i).IE = SQL_NAG.MY_RE.Item([Ô]IE[Ô]).ToString
_ListClientes.Item(i).RG = SQL_NAG.MY_RE.Item([Ô]RG[Ô]).ToString
_ListClientes.Item(i).CNPJ = SQL_NAG.MY_RE.Item([Ô]CNPJ[Ô]).ToString
_ListClientes.Item(i).Vendedor = SQL_NAG.MY_RE.Item([Ô]Vendedor[Ô]).ToString
_ListClientes.Item(i).Tipo_Pessoa = SQL_NAG.MY_RE.Item([Ô]Tipo_Pessoa[Ô]).ToString
_ListClientes.Item(i).OBS = SQL_NAG.MY_RE.Item([Ô]OBS[Ô]).ToString
_ListClientes.Item(i).Taxa = SQL_NAG.MY_RE.Item([Ô]Taxa[Ô]).ToString
_ListClientes.Item(i).Usuario = NUM_USUARIO
_ListClientes.Item(i).Maquina = NOME_HOSTLOCAL
_ListClientes.Item(i).Divida_Atual = SQL_NAG.MY_RE.Item([Ô]Divida_Atual[Ô]).ToString
_ListClientes.Item(i).BO = SQL_NAG.MY_RE.Item([Ô]BO[Ô]).ToString
Try
_ListClientes.Item(i).Percent_Com = SQL_NAG.MY_RE.Item([Ô]Percent_Com[Ô]).ToString
_ListClientes.Item(i).Cod_Vendedor = SQL_NAG.MY_RE.Item([Ô]Cod_Vendedor[Ô]).ToString
_ListClientes.Item(i).Data_Nasc = SQL_NAG.MY_RE.Item([Ô]Data_Nasc[Ô]).ToString
Catch
End Try
_ListClientes.Item(i).Status = SQL_NAG.MY_RE.Item([Ô]Status[Ô]).ToString

i += 1
End While
SQL_NAG.FECHA_SEL()
Return _ListClientes.ToList[ô]retorna o list carregado
Else
Return Nothing
End If
Catch
MsgBox(Err.GetException.StackTrace, MsgBoxStyle.Critical, [Ô]AVISO[Ô])
Return Nothing
End Try

End Function
ASHKATCHUP 23/06/2015 17:15:53
#448078
Resposta escolhida
Cara, não consegui entender o teu problema. Poderia explicar melhor?
KERPLUNK 23/06/2015 20:10:40
#448085
Bem vamos aos pontos que vi:
1 - Você precisa re-estruturar suas tabelas adequadamente. Campo1, Campo2, Campo3, é um design extremamente [Ô]engessado[Ô], pois se em algum caso o número de valores exceder o número de colunas na tabela, você vai ter uma grande dor de cabeça para arrumar, pois terá que incluir um campo na tabela. Esse design também faz com que você tenha menor desempenho, pois em vários casos o número de valores não vai usar todos os campos que você colocou na tabela, gerando leitura de tabela e de objeto de dados desnecessária, além de verificação de dados null em muitos campos. Ao invés desse design, use o modelo [Ô]master/detail[Ô], onde você tem uma tabela pai e uma filha com os ítens relacionados, assim, você não limita o número de valores, não gera leitura desnecessária e tem mais flexibilidade para relacionar esses dados com outros.
2 - Utilize DataReaders para leitura de dados, eles são feitos justamente para isso, ler dados, e por isso têm um desempenho muito superior. Além de DataReaders, use também classes que representam cada uma das tabelas e use essas classes com seu relatório. Mais um detalhe para aumentar ainda mais o desempenho, é usar Views específicas para cada relatório. Elas são mais rápidas que leitura direta da tabela e podem ser alteradas com mais facilidade.
3 - O que você quer fazer é muito parecido com um cubo de dados, ou o famoso [Ô]BI - Business Inteligence[Ô]. Se for esse caso, o melhor é criar um segundo banco de dados redundante que seja atualizado de acordo com o original. Essa técnica é trabalhosa de ser desenvolvida e de nível de experiência e habilidade bem altos, mas a flexibilidade criada com ele é o tipo de coisa que sempre cria um sorriso no cliente, fazendo com que ele não reclame(muito) quanto à preços. E mais, essa mesma técnica pode ser aproveitada para mais clientes.
4 - Se você está instanciando objetos que seja descartáveis(Dispose), use blocos [Ô]Using[Ô]. Eles são uma garantia que nenhum objeto ficará [Ô]preso[Ô] quando você fechar a aplicação e ficar a mercê do famigerado GAC que nem sempre funciona como a gente espera.
5 - Cogite a idéia de usar um banco de dados de verdade, como o SQL Server, MySQL ou Oracle. Eles são superiores aos arquivos do access em muitos quesitos, à ponto de nem sequer ser justo uma comparação entre eles. Além do mais, todos os que citei possuem uma versão gratuita, o que é um grande estímulo. Nesse ponto sempre entra a parte [Ô]vou ter que mudar tudo no meu sistema![Ô]. Sim, se você não usou a técnica de OOP corretamente, você vai ter muito trabalho para modificar seu sistema. O uso de OOP não é apenas [Ô]pra ficar bonitinho[Ô], mas para criar essa flexibilidade que tanta falta faz. Com ela, você pode com poucos ajustes transformar o seu sistema em um sistema multi-banco de dados, dando ao cliente a opção de até mesmo utilizar um banco de dados que ele já possua, caso o cliente já tenha investido nisso.

Só com essas dicas, acredito que já ajude para resolver seu problema de uma vez por todas e no mais, o que precisar e eu puder ajudar, pode contar.
MESTRE 24/06/2015 07:12:20
#448093
@NILSONTRES

Obrigado pela ajuda, porém acho muito trabalhoso nos casos que devo fazer, pelo motivo de que, tenho vários grids e meu imprimir não vai carregar os grids, então tenho que fazer vários Select[ô]s seguidos de Do While Loop pra ele percorrer todas as linhas do meu grid, aí cai num caso parecido a do Acess que eu utilizava más para fazer em relatórios pequenos com certeza é uma excelente alternativa, utilizo bastante esse seu método de list para fazer outros tipos de relatórios..


@ASHKATCHUP
Citação:

Cara, não consegui entender o teu problema. Poderia explicar melhor?



Seguinte eu tenho um DataSet com vários DataTables, a variação de campos quase não ocorre, o problema é que a variação de objetos que vão ao relatório ocorre frequentemente, então vamos pensar assim, se eu tenho um DataSet com 2 DataTable e nessas 2 DataTables eu tenho chave primaria e todos os outros campos preenchidos, o relatório funciona e carrega tudo bonitinho, porém quando eu vou ao caso de ter vários DataTables, por ex: 5 datatables e no caso meu campo OS que é chave primária não existe em algum deles, o relatório simplesmente carrega em branco..

Estou pensando agora, tem alguma forma de eu dar um Fill com o parâmetro da Chave primaria? assim ele preencherá todos os campos OS com a chave primária e trará null nas tabelas que na verdade eu não tenho dados nenhum..
MESTRE 24/06/2015 07:26:39
#448094
@KERPLUNK

1. é muito difícil dar um refresh no DataSet e nas DataTables caso algum campo seja adicionado? .. Sobre o modelo master detail, isso você diz utilizar direto no Crystal utilizando SubReports né? sem dataset..

2. Já utilizo datareaders no projeto inteiro apenas nos relatórios que utilizo DataSet.. teria algum exemplo ou tutorial pra usar as Views específicas?

3. Acho que não é o caso devido a equipe de TI ser muito enxuta (eu e mais um programador apenas).

4. Entendi

5. Utilizo o MySql, na verdade expliquei do Access porque faço uma conexão com um Banco Access localizado no Disco C de todas as máquinas, e utilizo como fonte de dados apenas para meus relatórios do Crystal Reports, como faço:
1. Crio uma conexão com o banco Access
2. Dou Select no Mysql, leio os dados com DataReader e antes de dar Insert no Access eu dou Delete, para limpar a tabela.
3. Garanto que sempre haverá apenas 1 dado a ser lido no Access e pronto sai o relatório no Crystal..

** O grande problema é o trabalho que isso dá, por dataset é muito mais rápido.
NILSONTRES 24/06/2015 08:04:15
#448095
Citação:

e meu imprimir não vai carregar os grids


Como eu disse la em cima, não é preciso utilizar ou carregar grids(aquilo foi só para exemplo), observe que carreguei direto da tabela, é só fazer um select e carregar o list.
F001E 24/06/2015 08:46:42
#448096
usa command no Crystal Reports: http://www.hexcentral.com/articles/crystal-sql-commands.htm
lá na janela Modify Command você escreve a SQL que você quer com INNER JOIN, LEFT JOIN, CROSS JOIN, LEFT OUTER JOIN, FULL JOIN, com 1,2.3,4......n tabelas, assim não precisa criar essa teia de aranha com dataset.
MESTRE 24/06/2015 08:52:25
#448097
Citação:

Como eu disse la em cima, não é preciso utilizar ou carregar grids(aquilo foi só para exemplo), observe que carreguei direto da tabela, é só fazer um select e carregar o list.



Então mais dai como ficaria se eu tivesse por ex 1 nome para vários endereços nesse caso?


Citação:

usa command no Crystal Reports: http://www.hexcentral.com/articles/crystal-sql-commands.htm
lá na janela Modify Command você escreve a SQL que você quer com INNER JOIN, LEFT JOIN, CROSS JOIN, LEFT OUTER JOIN, FULL JOIN, com 1,2.3,4......n tabelas, assim não precisa criar essa teia de aranha com dataset.



Teia de aranha UAHUAUHAHU rashei .. vou tentar obrigado F001, então a melhor forma seria assim? ou o uso de SubReports?
Página 1 de 3 [24 registro(s)]
Tópico encerrado , respostas não são mais permitidas