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.
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
'----------------------------
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
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
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!
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)
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
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
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
'---------------------------------------------------------------------------------------
' 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