Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Almassy

Como somar pessoas de um Estado?

Recommended Posts

Amigos, sou marinheiro de primeira viajem e estou perdidinho...Estou montando um BD, para um congresso, em que um dos itens é o Estado de origem da pessoa.Como imprimir um relatório onde o resultado seja somente o numero de participantes de cada Estado?Por Exemplo: RJ = 132 pessoasSP= 159 pessoasDF= 59 pessoasPA= 23 pessoasE assim por diante.....Daí, na formulário inicial eu teria um comando que, ao clicar imprimiria este relatório.Se for me indicar um VB, favor dar o caminho completo e como chego lá, ok?Grato.Alexandre

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Almassy:Vamos considerar que sua tabela de congressistas disponha de um campo do tipo texto, utilizado para identificar a Unidade da Federação (Estado) de origem dos mesmos (como deve ser o seu caso). Desconheço quantas pessoas costumam participar desses eventos, mas creio ser improvável que consiga reunir representantes de absolutamente todos os Estados do país e, mesmo que isso ocorra, alguns congressos podem resultar em ausências de uma ou mais Unidades. Logo, devemos identificar quais Estados estão realmente participando do evento. Contaremos com o auxílio de uma consulta (que chamarei de qryEstados) que reúna somente as unidades participantes, descartando as repetições. Sua sintaxe seria:SELECT DISTINCT [uF] FROM tblCongressistasAo mesmo tempo, precisaremos de uma tabela auxiliar (que chamarei de tblEstados) que contenha todos os 26 Estados brasileiros mais o Distrito Federal, e também um campo numérico (que chamarei de Quantidade), o qual receberá o número de congressistas de acordo com a UF (posteriormente, declare essa tabela como origem de seu relatório). A estrutura da tabela poderia ser:UF (campo Texto, declarado como chave primária)Quantidade (campo Inteiro ou Inteiro Longo)Agora, no evento OnClick do botão de comando que mencionou, insira o código abaixo (os apóstrofes indicam comentários e podem ser mantidos): ' declaração das variáveis que serão utilizadas Dim db As Database Dim rst1 As Recordset Dim rst2 As Recordset Dim intEstados As Integer Dim i As Integer Dim intTotal As Integer Dim strUF As String ' indicação que o BD utilizado será o atual Set db = CurrentDb ' aponta-se para a qryEstados Set rst1 = db.OpenRecordset("qryEstados") ' aponta-se a tblEstados Set rst2 = db.OpenRecordset("tblEstados") ' obtém-se a quantidade de Estados participantes, necessário para se definir a ' quantidade de repetições intEstados = DCount("*", "qryEstados") ' a tabela tblEstados recebe valor zero em todos os registros do campo Quantidade, do contrário, ' cada vez que o botão de comando for pressionado, algum Estado presente na última atualização ' e sem nenhum representante no momento atual, permanecerá com seu valor anterior, ' retornando informações incorretas db.Execute "UPDATE tblEstados SET Quantidade = 0" ' o ponteiro é movido para o primeiro registro da consulta qryEstados rst1.MoveFirst ' a estrutura abaixo repetirá o código numa quantidade igual ao de Estados encontrados ' em qryEstados For i = 0 To intEstados - 1 ' a variável strUF recebe o valor do primeiro campo (UF) de qryEstados; lembre-se que ' a contagem das colunas inicia-se em zero strUF = rst1.Fields(0) ' obtém-se a quantidade de Estados participantes na tabela tblCongressistas intTotal = DCount("[uF]", "tblCongressistas", "[uF] = '" & strUF & "'") ' uma mensagem (opcional) permite o acompanhamento da contagem MsgBox "Há " & intTotal & " município(s) do Estado de " & strUF ' o índice é encontrado de acordo com o valor de strUF e faz a edição do campo ' Quantidade para cada registro, fazendo-o receber o valor da variável intTotal With rst2 .Index = "UF" .Seek "=", strUF .Edit !Quantidade = intTotal .Update End With ' move-se para o próximo registro de qryEstados rst1.MoveNext ' repete-se todo o processo numa quantidade de vezes igual ao de Estados encontrados ' em qryEstados Next ' a memória é liberada rst1.Close rst2.Close db.Close Set db = NothingEnd SubPara "incrementar" ainda mais seu relatório, você pode fazer com ele seja baseado numa consulta, que terá como origem a tabela tblEstados, visto que ela possibilita ordernar os resultados alfabeticamente. A sintaxe poderia ser:SELECT * FROM tblEstados WHERE Quantidade <> 0 ORDER BY UFAcho que é isso.Espero ter ajudado.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigão,Este é mais complicado...Vamos lá:Seguindo suas instruções, criei uma tabela “tblEstados”Minha tabela mãe, chama-se “BASE”O que você chama de UF, ma minha tabela mãe está como EstadoCriei uma consulta “qryEstados”No meu formulário incial, coloquei um botão de comando “Totalizar Estados” com o nome: UFsNo evento “ao clicar” entrei no VB e colei o código que você me enviou.Os Problemas...1) Ao clicar no “Totalizar Estados” botão ele diz: “Erro em tempo de execução ‘3800’ > ‘UF’ não é um índice desta tabela... (Há de se considerar que na tabela mãe está com o nome de “Estado” e eu não posso mudar por causa de outros comandos; na consuta “qryEstados” idem, e na tabela “tblEstados” temos as colunas “UF” e “Quantidade”.)2) Na consulta “qryEstados” temos o atrelado com a tabela “BASE”; o campo: Estado e no critérios: eu tentei colar “SELECT DISTINCT [uF] FROM BASE” e dá a seguinte informação: “A sintaxe da subconsulta desta expressão está incorreta – Verifique a sintaxe da sub-consulta e coloque-a entre parêntese.Na “tblEstados” temos os 27 estados listados, mas na consulta “qryEstados” só aparecem 19.Na tabela “BASE” o item Estados é uma Lista de Valores, com os 27 como origem de linha.Ao meu ver, até o momento, não tem nada que atrele as informações da tabela “tblEstados” com a tabela “BASE” que é onde vamos inserir a procedência do participante, que por sinal, estamos com a previsão de 500 a 700 pessoas.Como a tabela “tblEstados” vai conseguir somar os idênticos da tabela “BASE” para poder colocar os quantitativos?Quando clico no botão “Totalizar Estados” ele me dá uma informação, pop-up, “Há 3 representate(s) do Estado RJ”. Quando dou OK, me diz: “Erro em tempo de execução ‘3800’ > ‘UF’ não é um índice desta tabela... E ponto final. Não consigo mais informações.Daí vai para o depurador, e o que aparece grafado de amarelo é “.Index = “UF”, que já troquei por Estado e volta com o mesmo problema.Neste local ficou assim:With rst2.Index = "UF".Seek "=", strEstado.EditA minha intenção é gerar um relatório ou formulário com a informação dos 27 Estados, ou dos x Estados presentes, para poder imprimir. Tipo:Participantes do RJ = XParticipantes do SP = XParticipantes do DF = XParticipantes do PA = X....E assim por diante.Estamos longe desta meta ou são só pequenos reparos na fuselagem?Desculpe lhe importunar com este problema, mas é por uma causa nobre.Depois me diz como nos encontramos para eu lhe pagar o chopp.Grato.Alexandre Almassy

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só para complementar,Observei que no VB o .Index = "UF" está frisado de amarelo, e no MsgBox "Há " & intTotal & " Representante(s) do Estado " & strUF, quando posso o mouse nostrUF em apresenta um flutuante escrito strUF = "RJ"...Não sei o que quiz dizer, mas acho que está focado a só somar RJ.No aguardo.Ats.Alexandre Almassy

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Almassy:Lamento que não deu certo de imediato mas, como você disse, são apenas "reparos na fuselagem", visto que antes de postar a solução efetuei testes e tudo funcionou conforme o esperado.Vamos lá:1) na linha que está indicando erro, altere "UF" para o nome do campo de sua tabela ("Estado"); o erro ocorre porque, durante a compilação, não foi encontrado um campo chamado "UF" em sua tabela;2) você menciona que "colou" a sintaxe da consulta de "qryEstados", enquanto a mensagem de erro alerta sobre uma "subconsulta"; na verdade, a sintaxe SELECT DISTINCT [uF] FROM tblCongressistas é a PRÓPRIA consulta; se você a utilizou como complemento para alguma outra, certamente é o que ocasionou o erro; crie a consulta somente com a expressão abaixo (que já está adaptada para sua tabela):SELECT DISTINCT [Estado] FROM BASEQuanto ao índice de "tblEstado", entre na estutura da tabela, selecione o campo "UF" e declare-o como chave primária (todo campo declarado como chave primária torna-se um índice), ocorre porém que o Access fornece um nome padrão que difere do especificado no código, o que acabou gerando o erro; para corrigir o problema, acesse o menu suspenso, clique no botão "Índices" (aquele com a figura de um raio) e altere o nome do índice para o próprio nome do campo ("UF").Quanto ao retorno de registros diferente do esperado, lembre-se que "qryEstados" foi concebida para retornar informações da "tblCongressistas" (que você chama de BASE), e não de "tblEstados". A consulta em questão selecionará todos os Estados de origem dos congressistas cadastrados, ignorando os duplicados (que devem ser muitos), daí porque utilizei a palavra reservada "DISTINCT".No mais, creio que efetuando essas modificações não haverá mais problemas.Quanto ao "chopp", agradeço o convite, mas eu não bebo. Mas não sou crente (hehehe).Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Spiritwalker, acho que falta só uma porquinha...Agora ele só soma a BA, não quer mais nada com RJ.Ao clicar no botão da página inicial, ele abre um pop-up dizendohá 3 representantes do Estado BAAo dar OK, ele dá um novo erro, dizendo "Erro de tempo de execução'3021': Nenhum registro atual.Quando mando depurar ele apresenta:....Index = "UF".Seek "=", strEstado.Edit (sendo esta parte em amarelo)!Quantidade = intTotal.Update...Agora, o que ainda não entendí é como vou imprimir o relatório destes Estados...Em algum momento vou criar uma pasta "relEstados" ou "formEstados" ?No aguardo e torcendo para que sua paciência não se esgote.Ats.Alexandre Almassyalmassy99@hotmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Almassy:Desculpe pela demora em estabelecer contato, mas estava viajando.A finalidade do código que apresentei não é somar apenas um ou outro Estado, mas TODOS que a consulta "qryEstados" encontrar na tabela "BASE", efetuar a contagem através da função DCount e inserir os resultado no campo "Quantidade" da tblEstados, criada unicamente para isso (você não deve manipular diretamente essa tabela, exceto para consultas, pois seus dados serão inseridos automaticamente pelo procedimento). Isso tudo está envolto numa estrutura de repetição (loop) que fará a seqüência descrita enquanto houver registros, isto é, Estados na consulta "qryEstados". O procedimento foi testado, não ignorou nenhum item retornado pela consulta, somou com exatidão e inseriu corretamente os resultados no campo específico de "tblEstados".Favor verificar passo a passo as adaptações que promoveu.Se ainda assim o problema não for solucionado, favor postar o nome dos campos de sua tabela "BASE" para que eu faça isso por você.Quanto ao relatório, é só criar um baseado na tabela "tblEstados"; se necessário, utilize o "Assistente de relatórios" do Access.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com a minha incompetência de entender os comandos, e usufruir da prestimosa ajuda do companheiro Spiritwalker que pacientemente se envolveu no assunto, resolvi comprar um livro de banco de dados e consegui resolver o problema, que passo aos companheiros.Serei o mais didático possível para auxiliar alguém, que como eu, nada sabe de Access.Tenho uma tabela mãe com o nome “BASE” onde tenho todos os meus registros e que tem várias colunas, sendo uma delas com o nome “Estado” que me informa a origem do convidade do evento.1º) Criei uma consulta com o nome “TODOS os Estados” com o seguinte comando em SQL: (Obs. Quando se visualiza a consulta, tem um símbolo que normalmente é uma regua e um esquadro, com uma seta de rolagem ao lado. Nesta seta de rolagem se emcontra o SQL. Clicar lá e colar o comando, com as suas alterações)SELECT BASE.EstadoFROM BASE;Ou ainda:Campo: Estado Tabela: BASE Total: Agrupar por Classificação: Crescente Mostrar: Sim Critérios: Ou: Obs. Para aparecer a linha “Total:” clica-se no símbolo de soma (um M de lado) da barra de Design da consulta.2º) Criei uma consulta com o nome “consParticipantes por Estado” com o seguinte comando em SQL:SELECT [TODOS os Estados].Estado, Count([TODOS os Estados].Estado) AS ContarDeEstadoFROM [TODOS os Estados]GROUP BY [TODOS os Estados].EstadoORDER BY [TODOS os Estados].Estado;Ou ainda:(Coluna 1)Campo: EstadoTabela: TODOS os EstadosTotal: Agrupar porClassificação: Crescente Mostrar: Sim Critérios: Ou: (Coluna 2)Campo: EstadoTabela: TODOS os EstadosTotal: ContarClassificação: Mostrar: SimCritérios: Ou: Pronto. Já tenho a soma dos Estados, que pode-se somar qualquer lista de valores que tenha em sua caixa de combinação.Daí o resultado é: Nome da lista de valores e as vezes que ele aparece na tabela, nesta coluna.Ou seja, se você tem uma tabela com livros, sapatos, camisas, vídeos, etc. Ele lhe diz quantos livros, quantos sapatos, quantas camisas, quantos vídeos.... você tem nesta tabela.Espero poder ajudar alguém que tem a mesma dificuldade que eu tive.Abçs e MUITA PAZ!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Almassy:Parabéns.Você conseguiu solucionar o problema de uma maneira bem mais simples do que eu havia sugerido, com apenas 2 consultas e sem nenhum código VBA.Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.