Outra solução e que considero mais eficaz é a que havia citado antes, da utilização de recordset filtrado pelo ano.
Obs. Retirei no exemplo a vinculação do Form x SubForm pois como o subFOrm esta baseado em uma consulta, a vinculação Campo Mestre x FIlho esta a dar erro, Vincule seu sub form a uma consulta onde tenha apenas os demais dados do subForm, e para o preenchimento das caixas texto dos meses, esta instrução:
'Função feita por Harysohn Pina para WPitarreli - Fórum MáximoAccess
'Crio uma variável do tipo Array para receber os nomes abreviados do texto
'esta função será utilizada para preenchimento das caixa texto, visto que o nome das mesmas esta como
'ComJan, ComFev, ComAbr.....
'Assim ao relizar o loop pelos controles eu aplico o nome Com + A função meses (que retornara: 0=Jan, 1-Fev, 2=Mar, 3=Abr etc..)
Public Function Meses() As Variant
Meses = Array("JAN", "FEV", "MAR", "ABR", "MAI", "JUN", "JUL", "AGO", "SET", "OUT", "NOV", "DEZ")
End Function
Private Sub ComboAno_AfterUpdate()
'Remete para a função TrataErro para o tratamento de erros quando da execução da rotina
On Error GoTo TrataErro
Dim Db As DAO.Database
Dim Rs As DAO.Recordset
Dim StrSQL As String
Dim I As Integer
'Adiciono a esta caixa texto o ano selecionado na combo, para posterior filtragem do Recordest
Me.txtAno = Me.ComboAno.Value
'SQL para adicionar ao recordset os valores do mês'
StrSQL = ("SELECT Format([DataPedido],'yyyy') AS [Ano Ref], TB_REPRESENTANTE.Vendedor, Format([DataPedido],'mmm') AS Mes," _
& "Sum(Cs_ListaPedido.PreçoTotal) AS SomaDePreçoTotal, Format([DataPedido],'m') AS MeRes" _
& " FROM TB_REPRESENTANTE INNER JOIN (Cs_ListaPedido INNER JOIN Tb_Pedido ON Cs_ListaPedido.CodPedido = Tb_Pedido.CodPedido)" _
& " ON TB_REPRESENTANTE.CodVendedor = Tb_Pedido.Vendedor" _
& " GROUP BY Format([DataPedido],'yyyy'), TB_REPRESENTANTE.Vendedor, Format([DataPedido],'mmm'), Format([DataPedido],'m');")
'Esta é a parte que popula os campos do formulário
'Observe que o recordset é filtrado pelo ano
Set Db = CurrentDb
Set Rs = Db.OpenRecordset(StrSQL)
'Faço o loop pelos registros do recordset
Do While Not Rs.EOF
'Defino a quantidade de vezes que esta parte será executada, de acordo com o numero de meses do ano
'começa em zero posto que na varivel meses o primeiro mes Jan está na posição 0 da Array
For I = 0 To 11
'Aqui a cada volta vai modificando o nome da caixa texto para que a cada loop do recordset
'Modifique em que caixa será incluido o proximo registro do recordset
' Obserque que ("Com" & Meses(I)) - A funcao meses retornara o texto de acordo
' com a posicao dentro da array que vai modicando a cada looo do I
Forms!Frm_Representante.Sub_RepresentanteComissao!("Com" & Meses(I)) = Rs!SomadePreçoTotal
'Move para o proximo registro do Recordset
Rs.MoveNext
Move para a proxima variável I que vai de 0 a 11
Next I
Loop
Exit Sub
' esses dois tratamento de erros a segui (2113 e 3021) são necessário para que quando um representante nao tiver lancamento em todos os meses, nao ocorrer erro no preenchimento dos campos.
Exit_TrataErro:
DoCmd.Hourglass False
DoCmd.Echo True
Exit Sub
TrataErro:
If Err.Number = 2113 Then
Resume Next
ElseIf Err.Number = 3021 Then
Exit Sub
Else
DoCmd.Hourglass False
DoCmd.Echo True
MsgErro = "Erro # " & Str(Err.Number) & " gerado na " & Err.Source _
& vbNewLine & vbNewLine & "Descrição: " & Err.Description _
& vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
MsgBox MsgErro, vbMsgBoxHelpButton + vbCritical, "Erro", Err.HelpFile, Err.HelpContext
Resume Exit_TrataErro
End If
End Sub
https://dl.dropbox.com/u/26441349/WPitarelli.rar
Cumprimentos.
Última edição por PILOTO em 17/6/2012, 02:34, editado 1 vez(es) (Motivo da edição : Exluir parte duplicada no código)