... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Veja as novidades da versão 4 do aplicativo Maestro

O sistema de vinculação de tabelas foi totalmente remodelado.

- Agora, todos os vínculos são excluídos e refeitos, na medida em que houver alterações de caminho e/ou de senha da Base de Dados (back-end).

- Após você excluir, alterar ou criar novas tabelas na Base de Dados ( Maestro_v4_be.accdb ), rode o Maestro, abra o grupo Manutenção da ribbon e clique em Refazer Vínculos.

Usando Access - Ribbon Refazer Vínculos

- Quando houver alteração de senha da Base de Dados ( maestro_v4_be.accdb ), o Maestro irá carregar uma tela na inicialização, solicitando a nova senha para refazer os vínculos.

Usando Access - Senha back-end

 

Nova função para formulários que possuem vários campos de filtragens combinados.

- Veja esta nova e poderosa função em ação, nos formulários exemplos frmFiltraFormContinuo e frmFiltraListBox:

Usando Access - Campos de filtragens combinados

 

Atente para os comentários na função fncFiltrar.

Public Sub fncFiltrar(NomeCampoFoco As String)
Dim x As String, filtro As String, strSplit As String
Dim f(4) As String, cp(4) As Variant
Dim k As Variant, p As Byte
Dim booPos As Boolean

'------------------------------------------------------------------
' Variável x recebe o valor digitado na caixa de texto de filtragem 
'-------------------------------------------------------------------
x = Me(NomeCampoFoco).Text: p = 0

'--------------------------------------------------------------------------------------
'Passam para a matriz Cp() todos os valores digitados nas caixas de texto de filtragem
'--------------------------------------------------------------------------------------
For p = 0 To 3
   cp(p) = IIf(InStr(NomeCampoFoco, "tx" & p + 1) > 0, x, Me("tx" & p + 1))
Next

'--------------------------------------------------------------------------------
' Passa para a matriz f() a sintaxe de filtragens, com os respectivos valores 
' digitados nas caixas de texto
'--------------------------------------------------------------------------------
f(0) = "DataDopedido Like '*" & cp(0) & "*'"
f(1) = IIf(cp(1) = Chr(32), "cidadeDeDestino is null", "CidadeDeDestino Like '*" & cp(1) & "*'")
f(2) = IIf(cp(2) = Chr(32), "RegiãoDeDestino is null", "RegiãoDeDestino Like '*" & cp(2) & "*'")
f(3) = "PaísDeDestino Like '*" & cp(3) & "*'"

'------------------------------------------------------------------------------------------
'Passa para a Variável strSplit, o comprimento do texto referente a cada caixa de filtragem
'Comprimento zero(0) significa que a caixa de texto de filtragem se encontra vazia
'Exemplo de resultado: strSplit = 2|0|1|0
'Significa que os campos 2 e 4 não receberam valores para serem filtrados
'------------------------------------------------------------------------------------------
strSplit = Len(cp(0) & "") & "|" & Len(cp(1) & "") & "|" & Len(cp(2) & "") & "|" & Len(cp(3) & "")
k = Split(strSplit, "|")

'-----------------------------------------------------------------------------------------
'Filtro assumirá todos os valores de registros, caso todos os campos de filtragens 
'estejam limpos
'-----------------------------------------------------------------------------------------
filtro = "NúmeroDoPedido > 0": p = 0

'-----------------------------------------------------------------------------------------
'Monta a variável filtro com todos os campos de filtragens que possuírem valores digitados
'-----------------------------------------------------------------------------------------
For p = 0 To UBound(k)
   If Val(k(p)) > 0 Then
      If booPos = False Then
         filtro = f(p): booPos = True
      Else
         filtro = filtro & " AND " & f(p)
      End If
   End If
Next p

'--------------------------------------------
'Carrega o listbox com os registros filtrados
'--------------------------------------------
Call fncCarregalista(filtro)
End Sub

Foi acrescentado um exemplo de Formulário Desvinculado.

- Formulário desvinculado significa que a sua propriedade Fonte de Registro não está associada a qualquer tabela ou consulta existentes.   Neste exemplo foi utilizada a tabela tblClientes, acessada via código, para alimentar os campos do formulário.

Usando Access - Formulário Desvinculado

 

- O acesso à Base de Dados (back-end) é feito através do comando OpenDatabase que se encontra no módulo mod_conexao.   Isso proporciona acesso às tabelas, sem o uso de vínculos.

