GD Access    GD Access    Grupo de Discussão  Ir para Categorias  Grupos técnicos  Ir para Fóruns  Access    Dúvidas sobre Recordsets
Go
Novo
Procurar
Notificar
Ferramentas
Responder
  
-star Rating Vote!  Login/Cadastrar 
Iniciante

Figura de  fpetrucc
postado
Bom pessoal, dado o seguinte código:

Function Movi()
'Procura movimentações erradas na tabela movimentações
Dim db As Database
Dim Db1 As Database
Dim Rs As Recordset
Dim Rs1 As Recordset
Dim Rs2 As Recordset
Dim Rs3 As Recordset
Dim StrSql As String
Dim StrSql1 As String
Dim StrSql2 As String
Dim StrSql3 As String
Dim StrFilter As Integer
Dim StrFiltro As Integer
Dim StrFiltro1 As Integer
Dim NMov As String, CProd As String, NumeM As Single

Set db = CurrentDb
'Busca todos os itens da tabela produtos
StrSql = "Select * FROM Produtos WHERE Descontinuado = False " _
& "ORDER BY PosiçãoNoSistema;"
Set Rs = db.OpenRecordset(StrSql)
With Rs
.MoveLast
.MoveFirst
Do While Not .EOF
A = !CódigoDoProduto
StrFilter = !PosiçãoNoSistema
b = .RecordCount
Debug.Print A

'Busca os produtos na tabela movimentação
StrSql1 = "Select NúmeroDaMovimentação, CódigoDoProduto, SaldoAnterior, Entrada, " _
& "Saída, Saldo, Data " _
& "FROM Movimentações " _
& "WHERE (CódigoDoProduto = " & StrFilter & " " _
& "and Data >= #1/1/2008#) " _
& "ORDER BY NúmeroDaMovimentação;"
Set Rs1 = db.OpenRecordset(StrSql1)
With Rs1
A = .RecordCount
If IsNull(A) Or A = "" Or A = 0 Then
GoTo pula
End If
.MoveLast
.MoveFirst
Do While Not .EOF
Dt = !data
NMov = !NúmeroDaMovimentação
CProd = !CódigoDoProduto
SAnter = !SaldoAnterior
Entr = !Entrada
Sai = !Saída
StrFiltro = !Saldo
SomaSaldo = SAnter + Entr - Sai
'Debug.Print NMov

'Se a soma estiver diferente do saldo acrescenta na tabela MovimentaçõesErradas
'E vai pro próximo produto
If SomaSaldo <> StrFiltro Then
db.Execute "Insert into MovimentaçõesErradas " _
& "(NúmeroDaMovimentação,CódigoDoProduto,SaldoAnterior,Entrada,Saída," _
& "Saldo) Values (" & NMov & "," & CProd & "," & SAnter & "," _
& "" & Entr & "," & Sai & "," & StrFiltro & ");"
GoTo seguinte
End If

'Seleciona a próxima linha da tabela movimentações e compara o saldo da linha de cima
'com o saldo anterior da linha de baixo, se for diferente acrescenta na tabela
'MovimentaçõesErradas e vai pro próximo produto
Set Db1 = CurrentDb
StrSql2 = "Select NúmeroDaMovimentação, SaldoAnterior, Entrada, Saída, Saldo " _
& "FROM Movimentações " _
& "WHERE (((Movimentações.CódigoDoProduto)=" & StrFilter & ") " _
& "AND ((Movimentações.NúmeroDaMovimentação)>" & NMov & ")) " _
& "ORDER BY NúmeroDaMovimentação;"

Set Rs2 = Db1.OpenRecordset(StrSql2)
With Rs2
A = .RecordCount
If IsNull(A) Or A = "" Or A = 0 Then
GoTo pula
End If

.MoveLast
.MoveFirst
Do While Not .EOF
NumeM = !NúmeroDaMovimentação
StrFiltro1 = !SaldoAnterior
Entr = !Entrada
Sai = !Saída
Saldo = !Saldo
'Debug.Print NumeM

'Se a movimentação anterior for maior ou igual a movimentação posterior
'vai pra próxima movimentação, se for diferente e o saldo for diferente do
'saldo anterior acrescenta na tabela MovimentaçõesErradas e vai pro
'próximo produto
If NMov >= NumeM Then
GoTo Próximo
Else
If StrFiltro <> StrFiltro1 Then
db.Execute "Insert into MovimentaçõesErradas " _
& "(NúmeroDaMovimentação,CódigoDoProduto,SaldoAnterior," _
& "Entrada,Saída,Saldo) Values (" & NumeM & "," _
& "" & StrFilter & "," & StrFiltro1 & "," & Entr & "," _
& "" & Sai & "," & Saldo & ");"
GoTo seguinte
End If
GoTo seguinte
End If
Próximo:
.MoveNext
Loop
End With
seguinte:
.MoveNext
Loop
End With
pula:
.MoveNext
Loop
End With

End Function
____________________________________________________________________________________________________

Tenho as seguintes dúvidas:
1 - Usar Recordset dentro de Recordset deixa o código mais lento?
2 - É uma prática pouco usada ou incorreta?
3 - Qual seria a melhor forma?

Essas são minhas dúvidas, caso tenham alguma forma mais simples ou mais rápida ou queiram exclarecer e explicar os erros no código ficarei muito agradecido.

Fique com Deus.


fpetrucc
 
Postagens: 10 | Registrado: 28 March 2006Reply With QuoteReport This Post
Gerente

postado Hide Post
Mas pelo que ví no código vc usa diretamente o insert alternando para um While quando necessita percorrer no record set para retirar alguma informação.

