MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Criar tabela temporária com vba

    Compartilhe

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Ter 17 Jun 2014, 04:48

    Não sei se esta é a sala correta para postar este duvida:
    Tenho duas consultas abaixo relacionadas:
    esta é a primeira:
    ==========================================================================================================
    SELECT Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]) AS Mês, Year([Dtlcto]) AS Ano, Sum(Lancamentos.ValorMObjet) AS ExecutadoMensal, 0 AS OrcadoMensal, Format(DSum("[saldo]","qry_ExecutadoMensal","[Mês] <= " & [Mês] & "And [Ano] = " & [Ano] & "And [Centrocst] = " & [Centrocst] & "And [CodConta] = " & [CodConta]),"Currency") AS ExecutadoAcum, 0 AS OrcadoAcum
    FROM Lancamentos
    GROUP BY Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]), Year([Dtlcto])
    HAVING (((Year([Dtlcto]))=Year(Date())));

    Esta é a segunda:
    ============================================================================================================
    SELECT PlanejamentoAnual.CodConta, PlanejamentoAnual.Centrocst, PlanejamentoAnual.MesRef AS Mês, PlanejamentoAnual.AnoRef AS Ano, 0 AS ExecutadoMensal, Sum(PlanejamentoAnual.CustosPlan) AS OrcadoMensal, 0 AS ExecutadoAcum, Format(DSum("[Saldo]","qry_OrcadoMensal","[MesRef] <= " & [MesRef] & "And [AnoRef] = " & [AnoRef] & "And [Centrocst] = " & [Centrocst] & "And [CodConta] = " & [CodConta]),"Currency") AS OrcadoAcum
    FROM PlanejamentoAnual
    GROUP BY PlanejamentoAnual.CodConta, PlanejamentoAnual.Centrocst, PlanejamentoAnual.MesRef, PlanejamentoAnual.AnoRef
    HAVING (((PlanejamentoAnual.AnoRef)=Year(Date())));
    =============================================================================================================

    Esta terceira é uma consulta union das duas primeira:
    ==============================================================================================================
    SELECT Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]) AS Mês, Year([Dtlcto]) AS Ano, Sum(Lancamentos.ValorMObjet) AS ExecutadoMensal, 0 AS OrcadoMensal, Format(DSum("[saldo]","qry_ExecutadoMensal","[Mês] <= " & [Mês] & "And [Ano] = " & [Ano] & "And [Centrocst] = " & [Centrocst] & "And [CodConta] = " & [CodConta]),"Currency") AS ExecutadoAcum, 0 AS OrcadoAcum
    FROM Lancamentos
    GROUP BY Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]), Year([Dtlcto])
    HAVING (((Year([Dtlcto]))=Year(Date()))) UNION SELECT PlanejamentoAnual.CodConta, PlanejamentoAnual.Centrocst, PlanejamentoAnual.MesRef AS Mês, PlanejamentoAnual.AnoRef AS Ano, 0 AS ExecutadoMensal, Sum(PlanejamentoAnual.CustosPlan) AS OrcadoMensal, 0 AS ExecutadoAcum, Format(DSum("[Saldo]","qry_OrcadoMensal","[MesRef] <= " & [MesRef] & "And [AnoRef] = " & [AnoRef] & "And [Centrocst] = " & [Centrocst] & "And [CodConta] = " & [CodConta]),"Currency") AS OrcadoAcum
    FROM PlanejamentoAnual
    GROUP BY PlanejamentoAnual.CodConta, PlanejamentoAnual.Centrocst, PlanejamentoAnual.MesRef, PlanejamentoAnual.AnoRef
    HAVING (((PlanejamentoAnual.AnoRef)=Year(Date())));
    ==============================================================================================================

    e esta é o agrupamento da terceira, que é a base de um relatorio gerencial:
    ==============================================================================================================
    SELECT qry_ExecutadoOrcadoAcumMes.CodConta, qry_ExecutadoOrcadoAcumMes.Centrocst, qry_ExecutadoOrcadoAcumMes.Mês, qry_ExecutadoOrcadoAcumMes.Ano, Sum(qry_ExecutadoOrcadoAcumMes.Executado) AS ExecutadoMensal, Sum(qry_ExecutadoOrcadoAcumMes.OrcadoMensal) AS OrcadoMensal, Sum(Format([ExecutadoAcum],"Currency")) AS ExecutadoAcumulado, Sum(qry_ExecutadoOrcadoAcumMes.OrcadoAcum) AS OrcadoAcumulado, Contas.Conta, [ExecutadoMensal]-[OrcadoMensal] AS Desvio, IIf([OrcadoMensal]=0,0,[Desvio]/[OrcadoMensal]) AS Desvio2, Classes.CodClasse, Grupos.CodGrupo, Contas.CodCusto
    FROM (((qry_ExecutadoOrcadoAcumMes INNER JOIN Contas ON qry_ExecutadoOrcadoAcumMes.CodConta = Contas.CodConta) INNER JOIN Classes ON Contas.CodClasse = Classes.CodClasse) INNER JOIN Grupos ON Classes.CodGrupo = Grupos.CodGrupo) INNER JOIN CentroDeCusto ON qry_ExecutadoOrcadoAcumMes.Centrocst = CentroDeCusto.Centrocst
    GROUP BY qry_ExecutadoOrcadoAcumMes.CodConta, qry_ExecutadoOrcadoAcumMes.Centrocst, qry_ExecutadoOrcadoAcumMes.Mês, qry_ExecutadoOrcadoAcumMes.Ano, Contas.Conta, Classes.CodClasse, Grupos.CodGrupo, Contas.CodCusto;
    ==============================================================================================================

    Pelo painel de navegação está pesando o banco de dados. Como faço para executar estas pelo menos as duas primeiras consultas criando tabelas temporarias e apartir dai criar as consultas 3 e 4 ? já vi que fica mais rápido fazer pelo vba, mas não tenho os comandos necessários para fazê-los.
    Alguem tem alguma ideia? qualquer coisa serve, seja criando tabelas temporárias, seja função ou outra coisa que seja mais rápido.

    Grato pela ajuda.

    Avelino Sampaio
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3350
    Registrado : 04/04/2010

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  Avelino Sampaio em Qua 18 Jun 2014, 08:36

    Olá!

    Exemplo:

    SELECT Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]) AS Mês, Year([Dtlcto]) AS Ano, Sum(Lancamentos.ValorMObjet) AS ExecutadoMensal, 0 AS OrcadoMensal, Format(DSum("[saldo]","qry_ExecutadoMensal","[Mês] <= " & [Mês] & "And [Ano] = " & [Ano] & "And [Centrocst] = " & [Centrocst] & "And [CodConta] = " & [CodConta]),"Currency") AS ExecutadoAcum, 0 AS OrcadoAcum
    INTO tblNovaTabela FROM Lancamentos
    GROUP BY Lancamentos.CodConta, Lancamentos.Centrocst, Month([Dtlcto]), Year([Dtlcto])
    HAVING (((Year([Dtlcto]))=Year(Date())));

    Sucesso!


    .................................................................................
    ============ Quer aprender Access em alta velocidade ? ============

    || [Você precisa estar registrado e conectado para ver esta imagem.] Acesse o site UsandoAccess.com.br e veja um ótimo kit de ensino que tenho para você.

    ===========================================================

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Qua 18 Jun 2014, 16:17

    com este comando eu crio uma nova tabela no vba ou no painel de navegação?

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3216
    Registrado : 15/03/2013

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  ahteixeira em Qua 18 Jun 2014, 16:28

    Olá a todos,

    Em cima , no exemplo é a instrução em SQL.

    Podes utilizar em VBA com a instrução DoCmd.RunSql "instrução em sql"

    Aproveita dá uma vista de olhos no exemplo do link abaixo:

    [Você precisa estar registrado e conectado para ver este link.]

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Qui 19 Jun 2014, 04:21

    aonde tem aspas duplas dentro da instrução sql dá erro e o codigo pára.
    Ex:
    ("[saldo]","qry_ExecutadoMensal",

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3216
    Registrado : 15/03/2013

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  ahteixeira em Qui 19 Jun 2014, 16:54

    Olá,

    Fui buscar acima a tua instrução, exprimenta assim no VBA:

    Código:

    DoCmd.RunSQL "SELECT qry_ExecutadoOrcadoAcumMes.CodConta, qry_ExecutadoOrcadoAcumMes.Centrocst, qry_ExecutadoOrcadoAcumMes.Mês, " _
               & "qry_ExecutadoOrcadoAcumMes.Ano, Sum(qry_ExecutadoOrcadoAcumMes.Executado) AS ExecutadoMensal, " _
               & "Sum(qry_ExecutadoOrcadoAcumMes.OrcadoMensal) AS OrcadoMensal, Sum(Format([ExecutadoAcum],'Currency')) AS ExecutadoAcumulado, " _
               & "Sum(qry_ExecutadoOrcadoAcumMes.OrcadoAcum) AS OrcadoAcumulado, Contas.Conta, [ExecutadoMensal]-[OrcadoMensal] AS Desvio, " _
               & "IIf([OrcadoMensal]=0,0,[Desvio]/[OrcadoMensal]) AS Desvio2, Classes.CodClasse, Grupos.CodGrupo, Contas.CodCusto " _
               & "FROM (((qry_ExecutadoOrcadoAcumMes INNER JOIN Contas ON qry_ExecutadoOrcadoAcumMes.CodConta = Contas.CodConta) " _
               & "INNER JOIN Classes ON Contas.CodClasse = Classes.CodClasse) INNER JOIN Grupos ON Classes.CodGrupo = Grupos.CodGrupo) " _
               & "INNER JOIN CentroDeCusto ON qry_ExecutadoOrcadoAcumMes.Centrocst = CentroDeCusto.Centrocst " _
               & "GROUP BY qry_ExecutadoOrcadoAcumMes.CodConta, qry_ExecutadoOrcadoAcumMes.Centrocst, qry_ExecutadoOrcadoAcumMes.Mês, " _
               & "qry_ExecutadoOrcadoAcumMes.Ano, Contas.Conta, Classes.CodClasse, Grupos.CodGrupo, Contas.CodCusto;"

    Se não der o melhor será disponibilizares uma base de exemplo  com a consulta, quanto ao volume da dados, apaga nas tabelas, ficando apenas dois ou tres registos.

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Seg 23 Jun 2014, 08:25

    Na consulta "qry_UnionExecutadoOrcadoAcumMes" existe uma função agregada "Dsum" que busca o valor da conta até o mês de abertura do relatório "rpt_Executado_X_Orcado" com base no parâmetros do formulário "Frm_Parametros". Creio que é esta função que está pesando a abertura dos dados. Há alguma forma de se criar tabelas no vba e apartir destas tabelas criadas criar outras tabelas para chegar a mesma estrutura da consulta "qry_ExecutadoOrcadoMesAno" para servir de base para qualquer relatório?
    Segue em anexo o bd.
    Anexos
    Orcamento_DRU-Modificado.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (263 Kb) Baixado 43 vez(es)

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3216
    Registrado : 15/03/2013

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  ahteixeira em Seg 23 Jun 2014, 14:24

    Olá,

    Normalmente as consultas tem um desempenho melhor, nao me parece que vá alterar o rendimento, pois vai ter um acesso de leitura e escrita numa nova tabela.

    Um das coisas que reparei é que estás a calcular o Mes e Ano na consulta, talvez (é de exprimentar) seria ter logo na tabela de movimentos o campo ANO e MES de preferencia campo numerico indexado, que seria automáticamente preenchido logo quando são efetuados os movimentos. Assim é menos um calculo nas consultas ao agregar.

    Vou analisar um pouco melhor e dar novo feedback


    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Ter 24 Jun 2014, 11:04

    O relatório baseado na consulta está levando de 4 a 5 segundos para abrir. se eu conseguir extrair os dados da consulta e inseri-los em uma tabela, o relatório abre mais rápido. O meu pensamento é executar as consultas "Qry_ExecutadoMensal" e "qry_OrcadoMensal" pelo vba, extrair os dados e inserir ao dados em tabelas. A partir destas novas tabelas efetuar as novas consultas para servir de base para o relatório . Já percebi que a abertura fica mais eficiente. seria o caso de uma "tabledefs" criada pelo vba?

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Ter 24 Jun 2014, 12:18

    Achei um um código neste site:
    [Você precisa estar registrado e conectado para ver este link.]
    Aqui cria a tabela, basta agora eu adaptar ao meu projeto. preciso agora é selecionar os dados via vba e inseri-los neste tabela.

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3216
    Registrado : 15/03/2013

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  ahteixeira em Qua 25 Jun 2014, 11:21

    Sim, o exemplo cria uma tabela noutra base de dados que poderá ser tabela temporaria.

    Tembém tenho utilizado, a técnica que tenho utilizado é:
    -criar a BD temporaria, com as tabelas desejadas
    -verificar se já existe alguma ligação (vinculado) da tabela(s) temporaria(s) e eliminar
    -Ligar (vincular) à base de dados temporaria a tabela(s)

    Depois trabalho normalmente com a(s) tabela(s) vinculadas, como se fosse na propria base de dados do projeto.

    Abraço

    rubenscouto
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 554
    Registrado : 02/10/2011

    Re: [Resolvido]Criar tabela temporária com vba

    Mensagem  rubenscouto em Ter 15 Jul 2014, 02:19

    vou dar o topico como resolvido.

      Data/hora atual: Sex 09 Dez 2016, 07:42