*/

quinta-feira, 26 de dezembro de 2013

Código, Algoritmo de um Plano de Contas escrito em VB

Complementando um artigo descrito em http://emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html Consulta SQL de Plano de Contas - Query Contabil - Query para Centro de Custo, apenas exponho um simples código para elucidar como deveria ser feito, isto é, como seria implementado um algoritmo para totalizar um plano de contas em uma linguagem de programação, a exemplo aqui do VBA, em casos que não é possível usar uma query ou um SGBD sem um suporte mais abrangente ao SQL a exemplo do ACCESS 2010.

'Um código bem básico para uma estrutura de três níveis escrito em 'VB para o Access 2010 
Option Compare Database

Sub centro_custo()
' funciona para uma estrutura de contas em 3 niveis
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim soma_n1, soma_n2, soma_n3 As Double
Dim tamanho_conta As Integer
Dim strSQL As String
' lista todas as contas cadastradas em centro_custo
Set rs1 = CurrentDb.OpenRecordset("SELECT id_centro_custo, descricao, tipo_conta FROM centro_custo ORDER BY id_centro_custo DESC;")
Do While Not rs1.EOF
   ' contas nivel 3
   ' todas contas analiticas, nessa estrutura as contas tem o nivel 3
   If (rs1("tipo_conta") = "A") Then
       ' processa o nivel 3 na query em strSQL
       strSQL = "SELECT cc.id_centro_custo, cc.descricao, sum(m.valor_movimento) AS total_conta FROM centro_custo cc INNER JOIN movimento m  ON m.id_centro_custo LIKE cc.id_centro_custo WHERE cc.id_centro_custo =  '" & rs1("id_centro_custo") & "' GROUP BY cc.id_centro_custo, cc.descricao;"
       Set rs2 = CurrentDb.OpenRecordset(strSQL)
       If Not rs2.EOF Then
           soma_n3 = rs2("total_conta")
       Else
           soma_n3 = 0
       End If
       soma_n2 = soma_n2 + soma_n3
       Debug.Print rs1("id_centro_custo") & " - " & rs1("descricao") & " - " & rs1("tipo_conta") & " - " & soma_n3
   Else

       tamanho_conta = Len(rs1("id_centro_custo"))
       ' contas nivel 2
       If tamanho_conta = 3 Then
           Debug.Print rs1("id_centro_custo") & " - " & rs1("descricao") & " - " & rs1("tipo_conta") & " - " & soma_n2
           soma_n1 = soma_n1 + soma_n2
           soma_n2 = 0
       Else
           ' contas nivel 1
           If tamanho_conta = 1 Then
               Debug.Print rs1("id_centro_custo") & " - " & rs1("descricao") & " - " & rs1("tipo_conta") & " - " & soma_n1
               soma_n1 = 0
           End If
       End If
   End If
   ' avanca proximo registro
   rs1.MoveNext
Loop

End Sub

' Informo ainda que os níveis podem ser configurados via matrizes 
' e código desenvolvido acima é procedural
' Recomendo definir uma mascara do plano de contas

Resultado do Código em VBA Acima Descrito


Mais uma vez espero ter ajudado!
APdSJC!

5 comentários:

  1. Bom dia.

    Estou precisando gerar o código do plano de contas (1.1.1) e até agora não consegui e já fiz bastante pesquisa pela net mas nada.
    Estou utilizando vba.
    Ainda não consegui fazer uma linha sequer, pode me ajudar??????
    Te agradeço.

    ResponderExcluir
    Respostas
    1. Olá Barbosa, se estiver usando VBA, você pode usar o código em questão, mas se for usar outros SGBDRs a exemplo de Oracle, Postgres ou SQL Server, recomendo dá uma lida nesse artigo http://emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html

      Excluir
    2. Precisa apenas adaptar a sua estrutura de banco de dados.

      Excluir
  2. O que estou fazendo é um exemplo para iniciantes em programação. Escolhi VBA pela intimidade com o pacote office. E não criei uma tabela e nem tinha pensado em centro de custo. Criei 3 tabelas pensando neste código (1.1.1 - grupo.categoria.conta) você fez alguma relação com várias tabelas ou todas as informações estão em uma tabela somente?

    ResponderExcluir
    Respostas
    1. Só envolve duas tabelas, sugiro você verificar o link http://emersonhermann.blogspot.com.br/2012/09/consulta-sql-de-plano-de-contas-query.html

      Excluir