DICA PARA ROTINA LENTA

ADILSOO 23/10/2017 21:35:28
#477343
Citação:

- O que você quer ver no grid



Por exemplo, o usuário realiza os lançamentos, porém, eu só gravo os códigos, Cod_Trator, Cod_Funcionario, Cod_Implemento, Cod_Fazenda.
Existem lançamentos que não possuem trator ou implemento, alguns só trator.
Nesse caso, eu gravo [Ô]0[Ô] no campo que não tem no lançamento.

Porém, quando eu vou apresentar no grid, eu não posso apresentar códigos para o usuário, e sim, os nomes, que estão no cadastros, OK?

Então eu saio verificando, se estiver valor [Ô]0[Ô], eu apresento [Ô]0[Ô], se existir um código, eu pego este código, vou no cadastro, verifico o nome e apresento no grid, essa foi a solução eu eu encontrei, sei que está errada, mas não consegui fazer de outra forma.

Tentei fazer um InnerJoin, mas como disse acima, quando existir um campo com valor [Ô]0[Ô], ele não apresentará no grid, mas eu preciso que apresente.

Pensei em fazer consultas direto no banco, mas creio que a consulta resultará no mesmo problema, pois campos linkados com valor [Ô]0[Ô], serão ocultos da mesma.

Não sei se estou sendo claro o bastante.
KERPLUNK 23/10/2017 22:26:32
#477344
Acho que você não entendeu:
O que você quer mostrar?
Como está estrutura da tabela do que você quer mostrar?
CARLINHOS.SONEG 24/10/2017 07:04:36
#477347
Cara uma vez briguei tanto com o sql e esqueci de um detalhe simples, primeiro use grid.redraw=false, depois faça seu sql usando do while......, e só após ative o grid.redraw e veja se percebe alguma melhora.
MARCOSLING 24/10/2017 08:18:15
#477348
Citação:

:
- O que você quer ver no grid

Por exemplo, o usuário realiza os lançamentos, porém, eu só gravo os códigos, Cod_Trator, Cod_Funcionario, Cod_Implemento, Cod_Fazenda.
Existem lançamentos que não possuem trator ou implemento, alguns só trator.
Nesse caso, eu gravo [Ô]0[Ô] no campo que não tem no lançamento.

Porém, quando eu vou apresentar no grid, eu não posso apresentar códigos para o usuário, e sim, os nomes, que estão no cadastros, OK?

Então eu saio verificando, se estiver valor [Ô]0[Ô], eu apresento [Ô]0[Ô], se existir um código, eu pego este código, vou no cadastro, verifico o nome e apresento no grid, essa foi a solução eu eu encontrei, sei que está errada, mas não consegui fazer de outra forma.

Tentei fazer um InnerJoin, mas como disse acima, quando existir um campo com valor [Ô]0[Ô], ele não apresentará no grid, mas eu preciso que apresente.

Pensei em fazer consultas direto no banco, mas creio que a consulta resultará no mesmo problema, pois campos linkados com valor [Ô]0[Ô], serão ocultos da mesma.

Não sei se estou sendo claro o bastante.



Mas vc está gravando no banco o valor zero quando um campo não tem valor?

Ao invés se usar inner join, use left/right join
ADILSOO 24/10/2017 09:18:15
#477349
Citação:

Mas vc está gravando no banco o valor zero quando um campo não tem valor?



Sim, estou, não tentei gravar null, não sei qual seria o resultado nesse caso.

Citação:

use left/right join


Não conhecia esse comando, seria o mesmo princípio?
Por exemplo, eu preciso que mesmo que o campo Cod_Trator esteja zerado, ele apareça no grid.
Nesse caso mesmo assim irá funcionar?
ADILSOO 24/10/2017 09:54:30
#477350
E com uma GRANDE ajuda de todos, toda aquela rotina, lenta, se transformou em apenas no código abaixo, demorava uns 10 segundos pra preencher todo o grid, agora, é instantâneo, mesmo com a quantidade de registros.

Muito obrigado mesmo a todos que ajudaram, um ótimo dia a todos!

[ô]Adiciona Apontamentos realizados
sSQL = [Ô]SELECT * FROM tabaptrator LEFT JOIN tabcadimplemento ON tabcadimplemento.codimplemento = tabaptrator.codimp LEFT JOIN tabcadtrator ON tabcadtrator.codtrator = tabaptrator.codtrator INNER JOIN tabcadfuncionario ON tabcadfuncionario.codfuncionario = tabaptrator.codfunc INNER JOIN tabcadfaz ON tabcadfaz.codfaz = tabaptrator.codfaz ORDER BY data DESC[Ô]
Set rs = Conexao.Execute(sSQL)

gridlancamentos.Redraw = False
Do While Not rs.EOF = True
gridlancamentos.AddItem [Ô][Ô] _
& vbTab & rs!codaptrator _
& vbTab & rs!Data _
& vbTab & rs!nomefaz _
& vbTab & rs!nomefuncionario _
& vbTab & rs!codfrota _
& vbTab & rs!codfrota
rs.MoveNext
Loop
gridlancamentos.Redraw = True
KERPLUNK 24/10/2017 10:06:33
#477351
O importante aqui é entender o que você fez. Analise bem aquela query e entenda o que ela faz.
ADILSOO 24/10/2017 10:51:49
#477354
Pelo que li o left pega os dados da tabela da esquerda mesmo se não corresponder a direita. Right é o contrário e inner somente se corresponder.

Seria isso?
KERPLUNK 24/10/2017 11:55:06
#477360
Você está falando de produto cartesiano, um assunto deveras complexo em muitos casos.

Imagine que você tem essas tabelas:
Cliente: Id, Nome
Vendas: Id, IdCliente, Valor

E os dados:
Cliente:
1 - João
2 - Pedro
3 - Maria
4 - Antonio

Vendas:
1 - 1 - 10
2 - 1 - 25
3 - 4 - 16
4 - 3 - 1
5 - 3 - 9
6 - 3 - 17
7 - 6 - 29

Como exercício mental, tente imaginar como ficariam as seguintes combinações:
Clientes que possuem vendas
Clientes que não possuem vendas
Clientes com vendas mais alta que 10
Vendas cujo cliente não existe(tecnicamente uma inconsistência de chave estrangeira, que é o seu caso)
Enfim, tente imaginar todas as possibilidades de combinações.

O que estou tentando fazer com você é [Ô]abstrair[Ô] seu pensamento voltado à código. Fazer você entender o que está fazendo ao invés de ficar tão focado em código, que é contraproducente.
Página 2 de 2 [19 registro(s)]
Tópico encerrado , respostas não são mais permitidas