Public Function fncAbreConexao(Optional chave As Long = 0)
On Error GoTo trataerro
If chave <> 102030 Then Exit Function
Set bd = OpenDatabase(DLookup("path_0", "tblCaminhoBe"), False, False, _
 ";PWD=" & fncCrip(DLookup("senha", "tblCaminhoBe"), 102030))
sair:
Exit Function
trataerro:
Select Case Err.Number
Case 94
MsgBox "Informe o caminho do back-end na tabela tblCaminhoBe...", vbInformation, "Aviso"
Case Else
MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "Aviso", _ 
 Err.HelpFile, Err.HelpContext
End Select
Resume sair:
End Function

- Veja abaixo, a função para limpar os campos:

Private Sub fncLimpaCampos()
Dim ctl As control
'------------------------------------------------
'Irá percorrer todos os controles do formulário
'------------------------------------------------
For Each ctl In Controls
   '------------------------------------------
   'Irá limpar apenas o que for caixa de texto
   '------------------------------------------
   If ctl.ControlType = acTextBox Then ctl = ""
Next
End Sub

- Veja abaixo, a função para alterar a cor dos caracteres.  Usei a cor para o usuário identificar que o registro corrente sofreu alterações e que precisa ser salvo.   A cor também foi utilizada para as várias tomadas de decisões nos códigos.

Private Sub fncPinta(cor As Long)
Dim ctl As control
'------------------------------------------------
'Irá percorrer todos os controles do formulário
'------------------------------------------------
For Each ctl In Controls
   '--------------------------------------------------------
   'Altera, somente, a cor dos caracteres das caixas de texto
   '--------------------------------------------------------
   If ctl.ControlType = acTextBox Then ctl.ForeColor = cor
Next
End Sub

Obs. Eu só trabalho com formulários desvinculados quando percebo que terei ganhos significativos em relação ao desempenho do aplicativo em REDE.  Você pode observar neste formulário exemplo, a quantidade de códigos necessários para se trabalhar com o projeto desvinculado. Certamente, isso provoca perda de produtividade, o que deve ser levado em consideração na formação de preço e prazo.  Prefiro trabalhar com os vínculos e com as tabelas temporárias, geradas em tempo de execução.

Clique aqui e veja as 9 dicas para melhorar o desempenho de um aplicativo Access, em rede.

- Observe que empreguei a técnica para criação de tabela, em tempo de execução, com o objetivo de carregar o combobox de filtragem.  Veja o evento "Ao receber foco" do Combobox.

Private Sub cboConsulta_GotFocus()
Dim strsql As String
On Error Resume Next
Dim tblTemp As String
Static j As Byte
'-------------------------------------------------------------------------------
'Salva o registro atual, caso tenha havido alguma alteração no registro carregado
'-------------------------------------------------------------------------------
If Me!idCliente.ForeColor = 255 Then btSalvar_Click

'---------------------------------------------------------------------------------------
' Se não houver alteração no registro corrente, não atualiza a tabela temporária
' Isso evita realizar viagens desnecessárias à Base de Dados (back-end).
' Acima de 5 consultas, atualiza a tabela temporária para o caso de uso em rede
'----------------------------------------------------------------------------------------
If booAtualizaCombo = False And j < 5 Then
   j = j + 1
   Exit Sub
End If

j = 0
'----------------------------------------
'Desacopla combobox da tabela temporária
'----------------------------------------
Me!cboConsulta.RowSource = ""
'-------------------------------
'Dá um nome à tabela temporária
'-------------------------------
tblTemp = "tmp_" & Me!cboConsulta.Name
'------------------------------------------------------
'Consulta do Combobox, acrescentando a cláusula INTO
'para gravar a tabela temporária no front-end
'-------------------------------------------------------
strsql = "Select cli_nome INTO " & tblTemp & " FROM tblClientes ORDER BY cli_nome;"
'----------------------------
'Abre conexão com o back-end
'----------------------------
Call fncAbreConexao(102030)
'---------------------------------------------------
'Cria a tabela temporária para carregar o Combobox
'---------------------------------------------------
If fncCriarTabela(strsql, tblTemp, 102030) Then
   '------------------------------------------------------
   'Carrega o Combobox com os valores da tabela temporária
   '------------------------------------------------------
   Me!cboConsulta.RowSource = tblTemp
End If
booAtualizaCombo = False
End Sub

