Olá, bom dia, boa tarde e boa noite, eu tenho um banco de dados para poder gerenciar o uso de veículos, saber dados sobre quilometragem, abastecimento e manutenção, no futuro irei atribuir permissões para cada tipo de usuário, pois o banco é para um setor de onde faço estágio e cada subsetor é responsável por cada coisa, um irá lançar dados referentes a quilometragem, outro do abastecimento e manutenção, e a minha dificuldade está sendo em demonstrar todos esses dados em um mesmo relatório, no banco o nome é RELATÓRIO GERAL, lá eu informo a quantidade de km percorridos no mês, a média de gasto de combustível e os gastos com combustível e manutenção, todos parametrizados através da placa. Para isso eu criei um formulário GERAR RELATÓRIO ANUAL, lá o usuário informa a placa e a consulta é gerada, colocar todos os dados não foi problema, segui alguns forums e consegui, mas o problema acredito que está em parametrizar essa consulta... quando o relatório é lançado não me retorna os dados de Km, vou enviar aqui o arquivo, testem gerar o relatório com o veículo de placa AAA-0000, agradeço desde já quem estiver disposto a me ajudar!
2 participantes
[Resolvido]Parametrizar relatório com mais de uma consulta
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Maicon- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 267
Registrado : 08/09/2012
- Mensagem nº2
Tabelas com chaves Primárias repetidas
Você tem várias tabelas com chave primária nomeada como identificador duplicado cada tabela tem que ter uma chave primária única como por exemplo : id_veiculos ; id_evento ; id_motorista. caso contrário quando juntares as tabelas em uma consulta vai dar erro sempre.
Abraço.
leia : "http://www.usandoaccess.com.br/tutoriais/classe-no-access-genesis.asp?id=1"
Muito bom artigo e também pesquise sobre relacionamentos de tabelas.
Abraço.
leia : "http://www.usandoaccess.com.br/tutoriais/classe-no-access-genesis.asp?id=1"
Muito bom artigo e também pesquise sobre relacionamentos de tabelas.
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Olá Maicon, muito obrigado pela ajuda, eu fiz a troca dos nomes dos campos de chave primária para não darem conflitos, conforme me orientou, mas ainda assim não obtive resultado, acho que o problema está na passagem de parâmetro, pois eu fiz o teste de abrir o relatório eventos após selecionar o nome do veículo na caixa de combinação, e o relatório não foi filtrado conforme o parâmetro passado pela caixa de combinação
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Eu fiz o teste colocando diretamente no parâmetro a placa, assim a consulta é gerada, mas ela fica com os dados inconsistentes, valor de somas errados...
Maicon- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 267
Registrado : 08/09/2012
- Mensagem nº5
Amigo Verifique a estrutura das tuas tabelas.
Observando teu banco de dados pude observar que tu está repetindo campos em várias tabelas , o conceito de banco de dados é mais ou menos o seguinte tua podes criar tabelas de todas os intens que deseja listar por exemplo a tabela veículos :
A tabela veículos contem os dados :
Id_Veiculos
Veículo
Placa
A Tabela Dados do veículo contem os dados:
Id_Dados_Veiculos
Veículo " Aqui é digitada a placa onde deveria recuperar a placa da tabela veiculos"
ano
renavam
cnpj
e por ai vai em várias tabelas repetiu o campo placa o que gera conflito com os outros campos , se tiver uma tabela com os dados do veículo não precisa lançar na outra tabela não faria sentido, o banco de dados faz justamente isso recupera os dados de forma que seja necessário um registro somente, no demais se trata de relacionamento.
vou tentar trabalhar em exemplo em cima do que está tentando fazer para tentar te passar o conceito.
A tabela veículos contem os dados :
Id_Veiculos
Veículo
Placa
A Tabela Dados do veículo contem os dados:
Id_Dados_Veiculos
Veículo " Aqui é digitada a placa onde deveria recuperar a placa da tabela veiculos"
ano
renavam
cnpj
e por ai vai em várias tabelas repetiu o campo placa o que gera conflito com os outros campos , se tiver uma tabela com os dados do veículo não precisa lançar na outra tabela não faria sentido, o banco de dados faz justamente isso recupera os dados de forma que seja necessário um registro somente, no demais se trata de relacionamento.
vou tentar trabalhar em exemplo em cima do que está tentando fazer para tentar te passar o conceito.
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Ok, fico no aguardo, muito obrigado pela colaboração
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
- Mensagem nº7
Problema de dados duplicados ao gerar consulta
Olá, através de uma instrução SQL eu criei uma consulta, pelo que eu pesquisei eu devo ter uma chave primária e uma chave estrangeira, da qual serve como referência, no meu caso seria a placa e placaabastecimento, placamanutenção e veículo, construi a consulta mas como disse ele gera dados repetidos, se no relatório eu coloco como origem do dado as consultas do abastecimento, da manutenção ou do evento eu consigo um retorno individual com os dados corretos, mas quando uso a consulta que criei não dá certo, vou enviar novamente o banco de dados mas atualizado, fiz tudo que me pediu, troquei os nomes para não dar conflito mas o problema persiste, teste gerar essa consulta que eu criei e verá que os dados são gerados mas estão repetidos...
Não consegui upar aqui o bd, estou enviando link para fazer download dele aqui
Link do banco: https://drive.google.com/file/d/1zg7chv9FCrOjqLR8aXRQgeL6KcVTiUNN/view?usp=sharing
Não consegui upar aqui o bd, estou enviando link para fazer download dele aqui
Link do banco: https://drive.google.com/file/d/1zg7chv9FCrOjqLR8aXRQgeL6KcVTiUNN/view?usp=sharing
Maicon- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 267
Registrado : 08/09/2012
- Mensagem nº8
Exemplo de Relatorio
Desculpe a demora , meu pc deu bug e estou só com o pc antigo com office-2007 não consegui abrir teu banco para fazer um exemplo em cima dos teus dados mas também não consegui entender muito bem a lógica dos teus dados ou seja a forma como você queria organizar , mas percebi que queres puxar tudo em uma consulta o que não é necessariamente a maneira mais simples de fazer o que pretendes. Você pode criar um relatório principal com a base do que precisa e dentro do relatório você adiciona sub-relatórios com base nos campos em comum. veja este pequeno exemplo e de uma estudada.
- Anexos
- Banco de Dados1.zip
- Você não tem permissão para fazer download dos arquivos anexados.
- (76 Kb) Baixado 18 vez(es)
Última edição por Maicon em 17/4/2018, 07:38, editado 1 vez(es)
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Olá, obrigado pelo retorno, modelei meu banco de dados, fiz os relacionamentos corretamente e criei uma instrução sql para poder fazer a consulta em mais de uma tabela, mas mesmo com tudo certo a consulta me gera dados inconsistentes, assim pude verificar que o access não suporta realizar consulta em mais de uma tabela, ou seja, vários joins, infelizmente colocar sub-relatórios em um relatório maior não resolve meu problema, pois eu necessito que os dados sejam relacionados e fazer operações matemáticas entre os dados de tabelas diferentes, por exemplo, para saber quantos km o veículo anda por litro eu preciso do dado da quantidade e do dado da quilometragem, vou ter que trabalhar com o mySQL para poder fazer o sistema, da mesma forma agradeço a ajuda e apoio, a solução vai ser abandonar o acces...
Maicon- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 267
Registrado : 08/09/2012
- Mensagem nº10
Tem com fazer praticamente tudo.
Amigo meu conhecimento em mysql é bem básico, mas te digo que com certeza pode ser feito o que você quer no access, não querendo entrar no mérito dessa ou daquela ferramenta mas existem alguns pontos que deves avaliar :
1) Relatórios e Formulários podem possuir campos não acoplados que possuam campos calculados, na prática você executa o cálculo no formulário ou relatório basta a consulta/tabela estar na origem de dados do teu formulário/relatório ou sub-formulário/sub-relatório , desde de que haja uma estrutura de relacionamento das tabelas que permitam que você relacione as tabelas e os campos. Além de poder usar o cabeçalhos e rodapés de agrupamento tanto em relatórios como em formulários para organizar os dados.
2) Em casos mais complexos podemos nos valer das tabelas temporárias e ainda das consultas acréscimo e consulta atualização em conjunto com algumas macros ou códigos vba antes de abrir um relatório por exemplo podemos criar uma tabela temporária e depois atualizá-la com os dados e depois carregar o formulário/relatório com os dados desejados.
3) Funções DLOOKUP ou DPESQUISA , uso pouco mas da mesma forma eficientes ou seja podes buscar valores em campo não acoplado de acordo com o que desejar.
Enfim o Access é uma ferramenta completa, cujo o seu maior ponto forte é capacidade de gerar relatórios de diferentes tabelas e consultas de forma simples e eficaz, Eu sempre consegui desenvolver todos os meus projetos com Access, mas sempre em cima muita pesquisa e prática e te afirmo não ferramenta mais simples, versátil e poderosa a prova disso está aqui mesmo no fórum você pode encontrar os mais complexos exemplos nosso amigo HARYSOHN por exemplo conseguiu até usar biometria em Access/VBA . Caso queira continuar o projeto ficarei feliz em ajuda-lo ou encerre o tópico como resolvido.
1) Relatórios e Formulários podem possuir campos não acoplados que possuam campos calculados, na prática você executa o cálculo no formulário ou relatório basta a consulta/tabela estar na origem de dados do teu formulário/relatório ou sub-formulário/sub-relatório , desde de que haja uma estrutura de relacionamento das tabelas que permitam que você relacione as tabelas e os campos. Além de poder usar o cabeçalhos e rodapés de agrupamento tanto em relatórios como em formulários para organizar os dados.
2) Em casos mais complexos podemos nos valer das tabelas temporárias e ainda das consultas acréscimo e consulta atualização em conjunto com algumas macros ou códigos vba antes de abrir um relatório por exemplo podemos criar uma tabela temporária e depois atualizá-la com os dados e depois carregar o formulário/relatório com os dados desejados.
3) Funções DLOOKUP ou DPESQUISA , uso pouco mas da mesma forma eficientes ou seja podes buscar valores em campo não acoplado de acordo com o que desejar.
Enfim o Access é uma ferramenta completa, cujo o seu maior ponto forte é capacidade de gerar relatórios de diferentes tabelas e consultas de forma simples e eficaz, Eu sempre consegui desenvolver todos os meus projetos com Access, mas sempre em cima muita pesquisa e prática e te afirmo não ferramenta mais simples, versátil e poderosa a prova disso está aqui mesmo no fórum você pode encontrar os mais complexos exemplos nosso amigo HARYSOHN por exemplo conseguiu até usar biometria em Access/VBA . Caso queira continuar o projeto ficarei feliz em ajuda-lo ou encerre o tópico como resolvido.
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Ainda vou dar uma investida no access, já tenho grande parte do meu projeto encaminhada, e se abandonar terei de retomar tudo novamente, eu acredito que por vba eu consiga fazer as operações matemáticas entre a tabela, mas ainda preciso amadurecer a minha programação em VBA
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Olá, venho aqui para dar retorno em relação ao meu problema, eu consegui fazer o relátório com operações básicas de vba alinhados a um formulário, funciona perfeitamente para o que eu preciso, o único problema é a longa demora na operação de soma dos registros, leva em torno de 1 minuto para eu ter todos os elementos no formulário, estou em busca de otimizar essa "consulta", caso alguém tenha alguma dica agradeço a contribuição, segue o código
- Código:
Sub Combinação2_AfterUpdate()
On Error Resume Next
Dim kmTotal As Integer
Dim cont As Integer
Dim kmpMes(12) As Integer
Dim qtdMes(12) As Integer
Dim valMMes(12) As Currency
Dim valAMes(12) As Currency
Dim valComb As Currency
Dim valTotM As Currency
Dim qtdComb As Integer
' --------------------------------------------------------------------------------
' Calcular Km percorrido
kmTotal = DSum("[Km Chegada] - [Km Saída]", "Eventos", "[Veículo/Placa] = '" & Combinação2.Column(1) & "' and [Situação Saída] = 'FINALIZADA'")
cont = 1
Do While cont <= 12
kmpMes(cont) = DSum("[Km Chegada] - [Km Saída]", "Eventos", "[Veículo/Placa] = '" & Combinação2.Column(1) & "' and [Situação Saída] = 'FINALIZADA' and Month([Data Saída]) = '" & cont & "'")
cont = cont + 1
Loop
txtKmJan = kmpMes(1)
txtKmFev = kmpMes(2)
txtKmMar = kmpMes(3)
txtKmAbr = kmpMes(4)
txtKmMai = kmpMes(5)
txtKmJun = kmpMes(6)
txtKmJul = kmpMes(7)
txtKmAgo = kmpMes(8)
txtKmSet = kmpMes(9)
txtKmOut = kmpMes(10)
txtKmNov = kmpMes(11)
txtKmDez = kmpMes(12)
txtKmperco = kmTotal
' --------------------------------------------------------------------------------
' Calculo combustivel
qtdComb = DSum("[Qtd]", "Abastecimento", "[placaAbst] = '" & Combinação2.Column(0) & "'")
valComb = DSum("[valTotal]", "Abastecimento", "[placaAbst] = '" & Combinação2.Column(0) & "'")
cont = 1
Do While cont <= 12
qtdMes(cont) = DSum("[Qtd]", "Abastecimento", "[placaAbst] = '" & Combinação2.Column(0) & "' and Month([dataAbastecimento]) = '" & cont & "'")
cont = cont + 1
Loop
txtQtdJan = qtdMes(1)
txtQtdFev = qtdMes(2)
txtQtdMar = qtdMes(3)
txtQtdAbr = qtdMes(4)
txtQtdMai = qtdMes(5)
txtQtdJun = qtdMes(6)
txtQtdJul = qtdMes(7)
txtQtdAgo = qtdMes(8)
txtQtdSet = qtdMes(9)
txtQtdOut = qtdMes(10)
txtQtdNov = qtdMes(11)
txtQtdDez = qtdMes(12)
txtComb = qtdComb
cont = 1
Do While cont <= 12
valAMes(cont) = DSum("[valTotal]", "Abastecimento", "[placaAbst] = '" & Combinação2.Column(0) & "' and Month([dataAbastecimento]) = '" & cont & "'")
cont = cont + 1
Loop
txtValAJan = valAMes(1)
txtValAFev = valAMes(2)
txtValAMar = valAMes(3)
txtValAAbr = valAMes(4)
txtValAMai = valAMes(5)
txtValAJun = valAMes(6)
txtValAJul = valAMes(7)
txtValAAgo = valAMes(8)
txtValASet = valAMes(9)
txtValAOut = valAMes(10)
txtValANov = valAMes(11)
txtValADez = valAMes(12)
txtValComb = valComb
' --------------------------------------------------------------------------------
' Calculo Manutenção
valTotM = DSum("[valorManu]", "Manutenção", "[placaManu] = '" & Combinação2.Column(0) & "'")
cont = 1
Do While cont <= 12
valMMes(cont) = DSum("[valorManu]", "Manutenção", "[placaManu] = '" & Combinação2.Column(0) & "' and Month([dataManu]) = '" & cont & "'")
cont = cont + 1
Loop
txtValManuJan = valMMes(1)
txtValManuFev = valMMes(2)
txtValManuMar = valMMes(3)
txtValManuAbr = valMMes(4)
txtValManuMai = valMMes(5)
txtValManuJun = valMMes(6)
txtValManuJul = valMMes(7)
txtValManuAgo = valMMes(8)
txtValManuSet = valMMes(9)
txtValManuOut = valMMes(10)
txtValManuNov = valMMes(11)
txtValManuDez = valMMes(12)
txtValManu = valTotM
End Sub
leo.gool- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 42
Registrado : 27/02/2018
Resolvi meu problema, quando o banco está offline a operação VBA é instantânea, mas quando está na rede é lenta, acredito que isso é por conta do servidor ser uma máquina bem fraca, para facilitar meu relatório eu criei uma consulta SQL que funcionou mais que perfeitamente, implementei os conceitos de relação entre tabelas e ai consegui gerar a consulta, segue o código SQL para quem estiver interessado
- Código:
SELECT
1 AS mes,
v.Id_Veiculo,
Nz(a.quantidade, 0) AS quantidade,
Nz(m.total_manutencao, 0) as total_manutencao,
Nz(s.rodado, 0) AS rodado,
Nz(a.gastoCombustivel, 0) AS gastoCombustivel
FROM (([Tabela Veículos] AS v
LEFT JOIN (SELECT aIDveiculo, SUM(Qtd) AS quantidade , SUM(valTotal) AS gastoCombustivel FROM Abastecimento WHERE MONTH(dataAbastecimento) = 1 AND YEAR(dataAbastecimento) = 2018 GROUP BY aIDveiculo) AS a ON v.Id_Veiculo = a.aIDveiculo)
LEFT JOIN (SELECT MIDveiculo, SUM(valorManu) AS total_manutencao FROM Manutenção WHERE MONTH(dataManu) = 1 AND YEAR(dataManu) = 2018 GROUP BY MIDveiculo) AS m ON v.Id_Veiculo = m.MIDveiculo)
LEFT JOIN (SELECT idVeiculo,"Situação Saída", SUM([Km Chegada]) - SUM([Km Saída]) AS rodado FROM Eventos WHERE MONTH([Data Saída]) = 1 AND YEAR([Data Saída]) = 2018 AND [Situação Saída] = "FINALIZADA" GROUP BY idVeiculo) AS s ON v.Id_Veiculo = s.idVeiculo
WHERE v.Id_Veiculo = [Forms]![Gerar RGA]![nVeiculo]
GROUP BY v.Id_Veiculo, a.quantidade, m.total_manutencao, s.rodado,a.gastoCombustivel;
UNION SELECT
2 AS mes,
v.Id_Veiculo,
Nz(a.quantidade, 0) AS quantidade,
Nz(m.total_manutencao, 0) as total_manutencao,
Nz(s.rodado, 0) AS rodado,
Nz(a.gastoCombustivel, 0) AS gastoCombustivel
FROM (([Tabela Veículos] AS v
LEFT JOIN (SELECT aIDveiculo, SUM(Qtd) AS quantidade , SUM(valTotal) AS gastoCombustivel FROM Abastecimento WHERE MONTH(dataAbastecimento) = 2 AND YEAR(dataAbastecimento) = 2018 GROUP BY aIDveiculo) AS a ON v.Id_Veiculo = a.aIDveiculo)
LEFT JOIN (SELECT MIDveiculo, SUM(valorManu) AS total_manutencao FROM Manutenção WHERE MONTH(dataManu) = 2 AND YEAR(dataManu) = 2018 GROUP BY MIDveiculo) AS m ON v.Id_Veiculo = m.MIDveiculo)
LEFT JOIN (SELECT idVeiculo,"Situação Saída", SUM([Km Chegada]) - SUM([Km Saída]) AS rodado FROM Eventos WHERE MONTH([Data Saída]) = 2 AND YEAR([Data Saída]) = 2018 AND [Situação Saída] = "FINALIZADA" GROUP BY idVeiculo) AS s ON v.Id_Veiculo = s.idVeiculo
WHERE v.Id_Veiculo = [Forms]![Gerar RGA]![nVeiculo]
GROUP BY v.Id_Veiculo, a.quantidade, m.total_manutencao, s.rodado,a.gastoCombustivel;
» [Resolvido]Relatório com dois ou mais sub-relatórios com o mesmo parâmetro de consulta
» [Resolvido]como vincular um campo do relatório a mais de um campo da consulta
» Consulta para mostrar no relatório pessoas com mais de 60 anos
» [Resolvido]Como parametrizar strLocal dentro de um formulario comum
» [Resolvido]Erro ao Executar Relatório Mais de Uma Vez
» [Resolvido]como vincular um campo do relatório a mais de um campo da consulta
» Consulta para mostrar no relatório pessoas com mais de 60 anos
» [Resolvido]Como parametrizar strLocal dentro de um formulario comum
» [Resolvido]Erro ao Executar Relatório Mais de Uma Vez