Pessoal, estou com um problema com a minha conexão com o SQL.
Se eu setar o meu recordset usando o comando Open, ele dá erro de TimeOut. Se eu uso com objeto do tipo command com a propriedade timeout = 0, aparece o erro dizendo que a operação não é permitida quando o objeto está fechado.
Pesquisei na internet, e vi que a maioria das vezes o erro é na query, porém a minha query está funcionando perfeitamente.
Não consigo upar a planilha aqui no meu trabalho, porque é bloqueado. Segue o código que eu usei:
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 sql As String, usuario As String
usuario = usuarioLogado()
sql = Query()
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=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"
'abrindo a conexão
cnx.Open
'iniciando o comando
Set cmd = New ADODB.Command
With cmd
.CommandText = sql 'atribuindo o texto da variável ao comando
.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
'executando o comando e armazenando o resultado no recordset
Set rs = cmd.Execute(sql)
Sheets("Cálculo Monitoria").Range("D8").CopyFromRecordset rs
rs.Close
cnx.Close
End Sub
Public Function Query() As String
Dim rng As Range
Dim parametros As String, insert As String, sql As String
Dim i As Integer
Set rng = [Celulas]
parametros = "Declare @mes As Varchar(2)" & vbCrLf & _
"Declare @usuario As Varchar(100)" & vbCrLf & _
"Set @mes =" & Chr(39) & [mes] & Chr(39) & vbCrLf & vbCrLf & _
"Set @usuario =" & Chr(39) & [usuario] & Chr(39) & vbCrLf & _
"declare @celulas Table(Célula varchar(50))"
For i = 1 To rng.Rows.Count
insert = insert & " INSERT INTO @celulas (Célula) Values(" & Chr(39) & rng.Cells(i) & Chr(39) & ")" & vbCrLf
Next i
sql = [textoquery]
Query = parametros & insert & sql
End Function
no intervalo nomeado [textoquery], coloquei o restante do texto da query...
"Select ISNULL(Quantidade.Qtde,0) AS Qtde
from
(select Célula from @celulas) As Celulas
LEFT JOIN
(
SELECT EQ1.nvcQuestionAnswer As Célula, COUNT(EQ1.iEvalID) as Qtde
from vwNiceDBKitEvaluationQuestions EQ1 join vwNiceDBKitEvaluationQuestions EQ2
ON EQ1.iEvalID = EQ2.iEvalID AND EQ1.iSiteId = EQ2.iSiteId
where YEAR(EQ1.dtCreationTime) = '2016'
and MONTH(EQ1.dtCreationTime)=@mes
and EQ1.nvcCaption = 'Célula'
AND EQ2.nvcCaption = 'Evaluator Full Name'
and EQ2.nvcAnswer = @usuario
GROUP BY EQ1.nvcQuestionAnswer
) As Quantidade
On Quantidade.Célula = Celulas.Célula"
Obrigado
Postado : 19/02/2016 1:16 pm