Boa tarde pessoal tudo bem?
Tenho um banco de dados Access na rede, que uso como back end entre o sql e o excel, pois conectando o excel com o sql, a busca fica extremamente lenta, então preferi colocar os dados já processados no access para melhorar a performance.
Esse banco atualiza a cada meia hora, e a cada atualização, ele exclui a tabela do mês atual, e cria uma nova com os dados atualizados.
Cada usuario tem uma planilha que conecta com esse banco access e atualiza as informações.
Porém da erro quando o usuario puxa os dados durante a atualização, e eu gostaria de bloquear esse acesso enquanto a macro de atualização está rodando no access, e dar uma mensagem tipo "dados em atualização, tente novamente daqui a 1 minuto".
Como eu posso fazer isso?
Obs: não tenho como colocar arquivo de exemplo, porque estou no trabalho e é bloqueado.
Segue o código usado:
Excel
Public Sub conexaoNice()
Dim sheetMeta As Worksheet, sheetCalculo As Worksheet
Dim cnx As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim nomeTabela As String, sql As String, mes As String, firstName As String
Dim insert As Variant, dados() As Variant
Dim contagem As Integer, posicao As Integer
posicao = 0
mes = Sheets("Cálculo Monitoria").Range("mes").Value
nomeTabela = criarNomeTabela(mes)
insert = inserts()
Application.StatusBar = "Conectando com o NICE..."
usuario = Sheets("Cálculo Monitoria").Range("usuario").Value
'sql = "Select top 1 iEvalID from vwNiceDBKITEvaluationQuestions where iEvalID is not null"
Set sheetMeta = ThisWorkbook.Sheets("Metas")
Set sheetCalculo = ThisWorkbook.Sheets("Cálculo Monitoria")
Set cnx = New ADODB.Connection
'iniciando o objeto da conexão
Set cnx = New ADODB.Connection
'atribuindo as propriedades de conexão (servidor,nome do banco, usuário, senha e etc)
'cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\fswcorp\CEICACCMONITQUAL4. Operações Terceirizadas - Vanessa SilvaMonitoria Qualidade AtendimentoProdutividadeProdutividade Equipe Vanessa.accdb;Extended Properties =Excel 8.0;HDR=YES"
With cnx
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open "\fswcorp\CEICACCMONITQUAL4. Operações Terceirizadas - Vanessa SilvaMonitoria Qualidade AtendimentoProdutividadeProdutividade Equipe Vanessa.accdb"
.CursorLocation = adUseClient
End With
'iniciando o comando
Set cmd = New ADODB.Command
firstName = Mid(usuario, 1, InStr(1, usuario, " ") - 1)
With cmd
.CommandTimeout = 0 'propriedade para não dar erro de Time Out quando a query demorar para executar
.ActiveConnection = cnx 'dizendo ao comando que a conexão que será usada é a cnx
End With
cmd.CommandText = "drop Table celulas" & firstName
On Error Resume Next
cmd.Execute
cmd.CommandText = "Create Table celulas" & firstName & "(Celula Varchar(50))"
cmd.Execute
For i = 1 To UBound(insert)
cmd.CommandText = insert(i)
cmd.Execute
Next i
sql = Query(nomeTabela, firstName)
cmd.CommandText = sql
'executando o comando e armazenando o resultado no recordset
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.CursorType = adOpenStatic
End With
Set rs = cmd.Execute
contagem = rs.RecordCount
ReDim dados(1 To contagem, 1 To 4)
dados = rs.GetRows
For i = 1 To contagem
If IsNull(dados(1, posicao)) Then
dados(1, posicao) = 0
End If
Sheets("Cálculo Monitoria").Range("Celulas").Cells(i).Offset(0, 2) = dados(1, posicao)
posicao = posicao + 1
Next i
rs.Close
On Error Resume Next
cmd.CommandText = "drop table celulas" & firstName
cnx.Close
Application.StatusBar = ""
Exit Sub
End Sub
Access
Public Sub Conexão()
Dim sql As String, data As String, id As String, analista As String, celula As String, nomeTabela As String
Dim cnx As ADODB.Connection, rs As ADODB.Recordset, cmd As ADODB.Command
Dim dados As Variant
Dim numeroRegistros As Double
nomeTabela = criarNomeTabela()
sql = Query()
Set cnx = New ADODB.Connection
Set cmd = New ADODB.Command
cnx.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=dbkit;Password=dbkit123;Initial Catalog=nice_dw;Data Source=svtt006cto;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=500010288757-IS;Use Encryption for Data=False;Tag with column collation when possible=False"
With cnx
.CursorLocation = adUseClient
End With
cnx.Open
With cmd
.CommandText = sql
.CommandTimeout = 0
.ActiveConnection = cnx
End With
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.CursorType = adOpenStatic
End With
Set rs = cmd.Execute
numeroRegistros = rs.RecordCount
ReDim dados(numeroRegistros, 4)
dados = rs.GetRows
On Error Resume Next
CurrentDb.Execute "DROP TABLE " & nomeTabela
CurrentDb.Execute "CREATE TABLE " & nomeTabela & " (Data Varchar(10),ID Varchar(10), Analista Varchar(50), Célula Varchar(50))"
For i = 0 To numeroRegistros
data = dados(0, i)
id = dados(1, i)
analista = dados(2, i)
celula = dados(3, i)
CurrentDb.Execute "INSERT INTO " & nomeTabela & "(Data,ID,Analista,Célula) VALUES (" & Chr(34) & data & Chr(34) & "," & Chr(34) & id & Chr(34) & "," & Chr(34) & analista & Chr(34) & "," & Chr(34) & celula & Chr(34) & ")"
Next i
End Sub
Obrigado.
Postado : 26/02/2016 8:32 am