Mas só acho que faltou fechar os recordsets.

Eu talvez não usaria vários nomes para recordsets como vc fez (StrSql, StrSql1...)ao menos que eu precise andar dentro do recordset, caso contrário eu fecho o recordset e posso usar a mesma StrSql (ja fechada) para um outro recordset.Digito menos e tenho menos nomes para declarar.



****************************************************************************
BEM VINDOS.... ENCONTRO DO FORUM 2010 - ACCESS DAY LITE III em NOVEMBRO. AMANTES DO ACCESS.. Inscrições abertas !!!!!
****************************************************************************
Desenvolvedor ACCESS - 12 Anos
MSN - nascimento_flavio@hotmail.com
Tel - (011) 9845-6262
****************************************************************************
 
Postagens: 3090 | Localização: Sao Paulo | Registrado: 14 September 2001Reply With QuoteReport This Post
Iniciante

Figura de  fpetrucc
postado Hide Post
Oi Flávio Lima,
mas ao fechar os recordsets como fica as variáveis?
Ex.: no segundo recordset (strsql1) eu preciso das variáveis do primeiro (strsql) para selecionar a movimentação posterior, pra não ter que percorrer todos os registros novamente, pois estou comparando a movimentação do produto pra ver se o saldo da linha anterior é o mesmo saldo anterior da linha posterior entende?
Ex.: Produto - Saldo Anterior - Saída - Saldo
01.0001 - 90 - 10 - 80
01.0001 - 80 - 50 - 30


fpetrucc
 
Postagens: 10 | Registrado: 28 March 2006Reply With QuoteReport This Post
Gerente

Figura de  rogerio oliveira
postado Hide Post
Dando uma olhada por cima apenas (porque não tenho as estruturas das tabelas e nem a regra de negócio), posso lhe assegurar, quase que com 100% de possibilidades, que uma ou duas consultas resolveriam seu problema, já desenvolvi muitos sistema em access e são raras as vezes em que se faz necessário percorrer recordsets, menos ainda quando usam outro como base (por isso o access usa relacionamento de tabelas), se vc modelou corretamente a base com certeza isto é desnecessário, qto ao código:
1) Não use nome de váriaveis, tabelas ou campos com acentos, "ç", carecteres especiais e espaços em branco.
2) Goto somente para tratamento de erros, usar fora este caso é um tiro no pé com certeza, fica dificil vc controlar o fluxo do seu sistema.
3) Não entendi porque vc abre o recordset, vai até o fim e depois volta par percorrer ele todo novamente, abre uma tabela com 100.000 registros e da um movelast par vc ver quanto tempo ela gasta, não acha que é um desperdício de recurso?

respondendo as dúvidas:
1) Percorerr recorsets é sempre lento, sempre que possível utilize instruções sql( senão vc não precisaria de um banco de dados, use um arquivo de texto é menor que um bd e não corrompe he he Piscando )
2) No meu entendimento totalmente incorreta, pelo menos no exemplo exposto;
3) Estude sql e modelagem de dados, desenhe um fluxo das suas informações que certamente vc achará n soluções melhores.


Rogério Oliveira

“Aqueles que renegam o conhecimento estão fadados a se submeter ao controle daqueles que dominam a informação”

– Martin Luther King
http://www.vhumano.com.br
 
Postagens: 2609 | Localização: Guarulhos - SP | Registrado: 03 February 2005Reply With QuoteReport This Post
Iniciante

Figura de  fpetrucc
postado Hide Post
Obrigado Rogério Oliveira, se não for pedir muito qual solução você usaria? Lembrando que a tabela movimentação tem aproximadamente 300.000 registros, e a minha intenção é comparar o SaldoAnterior (Valor deve ser o mesmo que o saldo da movimentação anterior) da movimentação do produto com o saldo da anterior.
Ex.:
Produto - Saldo Anterior - Saída - Saldo
01.0001 - 90 - 10 - 80
01.0001 - 80 - 50 - 30

Grato pela sua resposta e desculpe minha ignorância

Fique com Deus.


fpetrucc
 
Postagens: 10 | Registrado: 28 March 2006Reply With QuoteReport This Post
Coordenador

Figura de  rogerio100
postado Hide Post
acredito que o uso do dlast ou last do select resolveria isto fácil.


ex.

[saldo anterior] = dlast("[saldo]","tabela origem","produto ='" me.produto & "' ")
me.saldo = [saldo anterior]-[saida]



Abraços e retorne


Rogério

Suporte e Desenvolvimentos: rogcs@ig.com.br (027) 9908-1346


Não esqueça de dizer se deu certo.

Visite o site sempre tem novidades

www.esnips.com/web/rogerio100

 
Postagens: 2038 | Localização: Vila Velha, E.S. | Registrado: 26 July 2005Reply With QuoteReport This Post
Gerente

Figura de  rogerio oliveira
postado Hide Post
Não precisa pedir desculpas, todos que aqui estamos, procurmamos sempre aprender e aperfeiçoar nosso conhecimento, ninguém é ignorante, quanto ao seu caso eu precisaria da estrtura das tabelas para poder analisar e sugerir algo.


Rogério Oliveira

“Aqueles que renegam o conhecimento estão fadados a se submeter ao controle daqueles que dominam a informação”

– Martin Luther King
http://www.vhumano.com.br
 
Postagens: 2609 | Localização: Guarulhos - SP | Registrado: 03 February 2005Reply With QuoteReport This Post
  Powered by Social Strata  
 

GD Access    GD Access    Grupo de Discussão  Ir para Categorias  Grupos técnicos  Ir para Fóruns  Access    Dúvidas sobre Recordsets

©