Я использовал этот сайт раньше (и других), и впоследствии я создал что-то, что обычно работает. Теперь он не работает с новым SQL-скриптом (но SQL-скрипт работает!). Обратите внимание, что я плохо разбираюсь в коде VBA и не понимаю его .... !!!Код SQL и VBA
Может кто-то помочь, пожалуйста? Я получаю сообщение об ошибке «Ошибка времени выполнения» 3704, операция не разрешена, когда объект близок »). Я не понимаю, как он закрылся до окончания!
У меня есть два раздела к этому: Модуль 1 - содержит свойства соединения Модуль 2 - содержит код SQL для запуска И ниже:
Модуль 1:
Public Const DBName As String =
Public Const strServer As String = "RMSSQL"
Public Const connecString1 As String = "Provider=SQLOLEDB.1"
Public Const connecString2 As String = ";Initial Catalog="
Public Const connecString3 As String = ";DataSource="
Public passSQL As ADODB.Connection
Public myrst As ADODB.Recordset
Public Function runTheQuery(sqlQuery, DBaseName)
'connect
Dim strConnect As String
strConnect = "Driver={SQL Server}; Server=" & strServer & ";Database=" & DBaseName & ";Trusted_Connection=yes; "
Set passSQL = New ADODB.Connection
passSQL.ConnectionString = strConnect
passSQL.CursorLocation = adUseClient
passSQL.CommandTimeout = 0
passSQL.Open
'create recordset
Dim aRst As ADODB.Recordset
Set aRst = New ADODB.Recordset
With aRst
.activeconnection = passSQL
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
'run sql query
.Open sqlQuery
.activeconnection = Nothing
End With
Set myrst = aRst
'close
passSQL.Close
End Function
Модуль 2:
Sub simplequery()
runTheQuery "declare @Portname varchar(60) " & _
"set @Portname = " & "'" & Range("G10").Value & "'" & _
"SELECT SUM(M.TIV) as TIV " & _
"FROM (select port.PORTNAME, lcvg.LOCID, lcvg.LOSSTYPE, prop.OCCSCHEME, prop.OCCTYPE, MAX(lcvg.VALUEAMT) TIV " & _
"from accgrp ac " & _
"inner join Property prop on prop.ACCGRPID = ac.ACCGRPID " & _
"inner join Address addr on addr.AddressID = prop.AddressID " & _
"inner join loccvg lcvg on lcvg.LOCID = prop.LOCID " & _
"inner join portacct pa on pa.ACCGRPID = ac.ACCGRPID " & _
"inner join portinfo port on port.PORTINFOID = pa.PORTINFOID " & _
"where port.PORTNAME = @Portname " & _
"group by port.PORTNAME, lcvg.LOCID, lcvg.LOSSTYPE, prop.OCCSCHEME, prop.OCCTYPE, lcvg.VALUEAMT) M " & _
"GROUP BY M.PORTNAME; ", Sheets("Modelled Results - 1 of 2").Range("g9").Value
Sheets("DataDumps").Range("A1").Select
'Headers
For col = 0 To myrst.Fields.Count - 1
ActiveCell.Offset(0, col).Value = myrst.Fields(col).Name
Next
'Paste recordset
Range("A1").CopyFromRecordset myrst
End Sub
Когда я отладки, именно это подсвечивается:
'Paste recordset
Range("A1").CopyFromRecordset myrst
ОБНОВЛЕНО к этому:
Модуль 1:
'Public Const DBName As String =
Public Const strServer As String = "RMSSQL"
Public Const connecString1 As String = "Provider=SQLOLEDB.1"
Public Const connecString2 As String = ";Initial Catalog="
Public Const connecString3 As String = ";DataSource="
Public passSQL As ADODB.Connection
Public myrst As ADODB.Recordset
Function runTheQuery(ByVal SQLQuery As String, ByVal DBName As String, ByRef MyRange As Range)
'Connect
Dim strConnect As String
strConnect = "Driver={SQL Server}; Server=" & strServer & ";Database=" & DBaseName & ";Trusted_Connection=yes; "
Set passSQL = New ADODB.Connection
passSQL.ConnectionString = strConnect
passSQL.CursorLocation = adUseClient
passSQL.CommandTimeout = 0
passSQL.Open
'create recordset
Dim aRst As ADODB.Recordset
Set aRst = New ADODB.Recordset
With aRst
.activeconnection = passSQL
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
'run sql query
.Open SQLQuery
.activeconnection = Nothing
End With
Set myrst = aRst
'close
passSQL.Close
Sheets("DataDumps").Range("A1").Select
'Headers
For col = 0 To myrst.Fields.Count - 1
ActiveCell.Offset(0, col).Value = myrst.Fields(col).Name
Next
'Paste recordset
Range("A1").CopyFromRecordset myrst
MyRange.CopyFromRecordset myrst
myrst.Close
End Function
Модуль 2: Sub simplequery()
runTheQuery "declare @Portname varchar(60) " & _
"set @Portname = " & "'" & Range("G10").Value & "'" & _
"SELECT SUM(M.TIV) as TIV " & _
"FROM (select port.PORTNAME, lcvg.LOCID, lcvg.LOSSTYPE, prop.OCCSCHEME, prop.OCCTYPE, MAX(lcvg.VALUEAMT) TIV " & _
"from accgrp ac " & _
"inner join Property prop on prop.ACCGRPID = ac.ACCGRPID " & _
"inner join Address addr on addr.AddressID = prop.AddressID " & _
"inner join loccvg lcvg on lcvg.LOCID = prop.LOCID " & _
"inner join portacct pa on pa.ACCGRPID = ac.ACCGRPID " & _
"inner join portinfo port on port.PORTINFOID = pa.PORTINFOID " & _
"where port.PORTNAME = @Portname " & _
"group by port.PORTNAME, lcvg.LOCID, lcvg.LOSSTYPE, prop.OCCSCHEME, prop.OCCTYPE, lcvg.VALUEAMT) M " & _
"GROUP BY M.PORTNAME ", Sheets("Modelled Results - 1 of 2").Range("g9").Value, Range("a1")
End Sub
Привет, Я получаю то, что вы говорите, но не знаете, как реализовать это в запросе? – diggles
Не могли бы вы скопировать его и показать мне? Я был бы очень признателен! С наилучшими пожеланиями, Джеймс – diggles
Попробуйте одно решение (это проще всего). Если вы не можете заставить его работать, отредактируйте свой вопрос, чтобы показать, что вы попробовали, и сообщение об ошибке, которое оно вернуло. Надеюсь, к тому времени у меня будет больше времени, чтобы помочь. –