... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$145,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.


Gerar 1 milhão de registros para realização de testes em rede

Vamos imaginar o seguinte cenário : dez máquinas em rede, utilizando o seu Banco de Dados que foi  desenvolvido no Access.  Um começo maravilhoso, com acessos rápidos em todas as máquinas!  Passados alguns poucos anos ou até mesmo alguns meses, os usuários começam a reclamar de uma certa lentidão. Mais alguns meses adiante e as reclamações se intensificam.   E lá vai você tentar remendar ou até mesmo programar todo aquele formulário do zero, pois para o usuário consultar apenas um item,  demora em média, 40 eternos segundos.  

A situação descrita acima é muito comum de ocorrer, se você ainda não tiver uma boa experiência com a programação VBA. 

Minha proposta aqui é lhe oferecer uma ferramenta auxiliar, capaz de gerar uma grande quantidade de registros, em uma tabela para testes.  Com esta tabela, você pode realizar ensaios bem realistas em uma rede, e assim definir a programação mais adequada para cada caso. 

Leve muito a sério este tipo de teste, evitando que o seu Banco de Dados entre em um rápido declínio quanto ao desempenho.

 Veja na imagem abaixo, o gerador de registros:

Usando Access - Gerador de registros

 

Prever e testar. 

Agora, vamos imaginar que você precise montar um formulário gerador de Propostas Orçamentárias.  Sabendo da necessidade em prever o cenário para daqui a 10 anos, você pergunta ao seu cliente quantas propostas, em média, são geradas por dia.  Faz de conta que sejam 100 propostas diárias; logo, a média mensal é de 2000 registros, sendo armazenados na tabela de propostas.  Em um ano, 24 mil registros e no fim de 10 anos,  um valor estimado de 240 mil registros. 

Neste caso, pegue o gerador de registros e crie os 240 mil registros previstos na tabela de testes e inicie os teste de comportamento pela rede, para determinar a melhor forma de programar, considerando que o uso de consultas aos dados armazenados será intenso.

Ainda neste cenário, caberia você perguntar se as propostas inferiores a 5 anos poderão ser excluídas automaticamente.  Se a resposta for sim, você terá um limite de 120 mil registros para a tabela de propostas, o que contribuiria para amenizar os efeitos de se consultar uma tabela tão grande.

Veja o código utilizado, para se gerar os registros aleatórios.

Private Sub btCriarRegistros_Click()
Dim Nomecliente
Dim SobreNome
Dim Rnv
Dim Ope
Dim j As Long
Dim k As Long
Dim strSql As String
Dim rs As DAO.Recordset
Dim Escala As Single

If Len(Me!txTotal & "") = 0 Or Me!txTotal > 5000000 Or Me!txTotal <= 0 Then
   MsgBox "Valor fora da escala (1 a 5 milhões)...", vbInformation, "Aviso"
   Exit Sub
End If
'-----------------------
'Abre tabela tblTeste
'-----------------------
Set rs = CurrentDb.OpenRecordset("tblTeste")
'---------------------------
'Habilita botão Abortar
'---------------------------
Me!btAbortar.Enabled = True
'-------------------------------------------
'66 nomes armazenados na matriz NomeCliente
'--------------------------------------------
Nomecliente = "Avelino,Pedro,Luiz,Elizabete,Thais,kelly,Gilberto,Claudio,..."
Nomecliente = Split(Nomecliente, ",")
'-----------------------------------------------
'34 sobre nomes armazenados na matriz SobreNome
'-----------------------------------------------
SobreNome = "Sampaio,Henrique,Barbosa,Carvalho,Santana,Abreu,Santos,.."
SobreNome = Split(SobreNome, ",")
'----------------------------------------
'False e True armazenados na matriz Rnv
'----------------------------------------
Rnv = Split("0,-1", ",")
'------------------------------------------------
'6 nomes de operadoras armazenados na matriz Ope 
'------------------------------------------------
Ope = Split("Vivo,Claro,Tim,OI,Nextel,GVT", ",")
'---------------------------------------
'Definindo escala da barra de progresso
'---------------------------------------
Me!Caixa.Width = 0.01
Escala = (567 * 3) / Me!txTotal
'-------------------------------------------------------------------
' Adicionando os registros, com dados aleatórios, na tabela tblTeste
'--------------------------------------------------------------------
For j = 0 To (Nz(Me!txTotal, 0)) - 1
   rs.AddNew
      rs!Nomecliente = Nomecliente(Int(Rnd() * 66)) & " " & SobreNome(Int(Rnd() * 34))
      rs!dataNascimento = CDate(Int(Rnd() * 29949) + 10959)
      rs!Operadora = Ope(Int(Rnd() * 6))
      rs!ValorCobrado = Round(Int(Rnd() * 450) * 1.3457, 2)
      rs!Nota = Int(Rnd() * 11)
      rs!Renovar = rnv(Int(Rnd() * 2))
   rs.Update
   Randomize
   k = k + 1
   DoEvents
   If booAbortar Then: Exit For
   If Sel = 0 Then: Me!Caixa.Width = Escala * k
Next
booAbortar = False
MsgBox "Foram criados " & k & " registros...", vbInformation, "Aviso"
Me!Caixa.Width = 0.01
Me!TxInforme.Requery
Me!txTotal = Null
Me!txTotal.SetFocus
Me!btAbortar.Enabled = false
End Sub

Dicas para melhorar o desempenho em rede:

Dica 1:  altere a propriedade indexado para SIM, dos campos que serão utilizados em filtragens. Veja na imagem abaixo:

Usando Access - Propriedade Indexado

 

Dica 2: evite, sempre que possível, utilizar funções de Domínio Agregado (DLookup, DCount, DSum,...), principalmente em consultas, pois cada vez que uma destas funções é acionada, uma viagem à tabela é feita. Caso seja realizada repetidas vezes, como em uma consulta, haverá um grande tráfego de dados pela rede, ocasionando queda de rendimento.

Veja uma forma totalmente errada, no uso da função Dlookup().

me!campoA = Dlookup("campo1","NomeDaTabela",filtro)
me!campoB = Dlookup("campo2","NomeDaTabela",filtro)
me!campoC = Dlookup("campo3","NomeDaTabela",filtro)
me!campoD = Dlookup("campo4","NomeDaTabela",filtro)
me!campoE = Dlookup("campo5","NomeDaTabela",filtro)

Observe que foram dadas cinco viagens à tabela para preencher cinco campos de um formulário.  Fica claro que a pessoa que escreveu o código acima não tem ainda um bom conhecimento no uso da função Dlookup. É notório que também não tem a percepção de que deve programar pensando numa forma de realizar o menor número de viagens possíveis às tabelas.

Para você que está no início do aprendizado, saiba que com a função Dlookup:

a)  podemos obter vários campos de uma vez, usando a concatenação (junção com o &).

Dlookup("[campo1] & [campo5],"nomeDatabela")

b)  podemos obter um valor já calculado.

Dlookup("[campo1] + [campo5]","nomeDatabela")

Dlookup("(([campo1] + [campo5])/100)","nomeDatabela")

Agora que você sabe que podemos concatenar campos no Dlooukp, veja um código alternativo para o preenchimento dos cinco campos de um formulário, do exemplo acima:

Dim seq As String, k
seq = "[campo1] & '|' & [campo2] & '|' & [campo3] & '|' & [campo4] & '|' & [campo5]"
seq = Dlookup(seq, "NomeDaTabela", Filtro)
k = Split(seq, "|")
Me!campoA = k(0)
Me!campoB = k(1)
Me!CampoC = k(2)
Me!CampoD = k(3)
Me!CampoE = k(4)

Veja que foi realizada APENAS uma viagem à tabela.

Dica 3:  aprenda a programar direto nos relatórios, a qualquer custo.  Programar direto nos relatórios  evita, muitas das vezes, ter que criar consultas que são um pesadelo para o desempenho do aplicativo.  Neste meu artigo tem uma super vídeo-aula, sobre como programar direto nos relatórios.

Dica 4:  em formulários utilizados para realizar cadastros, passe a propriedade Entrada de Dados para SIM .  Isso evita o carregamento de registros na abertura do formulário. 

Dica 5:  para tabelas que irão receber uma grande massa de dados, sugiro que use a técnica de criar tabelas temporárias em tempo de execução.  Utilize Formulários e Listbox acoplados à essas tabelas temporárias, com o objetivo de realizar pesquisas.  Esta técnica é também bastante eficiente para carregar relatórios, em projetos que não se utilizam de tabelas vinculadas.  O aplicativo exemplo Maestro, oferecido aqui no site, possui códigos e exemplos, no uso desta técnica.

Dica 6:
carregue os dados de um Combobox, somente quando receber o foco.  Exemplo:

Private Sub cboConsulta_GotFocus()
Dim strSql As String
strSql = "SELECT idcliente,cli_nome FROM tblClientes ORDER BY cli_nome;"
Me!cboConsulta.RowSource = strSql
End Sub

Esta técnica acelera o carregamento do formulário.

Dica 7: divida o seu aplicativo em duas partes: uma parte contendo as tabelas, chamada de Back-end, e a outra parte contendo o restantes dos objetos (consultas, formulários, relatórios, ...), chamada de Front-end. 

O Back-end deverá ficar em em uma pasta compartilhada, com permissões de leitura e escrita. 

O Front-end deverá ser copiado para cada máquina cliente.   Cada Front-end deverá ser ligado (vinculado) ao Back-end ou dependendo da forma como irá programar, poderá acessar o Back-end através de programação, sem uso de vínculos.

Dica 8:  use o compactar e reparar com regularidade no Frond-end e no Back-end.  Procure realizar uma cópia de segurança, antes de realizar o procedimento sobre o Back-end.

Dica 9:  procure usar ComboBox com vários campos acoplados.   Estes campos adicionais podem até ficar escondidos nas colunas da ComboBox, bastando ajustar a largura para o valor zero (configurado na propriedade Largura das Colunas).    

Veja na figura abaixo, campos do formulário, sendo preenchido com valores extraídos direto das colunas da ComboBox.

Usando Access - Combobox com três colunas

 

Observe no código abaixo que basta indicar o número da coluna ( column(n) ) do ComboBox para extrair o valor desejado. 

Me!tx0 = Me!cboListaNota.Column(0) 'preenchendo o campo Nota
Me!tx1 = Me!cboListaNota.Column(1) 'preenchendo o campo data compra
Me!tx2 = Format(Me!cboListaNota.Column(2), "#,#0.00") 'Valor da Nota

Arquivo Gerador de Registros

Faça o download do arquivo gerador e bons testes.

Sucesso!


 

 


35 comentário(s)

Marcelo   21/10/2012 10:11:20

Parabéns Avelino por mais esse trabalho que você disponibiliza gratuitamente, estava mesmo a procura de informações como essas. Sou admirador do seu trabalho e já aprendi muito com seus tutoriais.
Obrigado.

Marcelo David   22/10/2012 09:45:42

Mais uma vez ótimo artigo! Além de termos o aplicativo pronto, o código está todo comentado!
Junto com a video-aulas do Protec, sem dúvidas teremos ótimas práticas de programação resultantando em uma boa e eceitaval performance dos nossos aplicativos!

Samuel   22/10/2012 10:10:11

Sempre com um ensinamento prático e útil pra quem utiliza o access em seus trabalhos. Muito bom! Parabéns!!

Elizeu Farias   22/10/2012 11:13:20

Boa Avelino
Mais uma dica importantíssima para melhorar o desempenho em rede.
Parabéns.

Trajano Montassier   22/10/2012 13:04:36

Olá Avelino,
Parabéns por mais esse artigo, muito útil para qualquer projeto que se pretenda desenvolver.



Leandro A R Barbosa   22/10/2012 13:36:43

Avelino, não se crês em Deus e na sua misericórdia, mas ele foi benevolente comigo hoje, e usou esse artigo para isso! Para o próximo mês exatamente estou me preparando para rodar meu aplciativo em rede, no momento funciona decentralizadamente, um banco em cada máquina e faço o backup geral no fim do mês agrupando tudo. Meu problema consiste em que os micros estão muito distantes, o mais distante está a 130km e o mais próximo a 30mk e nossa rede é ruim, mas com suas dicas chego num patamar excelente!
Muito obrigado!!!

Hilario Filho   22/10/2012 13:38:37

Olá Avelino parabéns pelas dicas são realmente muito úteis.
Gostaria de saber a sua opinião sobre a migração de um accdb para ADP. Pois o banco do meu Cliente cresceu muito assim como o número de acessos simultâneos. Estou migrando o backend para o SQL Server 2012 e fazendo as adaptações do accdb para o ADP. Como o processo é lento gostaria de saber sua opinião antes de entrar de cabeça ou se existe uma solução mais conveniente e funcional.
Meu e-mail é hilario@domain.com.br.
Desde já agradeço
Abraço
Hilario.
Obs: Tenho muita dificuldade para encontrar literatura para projetos em ADP. Alguma dica ?

Fernandes,WSP   22/10/2012 14:11:26

Olá Avelino, mais uma vez, a semelhança dos que me anteceram, venho parabendizar pelo artigo.
Já agora aproveito para tirar uma dúvida:
Se pretendo preencher os controlos de um formulario, faço uma consulta criar tabela e crio uma tabela temporaria local só com o registo que pretendo, e sobre a tabela criada faço os meus dlookup.
Essa técnica é correcta?

Welson Zeferino de Oliveira Junior   23/10/2012 08:58:53

Realmente você é o cara. Uns 10 a 20 anos atrás um bom profissional era aquele que sabia um pouco de tudo, hoje é aquele que é bom em sua área e você Avelino é excelente em access, meus parabéns e obrigado.

http://dicadecursos.com

Avelino Sampaio   23/10/2012 11:46:57

Hilario,

O ADP é uma boa opção, principalmente pelo fato das consultas serem executadas pelo servidor(SQL) e não pelo front-end. Não tenho prática com o ADP para te fornecer dicas sobre pontos negativos.

Procure aprender bem sobre montagem de STORED PROCEDURES

Lembrando que ADO aceita trapabalhar com Ribbons, se estiver rodando sobre o Access 2007/2010

Sucesso!

Avelino Sampaio   23/10/2012 12:10:07

Fernandes,

Use tabelas temporarias quando necessitar realizar pesquisas ou quando quiser carregar relatórios em projetos que não trabalham com tabelas vinculadas.

Para procurar por um ínico registro na tabela, vc pode experimentar o método FindFirst do recordset.

Não consegui identificar muito bem o que você pretende. Explique com mais detalhes.

Hilario Filho   23/10/2012 12:12:17

Obrigado Avelino, pela sua atenção.

James Resplandes   23/10/2012 22:13:57

Eu não poderia deixar de comentar e te parabenizar por mais um verdadeiro mini-curso, com belíssimas explicações e exemplos didáticos claros e bem elaborados. Estou sempre ligado no seu canal e ainda continuo estudando access graças aos seus artigos e produtos disponibilizados, os quais, na maioria das vezes, são totalmente gratuitos.

Mora   25/10/2012 20:31:54

Avelino boa noite, estou começando aprender access, estou usando o 2007, e também uso formulários com uso de campos no word, me indique algum tutorial para que possa fazer um banco de dados com os dados de entrada neste formulário word, e tambem aproveitar os dados já armazenados para fazer preenchimento destes mesmos formulários, vinculado se ao access, de acordo com a necessidade.
Antecipando agradecimentos,

Mora.
Já recebo suas News letter.

Alessandro Jesus   26/10/2012 19:48:00

Avelino, Boa Noite! Gostei muito das dicas Dlookup e utilizo muito e gostaria de uma explicação:
Tenho uma Tab_Movimento, onde busco via Dlookup 3 campos na Tab_Visitante. Tentei adaptar o seu exemplo e não consegui, pode me ajudar:

Dim seq As String, k
seq = "[campo1] & '|' & [campo2] & '|' & [campo3] & '|' & [campo4] & '|' & [campo5]", tenho 3 campo, como ficaria o final desta linha?
seq = Dlookup(seq, "NomeDaTabela", Filtro)
k = Split(seq, "|") ' Aqui é colocado o intervalo? ex: 0-3
Me!campoA = k(0)
Me!campoB = k(1)
Me!CampoC = k(2)
Me!CampoD = k(3)
Me!CampoE = k(4)
Tenho essas barrinhas verticais no campo do Dlookup e nos campos que o identificam (k), Estas eu substiuo por 1, 2, 3 e assim sucessivamente?
Fico já agradecido em me ajudar

Avelino Sampaio   26/10/2012 19:59:04

Alessandro,

copie e cole o link abaixo no seu navegador.

http://maximoaccess.maisforum.com/t7919-funcoes-dlookupdcountdmaxdmin-em-front-end-desvinculado

Neste link eu ofereço um arquivo exemplo.

Bom estudo!

Alessandro Jesus   27/10/2012 10:25:40

Muito Obrigado... Vou estudar!
Lembrando que tenho interesse em adquirir o pacote com dicas que elaborou! mais um pouco adiante entro novamente para comprar e saber informações de pagamento...
Grato...

MARCIO MELO - RJ   05/11/2012 13:17:24

Gostei muito de todas essas dicas, algumas poucas já utilizava, vou adotar mais esses cuidados p garantir o desempenho na Rede, uma ação que venho fazendo é deixar um form de manutenção aberto e invisível e no form tem uma tabela com 1 registro - 3 campos que esta vinculada no BckEnd q monitora(versão e fechamento dos fronts caso necessite), percebi q o desempenho em rede aumenta muito, pois qdo logo como administrador esse front não carrega o form, pois é ele que fecha os outros fronts abertos caso eu queira, o Front q estou usando se comporta lento em comparação a outro q carregue esse form, algo visto e bem perceptível na prática. Show, cada vez mais estudo usandoaccess

Sou mais Brasil!

Marcelo dos santos    26/01/2013 18:44:51

Boa tarde Avelino

Estou com uma duvida aki

tenho duas tabelas conforme exeplo abaixo:

ID COD Descrição Valor
1 01 Exemplo1 20,00
2 01 20,00
3 01 11,00
4 02 Exemplo2 12,00
5 02 13,00
6 02 10,00
7 02 16,00

Preciso jogar os dados da primeira e segunda tabela fazendo a soma por COD e gravando em uma terceira tabela
para eu posa gerar o relatorio q me atende

Avelino Sampaio   28/01/2013 04:53:47

Marcelo,

a princípio vc não precisa gravar o resultado na terceira tabela pois o relatório resolve bem esta sua arquitetura.

Crie no seu relatório um AGRUPAMENTO por código (COD). Ative o cabeçalho e rodapé do grupo COD e neste rodapé use o a função Soma().

=soma([valor])

Sucesso!

Fabio Pradella   14/02/2013 12:35:35

Parabens, adorei a simplicidade de como voce explica ficando facil de entender ate para os mais leigos como eu.

Renato   21/02/2013 13:30:22

Muito Obrigado pela ajuda que você da mim e para todos, eu admiro muito a sua pessoa, em disponibilizar esses conteudo muito importante que ajuda muita gente e salva ate o trabalho de uns, rsrs.

estou aprendendo muito com esses tutoriais que disponibiliza
Parabéns

Obrigado mais uma vez
Agradecido

Rubens Araujo   24/07/2013 16:45:55

muito bom... parece difícil... mas não é fácil não.
Parabéns...

Guilherme Scardua   30/07/2013 15:30:15

Avelino, tem alguma literatura sobre "técnica de criar tabelas temporárias em tempo de execução"? Obrigado

Avelino Sampaio   30/07/2013 15:59:10

Guilherme,

Veja o meu artigo "Veja as novidades da versão 4 do aplicativo Maestro", aqui mesmo na seção DICAS.

Tem um bom exemplo prático no artigo "Movimento Bancário - Saldo, linha a linha, em um formulário" na seção TUTORIAIS.

Bom estudo!

Sergiosdl   03/09/2013 23:00:46

Avelino, parabéns pelo tópico.
não consegui chegar a uma concusão:
Ao invés de utilizar o dlookup para coletar varios dados, eu nao poderia utilizar o Openrecordset
Set rstSetor = CurrentDb.OpenRecordset(strSql)
If rstSetor.RecordCount > 0 Then.....
Você sabe dizer as direnças vantages x desvantagens

Abraços

Avelino Sampaio   04/09/2013 06:05:06

Sergio,

Sem dúvida nenhuma o uso do OpenRecordset() é a melhor opção.

Abra o meu tutorial "Movimento Bancário - Saldo, linha a linha, em um formulário" e acesse os links no final do artigo, que te levará aos tópicos que abordo a questão de desempenho.

Sucesso!

Sergiosdl   05/09/2013 15:54:40

Obrigado pela Resposta Avelino
Abraços

Sergiosdl   12/09/2013 15:19:42

Caro Avelino, vc em alguma solucao para quando o valor buscado pelo dlookup for nulo?
atualmente tenho que usar duas vezes o dlookup. A a primeira para ver se é nulo, e a segunda para buscar:

if not isnull(dlookup("campo","tabela","outrocampo = 1") then
camporecebe = dlookup("campo","tabela","outrocampo = 1")
else
msgbox "nao localizado...."
endif

Avelino Sampaio   12/09/2013 16:49:24

Sergio,

utilize a função NZ()

camporecebe = nz(dlookup("campo","tabela","outrocampo = 1") ,"Sem Valor")

ou

camporecebe = nz(dlookup("campo","tabela","outrocampo = 1") , 0)

Sucesso!

Sergiosdl   12/09/2013 19:04:19

Obrigado Avelino
do seu exemplo de dlookup, passei meu sistema inteiro e fracamente nao consegui medir nem aproximado a quantidade e viagens a tabela que foram economizados gracas a sua dica, agora vou tratar de rever o sistema com estas alteracoes.

Abraços

Hugo Pereira   17/07/2014 08:22:35

Ola Avelino,
Estou simplesmente fascinado com tudo que você faz, gostaria de poder ter a sua ajuda
adorei este aplicativo, mas vamos directo ao que preciso, gostava de saber se é possível
criar um aplicativo que gere determinado numero de linhas baseado em campos que o utilizador
decida definir.
Ex:
NomeroCliente=500302
NomeCliente=Hugo Pereira
NumeroFichas= 1 a 200

gerar tipo 200 campos com o mesmo NomeroCliente, mesmo NomeCliente e o NumeroFichas ficar por oordem crescente seguido 1 a 200

Rafael Batista   08/09/2014 17:34:42

Olá Avelino, tudo bem?
na expressão
For j = 0 To (Nz(Me!txTotal, 0)) - 1
rs.AddNew
rs!Nomecliente = Nomecliente(Int(Rnd() * 66)) <<<<<<====


se eu quiser colocar na ordem, de forma que cada registro fique com um nome porem na sequencia de escrita ex: registro 1 Avelino
registro 2 Pedro,Luiz,Elizabete,Thais,kelly,Gilberto,Claudio,..."

como faço isso obrigado camarada e parabéns por sua disponibilidade em nos ajudar.

DELMAR   07/08/2015 15:19:03

Olá Avelino. Tenho um formulário onde os campos são de uma mesma tabela. Um dos campos é data e ou outro é texto. Preciso que o seja gerado um aviso se a data e o texto que vou cadastrar são iguais.
Abraço

Avelino Sampaio   10/08/2015 08:00:13

Delmar,

não entendi. Por gentileza, apresente esta sua questão lá no meu fórum:

http://www.redeaccess.com.br

E ofereça mais detalhes

No aguardo


Envie seu comentário: