вторник, 9 июля 2013 г.

Вставить результат SQL запроса в Excel (VBA)

Возникла потребность в формировании определенной таблицы с данными, которые хранятся в SQL.

Задача: реализовать возможность вставки в Excel результата обработки SQL запроса. При этом необходимо реализовать возможность изменения параметров запроса из Excel.

Другими словами, пользователь должен открыть таблицу Excel, внести в заданные места необходимые параметры. После этого ему должен отобразиться результат выполнения SQL запроса с учетом введенных параметров.

В нашем случае источником данных будет некая БД, в которую внесены данные по активам, закрепленными за пользователями. Для работы с ними необходимо сделать выборку по фамилии пользователя, результат выборки выгрузить в Excel.

Для реализации задуманного возьмем (например) SQL запрос, который получает необходимые нам данные и созданим на его основе хранимую процедуру (Stored Procedure) SQL:




declare
    @WorkPlace nvarchar(125)
SELECT
    TOP 1 @WorkPlace=resource.RESOURCENAME
FROM
    Resources resource
    LEFT JOIN ComponentDefinition product ON resource.COMPONENTID=product.COMPONENTID
    LEFT JOIN ComponentType productType ON product.COMPONENTTYPEID=productType.COMPONENTTYPEID
    LEFT JOIN ResourceOwner rOwner ON resource.RESOURCEID=rOwner.RESOURCEID
    LEFT JOIN SDUser sdUser ON rOwner.USERID=sdUser.USERID
    LEFT JOIN AaaUser aaaUser ON sdUser.USERID=aaaUser.USER_ID
WHERE
    aaaUser.FIRST_NAME=@OwnerName and productType.COMPONENTTYPENAME=N'Рабочее место'
SELECT
    productType.COMPONENTTYPENAME "Тип продукта",
    resource.RESOURCENAME "Наименование актива",
    product.COMPONENTNAME "Продукт",
    resource.SERIALNO "Серийный номер"/*, resource.BARCODE "Штрих-код"*/
FROM
    Resources resource
    LEFT JOIN ComponentDefinition product ON resource.COMPONENTID=product.COMPONENTID
    LEFT JOIN ComponentType productType ON product.COMPONENTTYPEID=productType.COMPONENTTYPEID
    LEFT JOIN ResourceOwner rOwner ON resource.RESOURCEID=rOwner.RESOURCEID
    LEFT JOIN ResourceAssociation rToAsset ON rOwner.RESOURCEOWNERID=rToAsset.RESOURCEOWNERID
    LEFT JOIN Resources rToAssetResource ON rToAsset.ASSTTORESOURCEID=rToAssetResource.RESOURCEID
    LEFT JOIN SDUser sdUser ON rOwner.USERID=sdUser.USERID
    LEFT JOIN AaaUser aaaUser ON sdUser.USERID=aaaUser.USER_ID
WHERE
    rToAssetResource.RESOURCENAME=@WorkPlace
    or
    (aaaUser.FIRST_NAME=@OwnerName and productType.COMPONENTTYPENAME<>N'Рабочее место')
Теперь необходимо в VBA добавить код подключения к созданной процедуре.
Для этого открывает редактор VBA (Alt+F11).
Для работы с SQL необходимо подключить соответствующую библиотеку:
Tools -> References -> Microsoft ActiveX Data Objectc 2.6 Library
После чего для получения и вставки данных необходимо использовать следующий код:

Dim OwnerName1 As String
Dim objMyConn As ADODB.Connection
Dim objMyCommand As ADODB.Command
Dim objMyRecordset As ADODB.Recordset


Set objMyConn = New ADODB.Connection
Set objMyCommand = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
       
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=server\database;Initial Catalog=DataBaseName;User ID=Username;Password=UserPassword;"
objMyConn.Open

With objMyCommand
.ActiveConnection = objMyConn
.CommandText = "dbo.sd_export_data_to_sql"
.CommandType = adCmdStoredProc
.NamedParameters = True
.Parameters.Append .CreateParameter("@OwnerName", adVarChar, adParamInput, 200, OwnerName1)
.Execute
End With

Set objMyRecordset.Source = objMyCommand
objMyRecordset.Open

ActiveSheet.Range("A13").CopyFromRecordset objMyRecordset
 В результате в данном случае макрос возмет значение, которое будет присвоено параметру OwnerName1, передаст его в хранимую процедуру SQL для обработки. Результат работы SQL запроса будет вставлен в таблицу Excel начиная с ячейки А13.

Комментариев нет:

Отправить комментарий