locked
Dúvidas Recordset RRS feed

  • Pergunta

  • 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, mas por favor respondam pois todos nós sabemos o potencial dos membros desse fórum e eu estou cansado de postar e não obter respostas.

    Fique com Deus.

    terça-feira, 25 de novembro de 2008 12:56

Todas as Respostas

  • Boa Tarde,

     

    Se você precisa colocar um Recordset dentro do outro para combinar resultados, há um forte indício de que essa consulta poderia ser melhor realizada através de um JOIN. O Join já combina os resultados de uma forma muito mais eficiente e já os recupera combinados. Fazer o aninhamento de RecordSets é muito mais lento.

     

    Você tem familiaridade com a utilização de JOINs em suas consultas ?

     

    [ ]s,

     

    Gustavo

    terça-feira, 25 de novembro de 2008 16:37
  • Ainda não usei, mas vou usar JOINs, Obrigado pela resposta Gustavo. Um abraço.
    terça-feira, 25 de novembro de 2008 17:17