- Em sistemas desvinculados, você perde as funções de Domínio (Dlookup, Dcount, Dsum,...).  No entanto foi acrescentado o módulo mod_Funcoes_D para você continuar usufruindo destas funções, em sistemas desvinculados.   Para isso, basta acrescentar o X no final das funções conhecidas. Tem um exemplo do DcountX() sendo utilizado neste formulário.

Foi acrescentado o formulário de filtragem frmFiltraListBox_desvinculado.

Aqui, demonstro a aplicação da técnica de geração de tabela temporária, em tempo de execução, para alimentar um ListBox de pesquisa.  O objetivo principal desta técnica é o de realizar as buscas sobre a tabela local e não sobre a tabela de origem.  Isso contribui valiosamente para um melhor desempenho em REDE.

Usando Access - Tabela temporária

 

Segue o código que carrega o listBox com a tabela temporária.  Observe bem, os comentários.

Private Sub fncCarregalista(Optional filtro As String, Optional ordem As String)
Dim strsql As String
Dim tblTemp As String
'-------------------------------
' Dá um nome à tabela temporária
'--------------------------------
tblTemp = "tmp_" & Me.Name
'------------------------------------------------------------------------
' com t = verdadeiro dispara a função para criar a tabela temporária
' A lista só é atualizada com os dados do back-end depois de 2 minutos ou 
' quando clicar no botão "remover Filtro"
'------------------------------------------------------------------------
If t Then
   '--------------------------------------------
   'Abre conexão com a Base de Dados (back-end)
   '--------------------------------------------
   Call fncAbreConexao(102030)
   '------------------------------------------
   'Desconecta ListBox da tabela temporária
   '------------------------------------------
   Me!Lista.RowSource = ""
   '-----------------------------------------------------------
   'Monta a consulta de ação que irá criar a tabela temporária
   '-----------------------------------------------------------
   strsql = "SELECT NúmeroDoPedido, CódigoDoCliente, DataDoPedido, CidadeDeDestino"
   strsql = strsql & " INTO " & tblTemp & " FROM tblPedidos ORDER BY DataDopedido;"
   '-----------------------------------------------
   ' Dispara a função que gera a tabela temporária
   '-----------------------------------------------
   If fncCriarTabela(strsql, tblTemp, 102030) Then
      ' -------------------------------------------------------------------------
      ' Ativa o timer do formulário para quando passar de 2 minutos, o Listbox 
      ' ser informado de que deverá atualizar a tabela temporária, caso haja
      ' nova consulta
      '--------------------------------------------------------------------------
      t = False
      Me.TimerInterval = 120000 '2 minutos
   End If
   '--------------------------------------------
   'Fecha conexão com a Base de Dados (back-end)
   '--------------------------------------------
   Call fncFechaConexao
End If

'--------------------------------------------------------------
'Passa o filtro para variável global filtroLista do formulário.
'Variável utilizada no botão Imprimir
'--------------------------------------------------------------
filtroLista = filtro

'--------------------------------------------------------------------------------
'Monta a consulta seleção filtrada e com a sua origem na tabela temporária local
'O acesso a tabela local, no procedimento de filtragem, contribui para redução 
'substancial de acessos à Base de Dados (back-end)
'Este procedimento é fundamental para o bom desempenho do aplicativo em REDE
'--------------------------------------------------------------------------------
strsql = "SELECT NúmeroDoPedido, CódigoDoCliente, DataDoPedido, CidadeDeDestino"
strsql = strsql & " FROM " & tblTemp & " WHERE " & filtro
strsql = strsql & " ORDER BY DataDopedido;"
Me!Lista.RowSource = strsql
End Sub

Veja, abaixo, a função fncCriarTabela que gera as tabelas temporárias e que se encontra no módulo mod_conexao.

Public Function fncCriarTabela(strsql As String, nomeTbl As String, _ 
Optional chave As Long = 0) As Boolean

On Error Resume Next
Dim tbd As DAO.TableDef, booPresente As Boolean
If chave <> 102030 Then Exit Function
'-------------
'Deleta tabela
'--------------
DoCmd.DeleteObject acTable, nomeTbl
If Err Then Err.Clear: On Error GoTo trataerro
'--------------------------------------------
'Dispara a consulta ação para criar a tabela
'--------------------------------------------
Application.CurrentDb.Execute strsql
'-------------------------------------------------
'Use o valor 1 para esconder a tabela, se desejar.
'--------------------------------------------------
CurrentDb.TableDefs(nomeTbl).Attributes = 0
DoCmd.RunCommand acCmdSave
fncCriarTabela = True
sair:
Exit Function
trataerro:
   fncCriarTabela = False
   MsgBox Err.Description & " | Erro: " & Err.Number
   Resume sair
