Como trazer soma de campo de subformulário para formulário principal

Como referenciar controles de um subformulário para um formulário principal.

Não precisa ser conhecedor de linguagem Visual Basic no Microsoft Access para realizar esta tarefa.

Considerando que um determinado banco de dados precise realizar um subtotal de um campo contido dentro de um subformulário para ser considerado numa fórmula de um campo no formulário principal.

Tomando por base o seguinte exemplo, com base no formulário a seguir:

 Formulario
(Para melhor visualização, clique na imagem)

Para melhor entendimento do caso: O formulário acima trata de registrar o movimento de uma locadora. Para isso, além dos próprios dados do registro da locação em si (número registro, data da locação, desconto, etc.), utiliza os dados do cliente (cadastrado em tabela própria), relacionado pelo campo CodCliente. Para relacionar uma série de produtos (que também tem seu relacionamento em tabela própria vinculados pelo CodProduto) que podem ser locados de uma só vez no mesmo registro de locação, em tabela específica relacionada (no exemplo, LocaçãoDetalhes), um suformulário foi criado automaticamente, quando da geração do formulário principal no modo assistente tendo por base a tabela Locação (com os dados da locação em si) e a tabela LocaçãoDetalhes (com a lista de produtos locados). Como toda lista de produtos com preço, é necessário realizar uma somatória para saber quanto foi, ao final, o valor total da locação, neste caso, considerando também o desconto e a multa, caso aplicados.

Visualizando, portanto, o formulário principal no modo design, pelo comando menu Exibir – Modo design (com o formulário aberto):

Formulario-mododesign
(Para melhor visualização, clique na imagem)

Observar que o campo Total Geral, previsto no formulário, ainda não se encontra, já que este será um campo calculado a ser inserido posteriormente.

Passo 1º: criando a fórmula no subformulário LocaçãoDetalhes Subformulário

Exibindo área de rodapé: 

Observando a necessidade para somar todos os dados de Preço para cada locação, deve-se, primeiro, entrar no subformulário, exibindo seu rodapé.

 Subformulario-rodape

Inserindo caixa de texto: 

Nesta nova área (rodapé), para, então, inserir uma caixa de texto, clicando na opção caixa de texto da caixa de ferramentas do Access:

 Caixadeferramentas-caixadetexto

Adicionando, portanto, uma caixa de texto, acompanhada de um rótulo, com campo não acoplado em sua fonte de controle:

 Caixadetexto-naoacoplado

Construtor de expressões – fórmula: 

Agora, deve-se construir a fórmula, que somará os preços do subformulário, ou seja, que somará o campo Preço agregado a Tabela LocaçãoDetalhes, de forma que ficará vinculada a soma, posteriormente, somente dos preços listados por Locação.

Podemos inserir esta fórmula digitando diretamente na caixa de texto, onde tinha inicialmente “Não Acoplado”, como, também, informando na propriedade Fonte de controle, disponível através do menu pop up, pelo comando propriedades…:

 caixadetexto-propriedade

 Guia Dados – Fonte do Controle …:

Propriedades - Dados - Fonte do Controle

Propriedades - Dados - Fonte do Controle

No Construtor de Expressões, usando a Função interna de Agregação SQL Soma().:

FuncaoSoma
(Para melhor visualização, clique na imagem)

Tendo, entre parênteses, o campo Preço do subformulário como parâmetro de cálculo:

soma-preco
(Para melhor visualização, clique na imagem)

Clicando no botão Ok, construindo a expressão na propriedade Fonte de Controle da caixa de texto:

=Soma([Preço])

Onde:

* Soma(…) é a função agregada em banco de dados, ou seja, só soma campos de tabela!
* [Preço] é o campo considerado no subformulário corrente, mas, na verdade, é o constante na Tabela LocaçãoDetalhes. O subformulário corrente que contém um objeto com o mesmo nome de sua Fonte de Controle (Preço de certa tabela), o que apenas facilita a questão do da criação desta soma, mas se tiver nome seu diferente, o que vale é o constante na Tabela.

OBSERVAÇÃO: A função Soma é uma função interna de agregação SQL, e o que se pode entender disso é que esta função soma os dados constantes no banco de dados (Tabela e não do formulário!) e, neste caso, vinculará, posteriormente, já no formulário principal, a soma dos valores de Preço (relacionado de certa Tabela) que pertencerem ao movimento da Locação do respectivo registro, portanto, somando para cada locação o total dos preços.

Na caixa de propriedades da caixa de texto, deve-se, para se orientar melhor, informar novo nome desta caixa, para futura referência em campo do formulário principal:

 propriedades-caixadetexto-nome
(Para melhor visualização, clique na imagem)

Passo 2º: criando fórmula no formulário principal 

No formulário principal, haverá uma formula numa nova caixa de texto a ser inserida com o rótulo Total Geral, onde importará a soma realizada no rodapé do subformulário, subtraindo o valor presente em [Desconto] e adicionando o da [Multa], campos estes do próprio formulário.

Para isso, inserir a caixa de texto (ver inserção de caixa de texto, explicado para o rodapé do subformulário acima) e, logo após, construir a expressão (ver também constutor de expressões – fórmula, acima):

 totalgeral-construtordeexpressoes-formulafinal
(Para melhor visualização, clique na imagem)

A fórmula final na caixa de texto, então, será:

=[LocaçãoDetalhes Subformulário].Formulário!Subtotal-[Desconto]+[Multa]

Onde:

* [LocaçãoDetalhes Subformulário].Formulário!Subtotal é a indicação de referência de campo externo ao formulário corrente, no caso, ao campo Subtotal criado no formulário LocaçãoDetalhes Subformulário
* [Desconto] é um campo do atual formulário que conterá o valor a ser descontado no registro da locação
* [Multa] é um campo do atual formulário que conterá o acréscimo a ser registrado na locação.

Uma observação final:

Percebi que não se deve criar um campo em Tabela com o nome Valor, pois quando utilizado em função agregada, ele, simplesmente, não é reconhecido, gerando #erro no resultado da fórmula. Este pequeno detalhe quase me tirou o sono durante alguns dias e foi um dos motivos da existência deste blog.

Carpe diem.

