Erro na propriedade UniqueTable do Access 2013

Uma boa prática de desenvolvimento no MS-Access com base de dados SQL Server é não usar tabelas vinculadas. Isto é possível definindo a propriedade Recordset do formulário como sendo um objeto Recordset de uma consulta qualquer feita no SQL Server. Exemplo:


Private Sub Form_Open(Cancel As Integer)
Dim cnn As ADODB.Connection
Dim strConn As String
Dim rst As ADODB.Recordset
Dim strSQL As String

On Error GoTo ErrHandler

Set cnn = New ADODB.Connection
strConn = "DRIVER=SQL Server;SERVER=TeuServidor;DATABASE=TeuDatabase;Trusted_Connection=Yes"
cnn.Open strConn

Set rst = New ADODB.Recordset
strSQL = "SELECT Teus Campos FROM TuasTabelas"
rst.CursorLocation = adUseClient
rst.Open strSQL, cnn, adOpenStatic, adLockOptimistic
Set Me.Recordset = rst
Me.UniqueTable = "tbl_TuaTabela"
ExitHere:
Exit Sub

ErrHandler:
MsgBox Err.Description & vbCrLf & Err.Number & vbCrLf & Err.Source, vbCritical, "Form_Open"
Resume ExitHere
End Sub

 

Uma propriedade pouco conhecida, usada no código acima, é a UniqueTable. Trata-se de uma propriedade do formulário do Access e serve para indicar qual tabela será editada no banco de dados. Se, por exemplo, o seu SELECT incluir múltiplas tabelas (JOINs) com dados relacionados, é preciso especificar qual é a tabela a ser editada, e tal definição é passada pela propriedade UniqueTable. Desta forma, é possível até mesmo ter um Recordset carregado a partir de uma StoredProcedure e usá-lo como base para edição de uma tabela.

O Access 2013, porém, veio com um erro que impossibilita o uso da propriedade UniqueTable: ele não a reconhece. Motivo: por um erro na documentação do Access, a propriedade UniqueTable é listada apenas como um recurso de projetos ADP, e como o Access 2013 não suporta mais projetos ADP, a propriedade foi removida do VBA (embora seu uso não gere erro de compilação). Porém, na prática não se trata de um recurso exclusivo de ADPs, é usado igualmente em MDBs e ACCDBs. Sua remoção quebra aplicativos já existentes e limita o que podemos fazer em novos aplicativos (não podemos ter origem de dados com JOINs em formulários editáveis, o que é uma tremenda limitação). Repetindo: este problema se refere ao uso do Access com o SQL Server (ou outro SGBD), e não ao Access/Access tradicional.

 

 

Para contornar o problema, criei nos meus aplicativos um código para verificar se a versão é a 2013 e, se for, não aplica a propriedade UniqueTable. Obviamente, este código não resolve o problema, apenas foge dele. Se a origem do formulário for um SELECT simples, tudo bem, pois não é necessário definir o UniqueTable, mas se for um JOIN, uma View ou uma Procedure, o Access ficará sem saber qual a tabela a ser editável e o formulário ficará em modo “apenas leitura”.


'Define UniqueTable se o Access for anterior ao 2013
If Split(Application.Version, ".")(0) < 15 Then
frm.UniqueTable = strUniqueTable
End If

 

Após vários meses de análise do problema, a Microsoft enfim disponibilizou um hotfix de correção, disponível neste endereço: http://support.microsoft.com/kb/2863871

 

Após a instalação do hotfix, o Access voltou a reconhecer a propriedade UniqueTable. Não basta instalar na máquina de desenvolvimento: cada usuário final precisa desta atualização.

Esse post foi publicado em Access, VBA e marcado . Guardar link permanente.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s