MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 07:36

    Adaptando o excelente exemplo do Mestre avelino, que lança em uma tabela temporária determinada quantidade de registros exibindo saldo por linha, surgiu a necessidade de fazer o mesmo porém limitando por ano e mês..

    No exemplo do Avelino ele limita em 100 dias...
    eu necessitaria limitar no periodo de um mes e ano.... Ex... Setembro/2010

    Exemplo no site:
     
    http://www.usandoaccess.com.br/tutoriais/tuto54.asp?id=1#inicio

    Cumprimentos.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 25/7/2013, 13:42

    Olá, Hary!

    Não entendi muito bem.

    A parte do cídgo seria essa ?

    '-----------------------------------------------------------------------------------------------------------------------------------------
    'Data limite para acumular o saldo. Estou aqui estipulando que acumule o saldo a partir do centésimo dia, em relação ao último lançamento
    '-----------------------------------------------------------------------------------------------------------------------------------------
    DataLimite = DMax("DataMovimento", "tmp_tblMovimento") - 100

    Bom, vc poderia então montar a data com a função DateSerial().  Exemplo:

    dateserial(year(#09/2010#),month(#09/2010#),0)  ::::> retorna 30/08/2010
    dateserial(year(#09/2010#),month(#09/2010#)+1,0) :::::> Retorna 30/09/2010

    Suponho então que vc queira algo assim:

    DataLimite = dateserial(year(#09/2010#),month(#09/2010#)+1,0)

    Ofereça mais detalhes, caso não seja bem isso

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 15:43

    Bom dia Grande Avelino.... no teu exemplo você exibe saldos para 3, 7, 15, 30, 60 e 90 dias... emitindo o saldo corretamente exibindo:

    Saldo anterior, Saldo atual e na lista.. onde está a limitação, na primeira linha na coluna saldo exibe o saldo anterior menos/;mais o movimento da referida linha, estou correto?

    Pois bem... Adaptando agora este exemplo ficou claro o que você sempre exortou aqui no fórum pois a forma como era feito anteriormente pela maioria (inclusive eu) utilizava da expressão a seguir para conseguir o saldo acumulado, ocorre que há problemas graves para extra expressão:

     >>> Saldo: Format(DSoma("[Saldo1]";"QrySaldos";"[IdMovimento] <=" & [IdMovimento]);"Unidade monetária") <<<<

    Vejamos então os problemas para se utilizar a expressão acima para conseguir o saldo acumulado (veja se estou correto):

    1 - Lentidão no sistema devido a viagens denecessária à tabela linha a linha para efetuar o cálculo
    2 - Como a soma é efetuada gradativamente linha a linha se utiliza o código (IdMovimento) para efetuar o cálculo, aqui a principal questão é:
         E se houver a necessidade de inserir um registro retroativo, por exemplo, suponha que o usuário fez um recebimento no final do
         expediente quando o sistema já tenha sido delisgado e ja exista lançamentos efetuados neste dia... No dia seguinte ele insere o
         lançamento com a data anterior porém estes registros ficarão com disparidade de Código e data, veja:

           Código 78 - DataMovimento >> 25/07/2013 - Data Lançamento >> 25/07/2013
           Código 79 - DataMovimento >> 26/07/2013 - Data Lançamento >> 26/07/2013 
            Código 80 - DataMovimento >> 25/07/2013 - Data Lançamento >> 26/07/2013

      *** observe que neste registro em azul o movimento fora no dia 25 porém o lançamento no sistema ocorreu no dia seguinte... como já havia sido inserido registro no dia 26 o registro lançado com data retroativa ficará com o código sequencial porém com a data do movimento inferior  à do último lançamento.

    Como a expressão utilizada na qrySaldos utiliza o Código (IdMovimento) para se extrair o saldo acumulado... isto gerará erro de saldo diário posto que no código 80 este saldo teria que ser calculado no mesmo dia do código 78...

    Para o que necessito isto não serviria, justamente por existir a possibilidade de inserção de registros retroativos

    O que necessito então:


    Tenho uma TreeView que ao ser clicada me retorna duas situações distintas...
    1 - Ano           >>> 2014
    2 - Ano e Mês  >>> Setembro  e  2014

    Quero que o código lance na tabela temporária e me consiga saldo anterior e Atual (para o período filtrado - Ano  e Ano/Mês




    Segue dois prints... observe a disparidade nas informações da primeira linha da listBox.. (Este erro está sendo gerado justamente pala utilização da expressão com o Dsum e IDMovimento) mesmo que eu Ordene por IdMovimento e Data Movimento.. produzirá erro quando houverem registros retroativos...


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Avelino_Correto

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Avelino_Incorreto


    Obrigado.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 15:55

    A título de informação...

    O sistema está tal qual como o teu... utilizando a tabela temporária para conseguir o saldo para o período de 3, 7, 15, 30, 60 e 90 dias
    Apenas al click da treeView utilizei a qrySaldos..

    Então necesito de dois códigos distintos..
    Um já está ok (o do teu modelo)

    a outra função necessito para o click da treeView.


    Então ao clicar na treeView para um determinado ano ou ano e mes me retornaria..



    Na primeira linha o Saldo anterior +/- o movimento da linha
    Na última linha o saldo acumulado da primeira linha +/- as demais linhas..




    Cumprimentos.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 25/7/2013, 20:01

    Veja então se entendi:

    ao escolher ano 2010 e mês setembro

    Saldo anteriro até 31/08/2010
    Total de entradas e Total de saidas entre 1/09/2010 a 30/09/2010
    Saldo em caixa até 30/09/2010

    Confirma?



    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 20:11

    Na mosca!!!!

    porém como disse tenho duas situações... quando eu clico no ano na TreeView... tenho o ano...

    Então preciso da primeira filtragem para o Ano!
    A Segunda filtragem Ai sim.. ano e Mes..

    conforme o que citou, utilizando a mesma logica de saldo anterior e saldo para o Ano... assim como citou para ano e mes.

    E aproveitando.. parabéns pelo exemplo.. está perfeito. E como eu disse pude agora perceber o problema em utilizar a expressão com o Dsum e o IdMovimento..


    Obrigado
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 20:18

    Boas Avelino... A soma de Debitos e Creditos eu havia conseguido atravé de um Recordset..

    porém... eu gostaria não apenas de preencher as caixa texto ao lado da treeView e sim a lista!

    se consegui me retornar isso na lista utilizando uma segunda tabela temporária...
    para a soma de totais de débitos e créditos eu utilizaria um procedimento SomaColuna, percorrendo a listBox e somando seus respectivos valores...

    Então resumindo...

    Ao clicar por exemplo em Ano...

    Lançar em uma tabela temporária os registros deste Ano, me dando o saldo anterior do Ano anterior

    Clico em 2010 >>>
    1 - Retorna os registro do ano de 2010
    2 - Saldo anterior até a data de 31/12/2008..
    3 - Saldo em 31/12/2010.


    Da mesma forma para o Ano e mês assim com citou em seu post anterior..

    tendo estes dados em uma tabela temporária, eu lanço na lista e extraio da mesma a soma de débitos e créditos.

    Acuse se me compreedeu por gentileza


    Cumprimentos.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 25/7/2013, 20:36

    Sim, compreendi.

    Hoje talvez já não consiga analisar. Amanha, com a cabeça mais fresca analiso como poderia ser feito isso.

    Tem dados a partir de que ano ?


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 21:03

    Estou utilizando os dados do teu exemplo, que que eu lhe envie o exemplo em que estou trabalhando já com os objetos conforme o print?

    caso ajude eu lhe enviaria o exemplo por e-mail, por ser tratar de um exemplo confeccionado para terceiro, portanto no momento não posso disponibilizá-lo ainda no forum.

    Caso lhe facilite te envio o bd com os objetos envolvidos, pois na tblMovimento inclui já alguns campos.

    Aguardo.

    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 21:51

    O procedimento abaixo:

    1 - carrega a listbox com a Qrysaldos devidamente filtrada pelo Ano/Mes (strsql)
    2 - carrega recordset para  a soma dos totais de credito e debitos (Caixas texto ao lado da treeView - Total Entradas e Total Saídas e Saldo em caixa) - strsql1


    Function SomaColuna(Optional filtro As String, Optional Ordem As String)
    Dim Rs As DAO.Recordset
    Dim ValorEntrada, ValorSaida, ValorTotal As Double
    Dim db As DAO.Database
    Dim strSql, strSQL1
    Dim dblCredito As String, dblDebito As String
    Dim X As Integer
    Me.Lista.RowSource = ""
    If Me.txtFiltro <> "" Or IsNull(Me.txtFiltro) = False Then
        strSql = "SELECT IdMovimento, NumDoc as Doc, space(3) & dataMovimento As Movimento, tblMovimento.Historico, ValorCredito,ValorDebito, " _
                & "Format(DSum(""[Saldo1]"",""QrySaldos"",""[IdMovimento] <="" & [IdMovimento]),""Currency"") AS Saldo, ValorCredito - ValorDebito AS saldo1" _
                & " FROM tblMovimento WHERE Format(DataMovimento,'yyyy') = " & Me.txtFiltroAno & " And Format(DataMovimento,'mmmm') = '" & Me.txtFiltro & "'" _
                & " ORDER by idMovimento,DataMovimento;"
        strSQL1 = "Select idMovimento,space(3) & dataMovimento As Movimento, iif(valorCredito=0,'',format(valorcredito,'standard')) As Crédito, " _
                & "iif(valordebito=0,'',format(valorDebito,'standard')) AS Débito FROM tblMovimento WHERE " & filtro & " And  Format(DataMovimento,'yyyy') = " & Me.txtFiltroAno & " And Format(DataMovimento,'mmmm') = '" & Me.txtFiltro & "' ORDER BY dataMovimento;"
        Me.Lista.RowSource = strSql
        Set Rs = CurrentDb.OpenRecordset(strSQL1)
        ValorEntrada = 0
        ValorSaida = 0
        ValorTotal = 0
            Do While Not Rs.EOF
              dblCredito = Rs!Crédito
              dblDebito = Rs!Débito
                  If dblCredito = "" Then
                      dblCredito = 0
                  End If
                  If dblDebito = "" Then
                      dblDebito = 0
                  End If
                ValorEntrada = ValorEntrada + CDbl(dblCredito)
                ValorSaida = ValorSaida + CDbl(dblDebito)
                Rs.MoveNext
            Loop
        ValorTotal = ValorEntrada - ValorSaida
        Me.txtEntradaPer = Nz(Format(ValorEntrada, "Currency"), "0.00")
        Me.txtSaidaPer = Nz(Format(ValorSaida, "Currency"), "0.00")
        Me.txtSaldoPer = Nz(Format(ValorTotal, "Currency"), "0.00")
        Me.txtAviso.Visible = True
    End If

    For X = 1 To Me.Lista.ListCount
    If X = 1 Then Me.txtSaldoAnterior = Me.Lista.Column(6, X)
    If X = Me.Lista.ListCount Then
       ' MsgBox Me.Lista.Column(6, X - 1)
    End If
    Next X
    Me.txtFiltro = Null
    Me.txtFiltroAno = Null
    Rs.Close
    Set Rs = Nothing
    End Function



    A parte em vermelho popula a caixa texto Saldo Anterior e é obtida através do primeiro registro da listBox
     
    Este procedimento é chamado através do seguinte procedimento da treewView:


    '----------------------------
    Sub DisplayForm1(i As Integer)
    '----------------------------

       ' for this Treeview I do not want a double-click on a parent node
       ' to open the applicable marriage form, but pressing the shift key
       ' should open the marriage form applicable to the parent node.  Shift
       ' or double-click on a child node should open the child's applicable
       ' baptism form.
      
       Dim strKey As String
       Dim strTag As String
       Dim StrAno As String
       Dim strFilter As String
       Dim StrTMP
      
       ' get key of selected node
       strKey = Me.myTreeView1.SelectedItem.Key
       ' .. then get node's tag proterty
       strTag = Nz(Me.myTreeView1.Nodes(strKey).Tag, "")
       ' .. then if there is a tag value
       If Len(strTag) >= 0 Then
      
          '.. then get the initial letter of node key
          Select Case Left(strKey, 1)
         
             ' .. and open the the appropriate form filter by tag value
             Case "A"
                Me.txtFiltroAno = DLookup("Ano", "tblAnos", "IdAno =" & Mid(strKey, 2, 4))
                Me.Lista.Requery
                Call SomaColuna("idcaixa > 0")
             Case "C"
                StrAno = DLookup("IdAno", "tblAnosMeses", "IdMes =" & strTag)
                Me.txtFiltroAno = DLookup("Ano", "tblAnos", "IdAno =" & StrAno)
                Me.txtFiltro = DLookup("Mes", "tblAnosMeses", "IdMes =" & strTag)
                Me.Lista.Requery
                Call SomaColuna("idcaixa > 0")
    '170               Me.txtFiltro = Null
    '180               Me.txtFiltroAno = Null
          End Select
       End If
    End Sub


    Bem esta é a forma que estou utilizando e que infelimente não me produz o resultado que necessito...
    Repito o que necessito você já o compreendeu e citou na sua última mensagem.

    Te enviarei o exemplo por Mp visto que ainda não o posso postar aqui.

    Agradece pela boa vontade.

    Abraços e boa Noite.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 25/7/2013, 22:45

    Boas Avelino..  Estou na parte de inserir registros na tblMovimento...Poderia me dar uma breve explanação sobre os campos:

    1 - idCaixa
    2 - Fechado

    Para que servem e em quais situações devem ser preenchidos(idCaica) e marcados como sim (Fechado)
    Se na:

    Inclusão
    Edição
    Alteração

    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 29/7/2013, 00:34

    Boa Noite Grande Avelino... Alguma novidade por aqui?

    Aproveitando a oportunidade... no exemplo apliquei a instrução Option Explicit e observei que neste código a seguir está a letra o ao invés de 0 (zero)


    Dim X As String, strSplit As String
    Dim f(4) As String, cp(4) As Variant
    Dim k As Variant, p As Byte
    Dim booPos As Boolean
    '------------------------------------------------------------------
    ' Variável x recebe o valor digitado na caixa de texto de filtragem
    '-------------------------------------------------------------------
    X = Me(NomeCampoFoco).Text: p = 0
    '--------------------------------------------------------------------------------------
    'Passa para a matrix Cp() todos os valores digitados nas caixas de texto de filtragens
    '--------------------------------------------------------------------------------------
    For p = 0 To 1
        cp(p) = IIf(InStr(NomeCampoFoco, "tx" & p + 1) > 0, X, Me("tx" & p + 1))
    Next
    '----------------------------------------------------------------------------------------------------------------------------
    ' Passa para a matrix f() os campos a serem filtrados, com os respectivos valores digitados nas caixas de texto de filtragens
    '-----------------------------------------------------------------------------------------------------------------------------
    f(0) = IIf(cp(o) = Chr(32), "historico=''", "Historico Like '*" & cp(0) & "*'")
    f(1) = "Datamovimento Like '*" & cp(1) & "*'"
    '------------------------------------------------------------------------------------------
    'Passa para variável strSplit o comprimento de texto da cada caixa de texto de filtragens
    'Comprimento zero(0) significa que a caixa de texto de filtragem se encontra vazia
    'Exemplo: strSplit = 2|0|1|0
    'Significa que os campos 2 e 4 não receberam valores para serem filtrados
    '------------------------------------------------------------------------------------------
    strSplit = Len(cp(0) & "") & "|" & Len(cp(1) & "")
    k = Split(strSplit, "|")
    '----------------------------------------------------------------------------------------------
    'Filtro assume todos os valores de registros caso todos os campos de filtragens estejam limpos
    '----------------------------------------------------------------------------------------------
    filtro = "idcaixa > 0": p = 0
    '------------------------------------------------------------------------------------------
    'Monta a variável filtro com todos os campos de filtragens que possuirem valores digitados
    '------------------------------------------------------------------------------------------
    For p = 0 To UBound(k)
        If Val(k(p)) > 0 Then
            If booPos = False Then
                filtro = f(p): booPos = True
            Else
                filtro = filtro & " AND " & f(p)
            End If
        End If
    Next p
    '--------------------------------------------
    'Carrga a listbox com os registros filtrados
    '--------------------------------------------
    Call fncCarregalista(filtro)
    End Function


    Cumprimentos.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 29/7/2013, 13:13

    Ops!

    Sim, está com erro.  Troque o "o" pelo zero(0).  Vou corrigir aqui e atualizar o exemplo no artigo.

    Quanto aos idcaixa e  o Fechado

    Idcaixa é para o caso de se controlar mais de uma movimento bancário.  Muitas empresas trabalham com mais de uma conta bancária.  Uma aplicação pode também ser considerada um caixa individual, para vc controla o movimento.  Idcaixa seria o lado (muitos) de uma relação com a tabela ContaBancária.

    Fechado - quando a tabela, que acumula o saldo anterior, é atualizada, precisamos criar um status que identifique os registros já contabilizados.


    Sobre o seu projeto:

    Ainda não consegui parar para analisar mas o amigo Marcelo deu uma idéia muito boa neste outro tópico:

    http://maximoaccess.forumeiros.com/t14352-movimento-bancario-saldo-linha-a-linha-em-um-formulario


    Em vez de vc ter uma tabela que acume o último saldo (No meu projeto de 100 dias para trás), vc deve modificá-la para guardar os saldos a cada mês fechado.  

    Supondo que vc tenha nesta tabela tenha armazendo os seguintes saldos

    10/2012   -   R$23.000,00
    11/2012   -   R$18.000,00
    12/2012   -   R$5,000,00
    01/2013   -   R$8,000,00
    02/2013   -   R$11,000,00

    Supondo que vc queira saber o saldo do ano de 2012.  

    Bastaria então consultar esta tabela pegando o valor de 12/2012  - R$5.000,00

    Agora supondo que vc tenha selecionado na sua listBox o ano 2013 e o mês de fevereiro

    Bastaria então pegar o valor de 02/2013 - R$11.000,00

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 29/7/2013, 14:40

    Compreendi.. irei tentar alguma solução por aqui... No entanto eu necessito de apresentar na listBox os respectivos registros de:

    1 - Ano
    2 - Ano e mês..

    Conseguindo algo por ai fico grato.

    Abraços.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 31/7/2013, 16:31

    Alguma novidade por aqui?


    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 8/8/2013, 14:26

    Alguma novidade por aqui?


    Cumprimentos.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 11/8/2013, 08:24

    Desculpa Hary, não consegui parar para te dar uma força.

    Monte uma tabela con seguintes campos.

    dataFechamento  'aqui o programação deverá lançar a data do último dia de cada mês
    TotalEntrada
    TotalSaida
    SaldoFechamento

    Use um recordset pela tabela de movimento e vai realizando os cálculos, fechando cada mês.

    Esta tabela terá então os valores para vc realizar a consulta por periodo

    30/11/2009 - R$35.900,00 - R$18.600,00 - R$45.600,00
    31/12/2009 - R$39.500,00 - R$37.100,00 - R$48.000,00
    31/01/2010 - R$41.000,00 - R$70.000,00 - R$19.000,00


    Nota:  Dependendo da empresa, a tabela movimento poderá acumular um volume muito grande de registros, o que é ruim para o desempenho do aplicativo.   O Fisco pode investigar até 7 anos de vida de uma empresa.  Movimentos da conta, inferiores a 7 anos, podem então serem excluidos ou passados para BD "ArquivoMorto".  Converse com o dono da empresa sobre este aspecto.   Assim vc manterá o volume de dados desta tabela sobre controle.

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 11/8/2013, 13:38

    Bom dia Avelino, obrigado pelo retorno...

    Então.. para o Saldo creio que seria isto mesmo... 

    E para a lista?


    Lembrando que tenho os seguintes retornos ao clicar na TreeView:

    Mes: Junho (texto)
    Ano: 2013 (Numero)


    Veja se estou correto.. e teria que aplicar o filtro nesta parte na função:


    A parte do cídgo seria essa ?

    '-----------------------------------------------------------------------------------------------------------------------------------------
    'Data limite para acumular o saldo. Estou aqui estipulando que acumule o saldo a partir do centésimo dia, em relação ao último lançamento
    '-----------------------------------------------------------------------------------------------------------------------------------------
    DataLimite = DMax("DataMovimento", "tmp_tblMovimento") - 100

    Bom, vc poderia então montar a data com a função DateSerial().  Exemplo:

    dateserial(year(#09/2010#),month(#09/2010#),0)  ::::> retorna 30/08/2010
    dateserial(year(#09/2010#),month(#09/2010#)+1,0) :::::> Retorna 30/09/2010

    Suponho então que vc queira algo assim:

    DataLimite = dateserial(year(#09/2010#),month(#09/2010#)+1,0)



    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 11/8/2013, 14:16

    Bom dia Avelino... Veja se estou no caminho correto...

    Criei uma função nova para uso com a treeView...
    Esta função checa os valores nas caixas texto txtFiltro(Mes) e txtFiltroano(Ano) e cria uma outra tabela temporária


    Public Function fncMontaSaldoTreeView()
    Dim Rs As DAO.Recordset
    Dim Acumulado As Double
    Dim StrSQL As String
    Dim D As Integer
    '----------------------
    'Limpeza
    '---------------------
    Call fncLimpaCampos
    Me!tx1 = Null: Me!tx2 = Null
    '---------------------------------------
    'Desacopla listbox da tabela temporária
    '---------------------------------------
    Me!Lista.RowSource = ""
    '--------------------------------------------------------------------------------------------------------------------
    'Passa para a variavel "d" um dos valores (3,7,15,30,60,90) , dependendo da quantidade de dias escolhida no quadro
    '--------------------------------------------------------------------------------------------------------------------
    D = Switch(Me!Quadro = 1, 3, Me!Quadro = 2, 7, Me!Quadro = 3, 15, Me!Quadro = 4, 30, Me!Quadro = 5, 60, Me!Quadro = 6, 90)
    '--------------------------------------------------
    'Passa para a variavel o nome da tabela temporaria
    '--------------------------------------------------
    tblTemp = "tmp_tblMovimentoTreeView"
    '------------------------------------------------------
    'Monta a SQL que irá criar a tabela temporaria local
    '-----------------------------------------------------
    'txtFiltro exibe o Mês, caso seja nulo monta a tabela para comportar os registros do ano
    If IsNull(Me.txtFiltro) = True Then
        StrSQL = "SELECT tblMovimento.*, Cdbl(0) as SaldoLinha "
        StrSQL = StrSQL & "INTO " & tblTemp & " FROM tblMovimento "
        StrSQL = StrSQL & "WHERE Format(dataMovimento,'yyyy') = " & txtFiltroAno & ";" ' ORDER BY dataMovimento;"
    Else
        'txtFiltro exibe o Mês, caso não seja nulo monta a tabela para comportar os registros do ano e mês
        StrSQL = "SELECT tblMovimento.*, Cdbl(0) as SaldoLinha "
        StrSQL = StrSQL & "INTO " & tblTemp & " FROM tblMovimento "
        StrSQL = StrSQL & "WHERE Format(dataMovimento,'yyyy') = " & txtFiltroAno & " And Format(dataMovimento,'mmmmm') = " & txtFiltro & ";" ' ORDER BY dataMovimento;"
    End If
    '---------------------------------------------------
    'Executa a função que irá crar a tabela temporaria
    '---------------------------------------------------
    If fncCriarTabela(StrSQL, tblTemp, 102030) Then
        '---------------------------------------------------------------------------------------------------------------------------------
        'Passa o Saldo do Caixa para o campo txSaldo
        'O Saldo final é composto do saldo acumulado, que fica armazenado na tabela tblMovimentoConfig, mais o saldo residual da tabela tblMovimento
        'Este procedimento evita ter que somar os valores desde o primeiro registro lançado
        '---------------------------------------------------------------------------------------------------------------------------------
        Me!txSaldo = Nz(DLookup("SaldoCaixa", "tblMovimentoConfig"), 0) + DSum("[valorCredito] - [valordebito]", "tblmovimento", "Fechado =0")
        Me!SaldoAnterior = Me!txSaldo - DSum("[valorCredito] - [valordebito]", tblTemp)
        Acumulado = Me!SaldoAnterior
        '--------------------------------------------------------------------------------------------------
        'Abre o recordset da tabela temporaria para calcular e salvar o saldo acumulado por linha(registro)
        'Gravar o Saldo por linha facilita a montagem do ListBox e do Relatório
        '--------------------------------------------------------------------------------------------------
        Set Rs = CurrentDb.OpenRecordset("select * From " & tblTemp & " ORDER BY dataMovimento")
        Do While Not Rs.EOF
            Acumulado = Acumulado + (Nz(Rs!ValorCredito, 0) - Nz(Rs!ValorDebito, 0))
            Rs.Edit
                Rs!SaldoLinha = Acumulado
            Rs.Update
            Rs.MoveNext
        Loop
        Rs.Close
        Set Rs = Nothing
        '--------------------------------------------------------------
        'Carrega a listbox com todos os registros da tabela temporaria
        '--------------------------------------------------------------
        'Call fncCarregalista("idcaixa > 0")
    End If
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 11/8/2013, 17:42

    Boas Avelino... Criei duas Funções distintas..



    Uma para O Ano Clicado na TreeView


    Código:
    Public Function fncMontaSaldoTreeViewAno()
    Dim Rs As DAO.Recordset
    Dim Acumulado As Double
    Dim StrSQL As String
    Dim D As Integer
    '----------------------
    'Limpeza
    '---------------------
    Call fncLimpaCampos
    Me!tx1 = Null: Me!tx2 = Null
    '---------------------------------------
    'Desacopla listbox da tabela temporária
    '---------------------------------------
    Me!Lista.RowSource = ""
    '--------------------------------------------------------------------------------------------------------------------
    'Passa para a variavel "d" um dos valores (3,7,15,30,60,90) , dependendo da quantidade de dias escolhida no quadro
    '--------------------------------------------------------------------------------------------------------------------
    D = Switch(Me!Quadro = 1, 3, Me!Quadro = 2, 7, Me!Quadro = 3, 15, Me!Quadro = 4, 30, Me!Quadro = 5, 60, Me!Quadro = 6, 90)
    '--------------------------------------------------
    'Passa para a variavel o nome da tabela temporaria
    '--------------------------------------------------
    tblTemp = "tmp_tblMovimentoTreeViewAno"
    '------------------------------------------------------
    'Monta a SQL que irá criar a tabela temporaria local
    '-----------------------------------------------------
    'txtFiltro exibe o Mês, caso seja nulo monta a tabela para comportar os registros do ano
        StrSQL = "SELECT tblMovimento.*, Cdbl(0) as SaldoLinha "
        StrSQL = StrSQL & "INTO " & tblTemp & " FROM tblMovimento "
        StrSQL = StrSQL & "WHERE Format(dataMovimento,'yyyy') = " & txtFiltroAno & ";" ' ORDER BY dataMovimento;"
    'dateserial(year(#09/2010#),month(#09/2010#),0)
    '---------------------------------------------------
    'Executa a função que irá crar a tabela temporaria
    '---------------------------------------------------
    If fncCriarTabela(StrSQL, tblTemp, 102030) Then
        '---------------------------------------------------------------------------------------------------------------------------------
        'Passa o Saldo do Caixa para o campo txSaldo
        'O Saldo final é composto do saldo acumulado, que fica armazenado na tabela tblMovimentoConfig, mais o saldo residual da tabela tblMovimento
        'Este procedimento evita ter que somar os valores desde o primeiro registro lançado
        '---------------------------------------------------------------------------------------------------------------------------------
        Me!txSaldo = Nz(DLookup("SaldoCaixa", "tblMovimentoConfig"), 0) + DSum("[valorCredito] - [valordebito]", "tblmovimento", "Fechado =0")
        Me!SaldoAnterior = Me!txSaldo - DSum("[valorCredito] - [valordebito]", tblTemp)
        Acumulado = Me!SaldoAnterior
        '--------------------------------------------------------------------------------------------------
        'Abre o recordset da tabela temporaria para calcular e salvar o saldo acumulado por linha(registro)
        'Gravar o Saldo por linha facilita a montagem do ListBox e do Relatório
        '--------------------------------------------------------------------------------------------------
        Set Rs = CurrentDb.OpenRecordset("select * From " & tblTemp & " ORDER BY dataMovimento")
        Do While Not Rs.EOF
            Acumulado = Acumulado + (Nz(Rs!ValorCredito, 0) - Nz(Rs!ValorDebito, 0))
            Rs.Edit
                Rs!SaldoLinha = Acumulado
            Rs.Update
            Rs.MoveNext
        Loop
        Rs.Close
        Set Rs = Nothing
        '--------------------------------------------------------------
        'Carrega a listbox com todos os registros da tabela temporaria
        '--------------------------------------------------------------
        'Call fncCarregalista("idcaixa > 0")
    End If

    Outra para O Ano e Mês Clicado na TreeView



    Código:
    Public Function fncMontaSaldoTreeViewMes()
    Dim Rs As DAO.Recordset
    Dim Acumulado As Double
    Dim StrSQL As String
    Dim D As Integer
    Dim nMes
    '----------------------
    'Limpeza
    '---------------------
    Call fncLimpaCampos
    Me!tx1 = Null: Me!tx2 = Null
    '---------------------------------------
    'Desacopla listbox da tabela temporária
    '---------------------------------------
    Me!Lista.RowSource = ""
    '--------------------------------------------------------------------------------------------------------------------
    'Passa para a variavel "d" um dos valores (3,7,15,30,60,90) , dependendo da quantidade de dias escolhida no quadro
    '--------------------------------------------------------------------------------------------------------------------
    D = Switch(Me!Quadro = 1, 3, Me!Quadro = 2, 7, Me!Quadro = 3, 15, Me!Quadro = 4, 30, Me!Quadro = 5, 60, Me!Quadro = 6, 90)
    '--------------------------------------------------
    'Passa para a variavel o nome da tabela temporaria
    '--------------------------------------------------
    tblTemp = "tmp_tblMovimentoTreeViewMes"
    '------------------------------------------------------
    'Monta a SQL que irá criar a tabela temporaria local
    '-----------------------------------------------------
    Select Case Me.txtFiltro
        Case "Janeiro"
            nMes = 1
        Case "Fevereiro"
            nMes = 2
        Case "Março"
            nMes = 3
        Case "Abril"
            nMes = 4
        Case "Maio"
            nMes = 5
        Case "Junho"
            nMes = 6
        Case "Julho"
            nMes = 7
        Case "Agosto"
            nMes = 8
        Case "Setembro"
            nMes = 9
        Case "Outubro"
            nMes = 10
        Case "Novembro"
            nMes = 11
        Case "Dezembro"
            nMes = 12
    End Select
        'txtFiltro exibe o Mês, caso não seja nulo monta a tabela para comportar os registros do ano e mês
        StrSQL = "SELECT tblMovimento.*, Cdbl(0) as SaldoLinha "
        StrSQL = StrSQL & "INTO " & tblTemp & " FROM tblMovimento "

        StrSQL = StrSQL & "WHERE Format(dataMovimento,'yyyy') = " &
    txtFiltroAno & " And Format(dataMovimento,'m') = " & nMes &
    ";" ' ORDER BY dataMovimento;"
    '---------------------------------------------------
    'Executa a função que irá crar a tabela temporaria
    '---------------------------------------------------
    If fncCriarTabela(StrSQL, tblTemp, 102030) Then

       
    '---------------------------------------------------------------------------------------------------------------------------------
        'Passa o Saldo do Caixa para o campo txSaldo

        'O Saldo final é composto do saldo acumulado, que fica armazenado na
     tabela tblMovimentoConfig, mais o saldo residual da tabela tblMovimento
        'Este procedimento evita ter que somar os valores desde o primeiro registro lançado

       
    '---------------------------------------------------------------------------------------------------------------------------------

        Me!txSaldo = Nz(DLookup("SaldoCaixa", "tblMovimentoConfig"), 0) +
    DSum("[valorCredito] - [valordebito]", "tblmovimento", "Fechado =0")
        Me!SaldoAnterior = Me!txSaldo - DSum("[valorCredito] - [valordebito]", tblTemp)
        Acumulado = Me!SaldoAnterior
        '--------------------------------------------------------------------------------------------------
        'Abre o recordset da tabela temporaria para calcular e salvar o saldo acumulado por linha(registro)
        'Gravar o Saldo por linha facilita a montagem do ListBox e do Relatório
        '--------------------------------------------------------------------------------------------------
        Set Rs = CurrentDb.OpenRecordset("select * From " & tblTemp & " ORDER BY dataMovimento")
        Do While Not Rs.EOF
            Acumulado = Acumulado + (Nz(Rs!ValorCredito, 0) - Nz(Rs!ValorDebito, 0))
            Rs.Edit
                Rs!SaldoLinha = Acumulado
            Rs.Update
            Rs.MoveNext
        Loop
        Rs.Close
        Set Rs = Nothing
        '--------------------------------------------------------------
        'Carrega a listbox com todos os registros da tabela temporaria
        '--------------------------------------------------------------
        'Call fncCarregalista("idcaixa > 0")
    End If

    Funcionou conforme o esperado
    Partirei agora para o Saldo Anterior e Acumulado




    Cumprimentos.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 12/8/2013, 23:33

    Criada a tblSaldoMensal com os campos ID_SaldoMes, DataFechamento, SaldoFechamento

    a rotina para guardar o saldo acumulado o mês:

    '---------------------------------------------------------------------------------------
    ' Procedure     : fncSaldoMes
    ' Author        : Harysohn P. Pina (PILOTO) - Harysohn@hotmail.com
    ' Fórum         : Fórum Máximo Access -  http://maximoaccess.forumeiros.com/
    ' Date          : 01/09/2013
    ' Comentários   : Calcula saldo para o mês
    '---------------------------------------------------------------------------------------
    Private Sub fncSaldoMes()
    Dim Rs As DAO.Recordset
    Dim StrSQL As String
    Dim SaldoMes As Double
    Dim MaxData As Date
    Dim MaxDataSaldo As Date
    Dim DataUltimoDia As Date
    Dim MesNum As Integer
    Dim AnoNum As Integer
    '--------------------------------------------------------------------------------------------------------------------------------------------
    'Se não tiver registros na tblMovimento encerra a sub
    '--------------------------------------------------------------------------------------------------------------------------------------------
    If DCount("*", "tblMovimento") = 0 Then Exit Sub
    '--------------------------------------------------------------------------------------------------------------------------------------------
    'Carrega a variável com a maior data de movimento na tblMovimento
    '--------------------------------------------------------------------------------------------------------------------------------------------
    MaxData = DMax("DataMovimento", "tblMovimento")
    '------------------------------------------------------
    'Carrega a variável com a maior data  na tblSaldoMensal
    '------------------------------------------------------
    MaxDataSaldo = DMax("DataFechamento", "tblSaldoMensal")
    '------------------------------------------------------------------------------------------
    'Checa se a última data na tblSaldoMensal é um mês menor do que a data do sistema
    'A função só será executada se esta diferença for maior que 1 pois siginifica que ja passou
    'o mês e se torna necessário o cálculo do saldo para o mês anterior
    '------------------------------------------------------------------------------------------
    If Format(Date, "m") - Format(MaxDataSaldo, "m") = 1 Then Exit Sub
        '-------------------------------------------
        'Caso não exista registro na tblSaldo Mensal
        '-------------------------------------------
        If DCount("*", "tblSaldoMensal") = 0 Then
            '-----------------------------------------------------------------------
            'Inclui na tblSaldoMensal o primeiro registro com a data atual e saldo 0
            '-----------------------------------------------------------------------
          
      CurrentDb.Execute "INSERT INTO tblSaldoMensal (DataFechamento,SaldoFechamentoMes) Values(#" & Format(Date, "mm/dd/yyyy") & "#,'0')"
        Else
            '-----------------------------------------------------------
            'Se a variável MaxDataSaldo for menor que a variável MaxData
            '-----------------------------------------------------------
          
      If MaxDataSaldo < MaxData Then
                '----------------------------------------------------------------------------------
                'Carrega a variável com o número do Mês + 1 e o Ano
                'Estes valores servirão para filtrar o recordset com os registros do mês que passou
                '------------------------------------------------------------------------------------------
          
          MesNum = Format(MaxDataSaldo, "m") + 1
                AnoNum = Format(MaxDataSaldo, "yyyy")
                '--------------------------------------------
                'Carrega a variável com a SQL da tblMovimento
                '--------------------------------------------
          
          StrSQL = "SELECT idMovimento, DataMovimento, ValorCredito,ValorDebito From tblMovimento" _
                        & " WHERE  (((Format(dataMovimento,'m')) = " & MesNum & ") AND ((Format(DataMovimento,'yyyy'))=" & AnoNum & "));"
                '--------------------------
                'Seta o recordset com a SQL
                '--------------------------
          
          Set Rs = CurrentDb.OpenRecordset(StrSQL)
                '--------------------------------------------------------------------
                'Realiza loop pelo recordset somando os registros (Crédito - Débito)
                '--------------------------------------------------------------------
          
          Rs.MoveLast: Rs.MoveFirst
                    Do While Not Rs.EOF
                        SaldoMes = SaldoMes + (Rs!valorCredito - Rs!ValorDebito)
                    Rs.MoveNext
                    Loop
                '------------------------------------------------------
                'Somo o resultado com o último saldo na tblSaldoMensal
                '------------------------------------------------------
          
          SaldoMes = SaldoMes + DLast("SaldoFechamentoMes", "tblSaldoMensal")
                '-------------------------------------------
                'Inclui na tblSaldoMensal o saldo para o mês
          
          '-------------------------------------------
          
          CurrentDb.Execute "INSERT INTO tblSaldoMensal (DataFechamento,SaldoFechamentoMes)" _
                                & "Values(#" & Format(DateSerial(Year(MaxData), Month(MaxData) + 1, 0), "mm/dd/yyyy") & "#,""" & SaldoMes & """)"
            End If
        End If
    End Sub

     

    Obrigado pelo excelente exemplo e ajuda Avelino
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3880
    Registrado : 04/04/2010

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Avelino Sampaio 13/8/2013, 07:44

    Que ótimo vc ter conseguido!

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidado
    Convidado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Convidado 13/8/2013, 14:51

    Exemplo no repositório:

    http://maximoaccess.forumeiros.com/t14639-movimento-de-caixa-com-filtro-para-ano-e-ano-mes-em-treeview


    Cumprimentos.
    alozs
    alozs
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 298
    Registrado : 07/02/2018

    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  alozs 16/4/2021, 21:31

    HARYSOHN, vc teria esse exemplo para respostar, não achei no repositório

    Conteúdo patrocinado


    [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária Empty Re: [Resolvido]Adaptação em código de geração de saldo acumulado em tabela temporária

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 3/5/2024, 04:37