53 comentários sobre “Como trazer soma de campo de subformulário para formulário principal

  1. camilo disse:

    grande post! grande blog!

    me salvou aqui, pois estava no caminho do “Valor”….
    q coisa estranha essa de não poder utilizar o nome valor…
    será que é uma palavra reservada do Access?

    abraços

  2. atellierfeitoemcasa disse:

    Álvaro, tentei fazer, mas não deu certo…
    tenho o Access2003, não sei se é por isso.
    Chamando o construtor de expessões pelo “Construir Evento” reparei que ele não fica no “Fonte de Controle” como na sua imagem e sim no “Evento” “Antes de Atualizar”, e se eu recorto ele pra lá aparece “#Erro”.
    A expressão tem que ficar em qual?

  3. tom disse:

    desejo saber que formula devo utilizar e onde devo digitala, para ter o movimento de caixa simples, aquele que tem a entrada,saida e o saldo, e conforme voce vai digitando o valor no campo da saida o saldo automaticamente diminui,e se voce digita o numero no campo da entrada o saldo automaticamente aumenta,sendo o saldo sempre entrada – saida + saldo. nossa que confuzo desculpe-me mas em fim me ajude por favor.

  4. Norimar disse:

    Apliquei seu exemplo em meu aplicativo e funcionou legal, só que quando no subform não tem valor a somar o total (campo) no form principal fica com #ERR nos demais quando tem valor o campo traz a soma como deve OK.

    Teria como retornar no campo se não tiver o que somar ficar com zeros.

    Norimar

  5. Carlos Henrique disse:

    olá
    não consegui fazer um campo calcula valor total no formulário, apliquei a fórmula proposta mas não deu… tem como eu te enviar um e-mail com o bd pra vc olhar?

    att

  6. Guilherme disse:

    Boa tarde Alvaro estou montando um banco de dados pra venda de produtos e gostaria de saber como fazer pra puxar os dados quando digitado no formulario, por exemplo digitar o telefone do cliente e nos campos do formulario aparecer os dados do cliente e na mesma coisa com os produtos e nao estou conseguindo fazer no access 2003
    fico grato…
    sem mais

  7. Álvaro Caldas disse:

    Guilherme, estou ainda terminando um post sobre mais ou menos isso que você tratou neste comentário. Mas já mandei alguma resposta pro seu e-mail. Abraço.

  8. Hugo Tavares disse:

    Olá Álvaro!

    consegui fazer o que esta no post foi muito util, só nao foi mais pq nao esta alimentando a tabela você pod me ajudar?

  9. Hugo Tavares disse:

    Álvaro como você me pediu te envie um e-mail com uma copia do arquivo é dês de já muito obrigado e um otimo ano novo pra vc tbm!!

  10. Mateus disse:

    E ai! Álvaro.. Beleza Cara?
    Eu tentei aplicar o seu exemplo no meu formulário de orçamento mas não tive sucesso, já fiz milhares de vezes e ainda continua dando o bendito “#Erro”… Cara! tem como vc me ajudar eu já estou desesperado… Posso te mandar um e-mail com meu BD pra vc dar uma olhada pra mim???
    Desde já Agradeço!

  11. Mauro George disse:

    Cara, tenho um formulário com subformulário, o qual consta uma coluna com valores, que por sua vez esta sendo somada em um campo no formulário. O que estou tentando fazer é atualizar o valor somar toda fez que lanço algum valor no subformulário. Se puder me ajudar eu agradeço. Obrigado.

  12. jmoreira disse:

    Alvaro pesquisei muitos livros e nehum deles mencionou que o campo valor daria erro quando se utilizasse a função Soma(). Voce em 5 linhas de uma observação final resolve o problema de muitos. Como homenagem a essa sua Dica e logicamente a voce acho que devo escrever “Nunca tantos deveram tanto a tão poucos. Parabens e um abraço do agora seu amigo
    jmoreira

  13. Wiliam disse:

    Boa tarde, alguém poderia me ajudar com um pequeno problema que estou tendo. Fiz um Formulário principal chamdo “MENU” e criei um subformulário não vinculado a tabela com o nome “Menuquadro” (com isso neste espaço eu alterno os formulários dentro do formulário principal. até aqui tudo estava legal. Porém preciso abrir um lista de referencia “consulta” com filtro de um registro que está dentro do subformulário “Ordem de os”. (se a consulta fosse no formulário principal ficaria assim no condição “FORMULÁRIOS![MENU]![ID_CLINTE], porém ele está dentro de um subformulário e não consigo fazer a consulta buscar a informação. desde já agradeço a ajuda.

  14. RAIJE disse:

    foi muito bom conhecer este site, eu estava enrascado para colocar um total de sub-formulário no formulário principal e eu trabalho com access 2007

    mas encontrei nessa página a luz:Como trazer soma de campo de subformulário para formulário principal « Álvaro Caldas’ Info
    adaptei para o access 2007e pronto, sendo que as sisnteses e expressões são as mesmas para todas versões

    muito obrigado

    continue a nos ajudar

  15. Hildes bruno disse:

    to com dificultades de somar campos em diferentes dabelas no acess….sempre da erro de expressão ou de funçao…..poderia me ajudar. to fazendo através de consulta é isso mesmo ?? são quatro campos de diferentes tabela .

  16. Ana disse:

    Olá Álvaro desde já obrigado pelo post, ajudou bastante, no entanto e apesar de ter funcionado no meu exemplo, hoje para meu espanto ao abrir a base de dados a caixa de texto deixou de mostrar o tão desejado valor e retomou a mensagem #Erro, já voltei a repetir o processo mas surge sempre essa mensagem.

    Já agora como consigo fazer com que o rodapé do subformulário fique visivel? Para mim era suficiente mas não o consigo fazer.

    Obrigado!

  17. rildo disse:

    Álvaro eu estou precisando de ajuda, eu estou criando um banco de dados em access, para controle de uma gráfica, ja criei todas as tabelas dos produtos, clientes, etc… Agora eu quero criar a de vendas, só que eu quero criar com um subformulário, ou melhor, se for necessario, pois eu quero relacionar os campos do cadastro dos produtos e clientes, para que quando eu slecionar o código do cliente e do produto tudo apareça automático, eu ja vi um exemplo seu que explicava como fazer isso, so que quando eu vou fazer da erro, aparece a seguinte mensagem: “Subscrito fora do intervalo” o que eu posso fazer? Me ajuda ai!! To desesperado pois eu criei mais ou menos umas 70 ou 80 tabelas, e ja cadastrei mais ou menos uns 1,200 produtos, pois eu ja fui fazendo a tabela e cadastrando os produtos!!!
    Me AJUDA AI VAI!!!!!

  18. Murilo Bomfim disse:

    Alvaro estou com o mesmo problema da maioria, o acces é 0 2007, quando utilizo a sua formula aparece que deu erro, como posso fazer para resolver este problema?
    Aguardo resposta no e-mail
    MAs desde já obrigado

  19. Edson Regis disse:

    Alvaro.

    Conforme sua instrução, coloquei no rodapé do subformulário uma caixa de texto com =soma([vrtotal] buscando obter o somatório de campos calculados que estão no subformulário. Após, inserí uma caixa de texto que faz referência a caixa anteriormente citada, com a seguinte sintaxe:
    =[Formulários]![frm_composições]![q_insumo_comp subformulário].[Formulário].[vrtotal]
    No final, estou obtendo um valor parcial e não a soma.
    Antecipadamente agredeço.

  20. Pily disse:

    Boa tarde Alvaro,

    Tenho a seguinte situação um formulário com dois subformulários.
    Fórmulário: Projeto
    SubFormulário1: Unidades do projeto (n unidades para cada projeto)
    SubFormulário2: Equipamentos das unidades (n equipamentos para cada unidade)
    . quantidade/unidade/tipo da unidade/
    No Subformulário 2 calculo a carga de cada equipamento = potencia* quantidade.
    O total da carga da unidade consegui colocar no rodapé do Subformulário um seguindo as suas dicas. Este total está em um campo não acoplado no rodapé.
    Agora preciso que esse valor apareça no Subformulário1 como uma coluna ao lado do tipo da unidade.
    Coloquei da forma que vc explicou mas ele aparece #erro
    Você pode me ajudar?
    Obrigada
    Pily

  21. Gerson disse:

    Alvaro, realmente as suas explicações são muito claras e faceis de entender, mas infelizmente não consegui fazer somar um campo de um subformulário. Esta melhoria em meu arquivo de Access é importantíssimo para o termino da minha tarefa. Você poderia me enviar um exemplo bem básico de uma soma de uma coluna de valores em um subformulário, pois tentei varias vezes fazer o seu exemplo e não tive sucesso. Desde já agradeço a ajuda….

  22. José Costa disse:

    Exmo Senhor
    Agradecia que me enviasse para o meu e mail a formula que actualiza um saldo no próprio campo na base de dados Acess XP, Ex: entrada, Saida e Saldo, qual a formula que permite uma actualização constante na coluna do Saldo?´
    Aguardo resposta.
    Antecipadamente agradeço

    José Costa – Portugal

  23. unipog disse:

    Álvaro,

    Estou seguindo passo a passo sua orientação (que por sinal é um belissímo tutorial) porém estou com o mesmo problema que os outros colegas – surgindo a indesejada mensagem #Nome?

    Posso te enviar meu bd por email para vc analisar?

    Se, sim qual é o teu email?

    Esse simples probleminha está me tirando o sono já alguns dias….

    Meu email pessoal é whayners@hotmail.com

    Fico no aguardo…

  24. Fabio Amaral disse:

    Olá! Muito boa a sua dica!!!

    Gostaria de saber se teria como, ao invés de lançar uma daquelas funções (Soma, Média etc) fazer uma concatenação de textos na “totalização”.

    Tenho uma rotina em VB no Access que gera emails em formato texto e, como não quero enviar dados do pedido no formato de um anexo, mas sim na redação do texto, preciso que apareçam todos os registros de meu subformulário.

    Quando o cliente pede apenas um produto, eu não tenho problemas pois já encontrei uma forma de transportar o conteúdo do campo atualmente ativo no subform, porém não consigo copiar o conteúdo dos demais. Sua solução me ajudará muito com os valores, mas eu preciso também listar o nome dos produtos, quantidades de cada um etc…

    Parabéns de qualquer forma pela utilíssima informação!

    Fabio

  25. Daniel Delgado disse:

    Álvaro, animal seu post, se permite, vou dar uma complementada depois de perder umas 3 horas pra conseguir fazer!

    1) se você está utilizando um subformulário que é do tipo “folha de dados” o rodapé não aparece de jeito nenhum na exibição “Modo Formulário”, porém, você deve colocar o campo de cálculo mesmo assim no rodapé.

    2) Depois de ter feito este procedimento, você deverá inserir no rodapé da PÁGINA um campo uma “caixa de texto” que “puxe” a informação do subtotal que foi criado no rodapé da página do formulário. Para isso, crie a caixa de texto, depois vá em “Propriedades” da caixa de texto e no item “Fonte de Controle”, insira uma expressão que “puxe” o valor do campo subtotal criado no item 1 deste meu post que está no subformulário.

    Pronto!

    É uma coisa tão idiota, mas quem está acostumado com o Excel fica totalmente perdido com a “lógica” do access.

    Valeu! Abraços Daniel

  26. Deise disse:

    Olá,

    Estou criando um banco de dados com muita dificuldade!
    Eu gostaria de somar os sálários dos alunos para ver mais rapidamente qual é a renda mensal, mas não estou conseguindo…
    O formulário está em forma de tabela, tem o salário de cada pessoa que mora na mesma casa, então eu preciso fazer a soma disso e não consigo… Você poderia me ajudar? Meu access é o 2007.
    Um abraço!
    Deise

  27. Leandro disse:

    Amigo, genial esse seu tutorial. Fiz aqui e deu certo. Mas preciso avisar aos companheiros que penei muito até chegar a conclusão que meu erro estava no mome que dei ao meu campo “VALOR”. Esse nome na tabela não sei porque dava erro na expressão dentro do formulario. Talvez porque ela faça parte de alguma sintaxe do VB. Mas depois que mudei para “Preço” deu tudo certinho . Fica ai a dica para quem teve o mesmo problema que eu. Abraço

  28. Anderson disse:

    Olá Álvaro,
    Parabéns pelo esclarecedor tutorial, no entanto estou encontrando alguns problemas para fazer algo similar, uma contagem de registros com critério, utilizando a função agregada DContar(). Gostaria de saber se posso enviar para seu email pessoal o link para baixar meu aplicativo para que possa entender meu problema.
    Grande abraço

  29. Highlander disse:

    Bom PessoALL,

    Estou aqui apenas para deixar meu comentário SOBRE O ACCESS 2003 de modo a ajudar pessoas que ao tentar fazer uma soma no rodapé de um formulário, conseguiam apenas o dado #ERRO.
    SOLUCIONEI / DESCOBRI o problema !! Estava acontecendo a mesma coisa comigo que o Álvaro comentou e da mesma forma ficquei noites sem dormir pensando numa solução!!
    Bom, vamos lá…..
    1º Um conselho que dou é colocar no nome do controle o mesmo nome que vc colocou no campo (BD) para evitar este tipo de dor de cabeça.
    2º Por desencargo, não usem no nome do campo “Valor/valor” conforme nosso amigo Álvaro colocou.
    3º Para não dar “#ERRO” na expressão “=Soma([parcela])”, o valor do que está dentro de colchetes deve ser o nome do campo que está no BD referente ao seu controle. Ex: Se seu controle tem um nome “Valor_Parcela” e este campo no BD está vinculado na Tabela (BD) ao nome “parcela”, é este último que vc deve usar!!! Se usar o nome do controle vai dar #ERRO.
    4º No ACCESS 2003, se vc tiver um formulário com cabeçalho, detalhe e rodapé e vc quiser fazer um cálculo do rodapé pegando um campo de detalhe, vc Não DEVE pegar o nome do controle, e sim o nome que está na tabela, MAS se vc fizer um calculo no rodapé e o campo que vc quer somar tbm estiver no rodapé, aí sim vc poder colocar na soma o nome do controle!

    Bom, é isso….. espero q ninguém passe mais pelo que passei!!!
    Um abraço! E muito obrigado Álvaro, vc me ajudou muito!!

    Highlander.
    e-mail: highlander8@bol.com.br

  30. kadu disse:

    Boa tarde ,Fiz um BD pro meu salão aqui ,e preciso de uma ajuda
    Tenho duas tabelas com seus respectivos frm ,preciso de um campo total que exiba que exiba os valores somados de uma determinada data no frm livro caixa ,p.ex: ao digitar uma data no frm para fazer lactos ,o frm exiba o acumulado daquela data especifica e ao adicionar valores esse campo va se atualizando .isso é possivel .obrigado

  31. Wellington disse:

    Boa tarde, como faço para somar em um formulário do access, as saídas de mercadorias.
    em uma caixa de testo não acoplada fiz o seguinte: [preço de venda]*[quantidade de saída], porem, isso soma todas as vendas e gostaria que somasse separadas para cada vez que for efetuar uma venda.

  32. Wellington disse:

    Exemplo: a compra de josé deu R$ 100, e quando abro o formulário de venda para uma nova venda, a soma já inicá nos R$ 100 que foi vendido para josé.
    Gostaria de saber também, como seleciono de uma tabela, toda a linha dela para um formulário.

  33. Wellington disse:

    É possível que o formulário crie um número automaticamente a cada vez que for efetuar uma nova venda e replicar este número até que a venda seja encerrada e que a soma da venda seja vinculada a esse número?

  34. Roberto disse:

    Por favor pode orientar-me como exibir caixa de texto do form ( que contém resultados de outra de caixa de texto de subform ) aparecer o resultado em relatórios. Ex: Pedido de vendas no form tem campo no rodapé com cálculo de totalizações, esses resultados aparecerem no relatório deste pedido que será enviado ao cliente e a fabrica?

  35. Jorge Spindola disse:

    Muito bom!! Encontrei q resposta que esperava. Mas…………… o campo de soma somente atualiza quando eu saio e retorno ao Sistema. Como proceder para atualizar o campo Somatório após teclar “Enter”??

  36. antonio borges disse:

    Amigo: no FORMULARIO ACCESS 2016
    Preciso de sua Grande Ajuda
    TENHO UMA CAIXA DE COMBINAÇÃO:
    Do tipo: SIM e NÃO
    O Usuário ao Escolher a OPÇÃO: “ SIM”. Os Botões de Comando de 25 a 31 Fiquem DESABILITADOS
    O Usuário ao Escolher a OPÇÃO: “ NÃO”. Os Botões de Comando de 25 a 31 Fiquem HABILITADOS

    25_TxtDataSubstituicao
    26_TxtHoraSubstituicao
    27_CboPrefixoSubstituicao
    28_CboPlacaSubstituicao
    29_CboNomeGerenteOficinaSubstituicao
    31_CboNomeCompletoChefeSubstituicao

    “SIM”

    Me.25_TxtDataSubstituicao.Enabled = True
    Me.26_TxtHoraSubstituicao.Enabled = True
    Me.27_CboPrefixoSubstituicao.Enabled = True
    Me.28_CboPlacaSubstituicao.Enabled = True
    Me.29_CboNomeGerenteOficinaSubstituicao.Enabled = True
    Me.31_CboNomeCompletoChefeSubstituicao.Enabled = True

    “NÃO”

    Me.25_TxtDataSubstituicao.Enabled = False
    Me.26_TxtHoraSubstituicao.Enabled = False
    Me.27_CboPrefixoSubstituicao.Enabled = False
    Me.28_CboPlacaSubstituicao.Enabled = False
    Me.29_CboNomeGerenteOficinaSubstituicao.Enabled = False
    Me.31_CboNomeCompletoChefeSubstituicao.Enabled = False

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s