End Function

O Maestro v.4

Para entrar no modo estrutura, segure a tecla shift ao carregá-lo.

Senha do usuário admin  > admin
Senha do usuário Avelino > 1234

Bom estudo!


 

 


13 comentário(s)

Samuel Lima Neto   05/11/2012 10:13:20

Grande Avelino!

Mais uma vez somos premiados logo cedo com essas dicas preciosas. Parabéns!

Edson C Almeida   05/11/2012 11:50:11

Oi Avelino. Parabéns mais uma vez pelo brilhante trabalho. Aproveito a oportunidade de te relembrar das video aulas de vba. Abraço.

Isaias Carvalho   05/11/2012 12:09:40

Avelino,

Parabéns pelo excelente artigo!!!

São realmente dicas muito valiosas para melhorar significativamente o desempenho em rede.
Valiosa dica como criar tabelas temporárias, geradas em tempo de execução... Perfeito!! (sei o que é ter problemas com aplicativo lento em uso na rede).
Já estava a estudar as valiosas dicas que tem nos passado na vidoe-alua PROTEC, no quesito desempenho em rede, agora posso aprofundar ainda mais os estudos com base no Maestro_v4.

Tudo o que estava precisando.

Parabéns!!

MARCIO MELO - RJ   05/11/2012 12:17:26

Fiquei super feliz com mais essas novidades, com o seu Monta Ribbos e o maestro tenho usado sempre como pontapé inicial, o lance da senha eu tinha adaptado no meu, vou analisar as diferenças sempre aprendo muito com suas táticas, tenho um form interessante p lhe enviar sobre filtros de relatórios e outro de criar um form continuo com filtros acredito que possa melhorar cada vez mais o maestro de maneira interagir com os códigos já existentes. Parabéns e estou sempre aqui torcendo por seu sucesso, obrigado!

Sou mais Brasil!

Avelino Joao   05/11/2012 12:58:04

Gostei do método que usa para se conectar banco de dado desvinculado ao gravar os dados praticamente não se nota abertura do banco de dado.



Gilson Fontanella   05/11/2012 13:46:11

Não consigo entrar na estrutura do banco de dados com as senhas indicadas

Avelino Sampaio   05/11/2012 13:52:02

Gilson,

para entrar na estrutura do Maestro (maestro_v4.accdb) basta manter pressionada a techa SHIFT na inicialização.

Já para entra na Base de Dados (Maestro_v4_be.accdb) a senha é: a1234

Sucesso!

Edson Junho   05/11/2012 15:07:05

Fantástico!!!

Rodrigo   05/11/2012 22:15:30

Parabéns, mais uma vez surpreendendo...
Poderia colocar um exemplo da utilização da troca de ribbons na hora da impressão para access 2010? Utilizo em access 2007 e tudo vai bem, mas quando utilizo o 2010 a ribbon não aparece... acredito eu ser alguma imagem que o 2007 tenha e que o 2010 não suporte. Ainda não consegui fazer esta operação...

Parabéns por colaborar conosco seus conhecimentos.
Fique na Paz.

Gilson   06/11/2012 01:53:02

Excelente!!!

João Ricardo   06/11/2012 10:51:37

Valeu Avelino.
Como disse o Edson, estou ansioso pelas aulas de VBA.
Será que se promovermos uma campanha para estas aulas elas saem do papel?
Brincadeira Avelino. Sabemos do seu compromisso com o repasse de conhecimento e o qto vc se esforça para nos ajudar.
Parabéns!!

Regis da Silva   18/02/2014 10:04:36

Avelino eu importei os devidos objetos do Maestro para usar no meu projeto, no caso os objetos para vinculação de tabela, inclusive o AutoExec, mas não está funcionando, será que falta eu ativar mais alguma coisa?

Alberto   14/04/2016 23:12:45

Avelino, parabéns pelos ensinamentos.
Usei a função Public Function fncFiltrar(NomeCampoFoco As String) em um formulário continuo que possui como fonte de registro uma consulta com várias tabelas, impossibilitando entradas de dados. Está filtrando ok, mas se não retornar registro no filtro dá erro na função e trava. Ou seja, só consegui usar a função em formulário com entradas de dados.


Envie seu comentário: