Tabelas MySQL vinculadas no Access

Moderador: Avelino Sampaio

Augusto
Mensagens: 2
Registrado em: 07 Jun 2015, 15:31

Tabelas MySQL vinculadas no Access

Mensagempor Augusto » 07 Jun 2015, 15:47

Grande Avelino!

Parabéns pelo novo fórum de Access. Tenho acompanhado seu trabalho através de seu site Usando Access e também através de excelentes contribuições suas em outros fórums. Tenho certeza que, com sua larga experiência em Access aliada à sua capacidade de comunicar e de ensinar, este fórum será um grande sucesso muito em breve.

Para minha estréia aqui, segue uma dúvida sobre tabelas vinculadas:

Seguinte: tenho uma base em Access 2013 que contém várias tabelas vinculadas via ODBC ao MySQL. Na conexão via DSN utilizo um parâmetro de timeout = 28800 de forma a manter a conexão por pelo menos oito horas se não houver nova chamada às tabelas (talvez seja um exagero, mas vi essa dica em outro fórum). A performance ficou excelente e, com isso, não precisei mudar sequer uma linha de código, além de poder continuar utilizando todos os recursos nativos do Access, sem a necessidade de escrever código ADO para abrir e fechar cada conexão. Porém, surgiram as seguintes dúvidas:

1 - Aparentemente, a partir do momento em que eu abro a primeira tabela, esta conexão se mantém até o timeout expirar, mesmo que eu feche a aplicação. É isso mesmo?

2 - Essa técnica é uma boa prática, já que mantém a conexão aberta com o servidor enquanto a aplicação estiver aberta?

3 - É possível fechar (desvincular) as tabelas através de código (quando fechar um form, p ex)?

4 - É possível montar consultas no servidor MySql e vinculá-las ao Access, para que o processamento da consulta seja feito no servidor? Caso positivo, como acessar essas consultas?

Grande abraço,

Augusto

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


Avelino Joao
Mensagens: 7
Registrado em: 07 Jun 2015, 13:30

Re: Tabelas MySQL vinculadas no Access

Mensagempor Avelino Joao » 07 Jun 2015, 20:55

Boa Noite Augusto, o mestre Avelino Sampaio pediu-me para te dar uma ajuda nesse assunto Access e Mysql, Eu trabalho com Access e Mysql de varias forma desde:Conexão DSN - Less, ODBC e Stored Procedure. Não vou escrever muita coisa aqui ate porque já escrevi muito sobre o assunto vou lhe deixar alguns tópico qualquer duvida pode voltar a mim consultar.

1 - Aparentemente, a partir do momento em que eu abro a primeira tabela, esta conexão se mantém até o timeout expirar, mesmo que eu feche a aplicação. É isso mesmo?

R: Trabalhar com conexão via DSN tens que ter muito cuidado e aconselho-te estudar conexão desvinculado DAO já tens a tabela vinculada.

4 - É possível montar consultas no servidor MySql e vinculá-las ao Access, para que o processamento da consulta seja feito no servidor? Caso positivo, como acessar essas consultas?

R: Sim é possivel criar consulta no Mysql normalmente faço isso, agora para chamar a consulta faço a importação para uma tabela temporária no Access.

Vou deixa Material voce estudar:

http://www.maximoaccess.com/t10264-access-sql-server
http://www.maximoaccess.com/t11975-resolvidofonfigurara-conexao-dsn-less-via-formulario

Avatar do usuário
Jeferson
Mensagens: 22
Registrado em: 07 Jun 2015, 14:09
Localização: Belo Horizonte
Contato:

Re: Tabelas MySQL vinculadas no Access

Mensagempor Jeferson » 08 Jun 2015, 10:58

Prezados, seguem minhas considerações, com base na minha experiência em Access x MySQL

1 - Aparentemente, a partir do momento em que eu abro a primeira tabela, esta conexão se mantém até o timeout expirar, mesmo que eu feche a aplicação. É isso mesmo? Eu tenho observado esse efeito para todas as conexões feitas em ms access. Aparentemente é alguma bug, pois uma vez a aplicação fechada, ele deveria encerrar a conexão. Se você estivesse utilizando o ADO, isso poderia ser feito via código, mas como é dia ODBC, o driver é que faz esses gerenciamento, o que pode ser o caso de configurar as propriedades 'Conection' e 'Cursor' do driver ODBC.

2 - Essa técnica é uma boa prática, já que mantém a conexão aberta com o servidor enquanto a aplicação estiver aberta? Cada caso é um caso. O MySQL (em teoria) suporta em torno de 1.500 conexões simultâneas. Se você tem poucos usuários, em torno de 10 por exemplo, não afetará, mas deverá levar em consideração fatores como trafego de rede, distancias entre pontos de acesso, e outros fatores. O ideal é abrir uma conexão, realizar os procedimentos e fechar a mesma, que é o que a maioria das aplicações feitas em VB por exemplo, te obriga a fazer.

3 - É possível fechar (desvincular) as tabelas através de código (quando fechar um form, p ex)?Sim, para isso consulte os eventos do Access docmd.TransferDatabase , CurrentDb.TableDefs

4 - É possível montar consultas no servidor MySql e vinculá-las ao Access, para que o processamento da consulta seja feito no servidor? Caso positivo, como acessar essas consultas? Não. Consulta é consulta. Você vincula tabelas, não consultas. O que você pode fazer, é rodar a consulta que está no MySQL, mas para isso precisa realizar essa tarefa via código, ou seja, VBA. Não há como fazer uma vinculação a consulta. Para executar alguma tarefa no servidor e reportar ao banco de dados, você deverá utilizar um stored procedure, e para a maioria dos usuários access isso complica um pouco.

Uma coisa que poucos programadores abem é que, quando você faz uma conexão via ADO a um banco de dados MySQL por exemplo, via código, você pode explorar os recursos do banco, sem a necessidade de um stored procedure, com por exemplo, rodar a função LIMIT por exemplo.

Se montar uma consulta no access com a seguinte estrutura, ele não irá roda.

SELECT * FROM pedidos LIMIT 100,10

Agora se você passar a mesma via ADO, obterá os resultado normalmente, pois ela é executada no servidor


Espero ter ajudado.

sds
Suporte ao Desenvolvedor Ms Access: preços especiais para usuários da RedeAccess e UsandoAccess.
NFe, NFSe, NFCe, CFe, CTe, Boleto Bancário, SMS, integração Web, Android. Módulos em código fonte aberto. Access: http://www.kartoffel.com.br

Augusto
Mensagens: 2
Registrado em: 07 Jun 2015, 15:31

Re: Tabelas MySQL vinculadas no Access

Mensagempor Augusto » 08 Jun 2015, 16:19

Jeferson,

Grato pelas preciosas informações, elas foram de grande valia.

Aproveito para colocar mais uma dúvida: Ao tentar atualizar os dados em alguns formulários (mas não todos) cujas origens apontam para tabelas vinculadas no MySQL recebo a mensagem:

"Conflito de Gravação:

Este registro foi alterado por outro usuário desde que você começou a editá-lo. Se você salvar o registro, as alterações feitas pelo outro usuário serão substituídas"

Somente após clicar em "Descartar Alterações" o form é atualizado.

Abraços,

Augusto

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.


Avelino Joao
Mensagens: 7
Registrado em: 07 Jun 2015, 13:30

Re: Tabelas MySQL vinculadas no Access

Mensagempor Avelino Joao » 08 Jun 2015, 20:16

Para trabalhar com consulta ou Stored Procedure do Mysql normalmente uso duas técnica, para consulta faço importação do dados para uma tabela temporária devidamente filtrada dessa forma preencho os relatórios não provoca sub-carga na rede, quanto a Stored Procedure chama directamente com ADO veja dois códigos.

Na minha opinião dessa forma que estas a trabalhar vais ter um pouco de dor cabeça, para configura toda as maquinas onde iras trabalhar e por outra tens a tabela vinculada ok mais devias desvincular os formulários para evitar situação do género não sub-carregar a rede.
Veja esse artigo
http://www.maximoaccess.com/t10503-uso-em-rede-evitar-2-usuarios-num-mesmo-registro?highlight=edit+mesmo+dado

Importar dado Mysql

Código: Selecionar todos

Function importar_Produto()
Dim Db2 As Database
Dim Rs2 As Recordset
On Error Resume Next
dataset.Close 'fecha o recorset
banco.Close 'fecha o banco de dados
Set dataset = Nothing
Rs2.Close
Set Db2 = Nothing
Set Db2 = CurrentDb
On Error GoTo trata

Comando = "Select codProduto,descricao,unidade,valorUnitario,estoqueMinimo,qtdEstoque,estado,iva,tabelaiva  from produto WHERE codProduto=" & Nz(Me!txtcod) & " ORDER BY codProduto;"
Call executa

dataset.MoveFirst
Set Rs2 = Db2.OpenRecordset("Produto")
Do While Not dataset.EOF
Rs2.AddNew
If IsNull(dataset!codProduto) = True Or dataset!codProduto = "" Then
Else
Rs2!codProduto = dataset!codProduto
End If
If IsNull(dataset!descricao) = True Or dataset!descricao = "" Then
Else
Rs2!descricao = dataset!descricao
End If
If IsNull(dataset!unidade) = True Or dataset!unidade = "" Then
Else
Rs2!unidade = dataset!unidade
End If
If IsNull(dataset!valorUnitario) = True Or dataset!valorUnitario = "" Then
Else
Rs2!valorUnitario = dataset!valorUnitario
End If
If IsNull(dataset!qtdEstoque) = True Or dataset!qtdEstoque = "" Then
Else
Rs2!qtdEstoque = dataset!qtdEstoque
End If
If IsNull(dataset!estoqueMinimo) = True Or dataset!estoqueMinimo = "" Then
Else
Rs2!estoqueMinimo = dataset!estoqueMinimo
End If
If IsNull(dataset!estado) = True Or dataset!estado = "" Then
Else
Rs2!estado = dataset!estado
End If

If IsNull(Rs2!IVA) = True Or Rs2!IVA = "" Then
Else
rs!IVA = Rs2!IVA
End If
If IsNull(Rs2!tabelaiva) = True Or Rs2!tabelaiva = "" Then
Else
rs!tabelaiva = Rs2!tabelaiva
End If
Rs2.Update
dataset.MoveNext
Loop
dataset.Close
cn.Close
Set dataset = Nothing
Rs2.Close
Set Db2 = Nothing
sai:
Exit Function
trata:
If Err = 3021 Then
Resume Next
Else
Set dataset = Nothing
Resume sai
End If
End Function


Trabalhar Stored Procedure

Código: Selecionar todos

Private Sub cboPesquisa_GotFocus()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
Call MySQL_Server    'Carrega parametros do servidor
 Set cn = CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 5.5.25a Driver};Server=" & MyslqServidor & ";Database=" & MyslqDatabase & ";User=" & MyslqUsuario & "; Password=" & MyslqSenha & "; Port=" & MyslqPorta & ";Option=3;"
strSQL = "Fornecedor " 'estou a chamar a Stored Procedure
Set rs = cn.Execute(strSQL)
Me.cboPesquisa = Null
 cboPesquisa.RowSource = ""    'Limpa os dados da caixa de listagem
cboPesquisa.Requery    'atualiza dados da caixa de listagem
 While (Not rs.EOF)
   cboPesquisa.AddItem rs("nome").Value & ";"
   rs.MoveNext
Wend
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub

Disable adblock

Precisamos do seu apoio. Faca uma doacao para o site atraves do Paypal.



Voltar para “Access x MySql”

Quem está online

Usuários neste fórum: Nenhum usuário registrado e 1 visitante