Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры с помощью VBA / 23 сообщений из 23, страница 1 из 1
04.10.2012, 16:13
    #37984007
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Есть Excel файл, в котором по выбору элемента списка и нажатии кнопки должна вызваться процедура, хранимая на MySQL (2005). Процедура возвращает таблицу значений. Т.е. выбрали значение из списка -> нажали на кпопку -> получили таблицу.

Процедура выглядит так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
USE [ErrorReports]
GO
/****** Object:  StoredProcedure [dbo].[GetReportByUserName]    Script Date: 10/04/2012 11:37:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[GetReportByUserName] 
	-- Add the parameters for the stored procedure here
	@Submitter nvarchar(30)
AS	
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	

	select *
	from ErrorReports.dbo.ClientsErrors
	where submitter=@Submitter

	select *
	from ErrorReports.dbo.InternalErrors
	where submitter=@Submitter

END



Как вызвать ее из Excel?

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
04.10.2012, 16:42
    #37984074
кладовщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_bless, используя ADO, к примеру.
http://www.sql.ru/forum/actualthread.aspx?tid=943541
...
Рейтинг: 0 / 0
08.10.2012, 12:46
    #37987979
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Спасибо, но в моем варианте ошибка синтаксиса. Код вышел следующий:

Sub Get_Extended_Report()

submitter = Cells(1, 1).Value

Set MyCommand = New ADODB.Command
With MyCommand
.ActiveConnection = "GetFullSummary"
.CommandText = "dbo.GetReportByUserName"
.CommandType = adCmdStoredProc
.NamedParameters = True
.Parameters.Append. CreateParameter ("@submitter", adVarChar, adParamInput, submitter)
.Execute
End With

End Sub
...
Рейтинг: 0 / 0
08.10.2012, 12:57
    #37988013
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
точка после Append

в следующий раз пишите строку, на которой ошибка синтаксиса и правильно оформляйте код - FAQ
...
Рейтинг: 0 / 0
08.10.2012, 13:46
    #37988151
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Спасибо, буду знать. При компиляции теперь ошибка "invalid outside procedure", хотя в студии процедура выполняется верно.

В чем может быть проблема?

Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim submitter As Range

Set submitter = Sheets("Extended_Report").Cells(1, 1)

Set MyCommand = New ADODB.Command
With MyCommand
.ActiveConnection = Connection
.CommandText = "dbo.GetReportByUserName"
.CommandType = adCmdStoredProc
.NamedParameters = True
.Parameters.Append CreateParameter("@submitter", adVarChar, adParamInput, submitter)
.Execute
End With



где:

submitter - значение переменной, которую нужно передать в процедуру
dbo.GetReportByUserName - имя процедуры.
...
Рейтинг: 0 / 0
08.10.2012, 14:36
    #37988273
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_bless,

что возвращает ваша хранимка ?
...
Рейтинг: 0 / 0
08.10.2012, 14:50
    #37988322
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_bless"invalid outside procedure"это не о процедуре на SQL сервере. Ваш код требуется оформить в виде процедуры, а не просто так на листе писать

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub МояПроцедура()

Dim submitter As Range

Set submitter = Sheets("Extended_Report").Cells(1, 1)

Set MyCommand = New ADODB.Command
With MyCommand
.ActiveConnection = Connection
.CommandText = "dbo.GetReportByUserName"
.CommandType = adCmdStoredProc
.NamedParameters = True
.Parameters.Append CreateParameter("@submitter", adVarChar, adParamInput, submitter)
.Execute
End With

End Sub
...
Рейтинг: 0 / 0
08.10.2012, 15:12
    #37988391
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Процедура возвращает таблицу записей по параметру submitter. Другими словами - перечень детальных отчетов, заполненных сабмиттером.
...
Рейтинг: 0 / 0
08.10.2012, 15:20
    #37988411
Вызов хранимой процедуры с помощью VBA
Не понял, где у тред-стартера затык.
Для примера кусок рабочего модуля книги выложу. На лист экселя возвращается рекордсет, получаемый в ХРП dbo.p_GetMaxDrawDown:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Sub OpenConnection()
Set Connection = New ADODB.Connection
Cnct = Provider & _
                    Security & DBName & ServerName
Connection.Open ConnectionString:=Cnct
'MsgBox "Connection Established"
End Sub
Sub GetDrawDown()
'ИСПОЛЬЗУЕТСЯ!!!
Dim rs As ADODB.Recordset

'On Error GoTo KillAdo
OpenConnection
Set GetSourceCommand = New ADODB.Command
With GetSourceCommand
    .ActiveConnection = Connection
    .CommandText = "dbo.p_GetMaxDrawDown"
    .CommandType = adCmdStoredProc
    
    Set rs = _
    .Execute()
End With
'MsgBox rs.GetString
Range(Cells(7, 1), Cells(7, 2)).Clear
Range("A7").CopyFromRecordset rs

'Set GetSourceCommand = Nothing
'Set rs = Notning
CloseConnection
Exit Sub

'KillAdo:
'MsgBox "Ой, ошибка вышла. " & Err.Description, vbCritical
'Set GetSourceCommand = Nothing
'Set rs = Notning
'Set Connection = Nothing

'Application.ScreenUpdating = True
End Sub


PS Вар-т старый, но рабочий.
...
Рейтинг: 0 / 0
08.10.2012, 15:34
    #37988449
Вызов хранимой процедуры с помощью VBA
medea_bless
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN
	
	SET NOCOUNT ON;

  
	select *
	from ErrorReports.dbo.ClientsErrors
	where submitter=@Submitter

	select *
	from ErrorReports.dbo.InternalErrors
	where submitter=@Submitter

END




У меня насчет хрп возник вопрос: она 2 набора записей возвращает или все-таки 1?
...
Рейтинг: 0 / 0
08.10.2012, 15:49
    #37988504
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
два
...
Рейтинг: 0 / 0
08.10.2012, 15:57
    #37988526
кладовщик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Shocker.Proдва
А как ч-з АДО в экселе оба набора данных получить?
...
Рейтинг: 0 / 0
08.10.2012, 16:01
    #37988540
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Shocker.ProВаш код требуется оформить в виде процедуры, а не просто так на листе писать

Оформила. "Sub or function not defined". Имя процедуры точно правильное. Нашла, что для работы с ADO нужно подключить MS Office ActiveX Data Object 2.0. & Recordset. Первую нашла, второй не вижу (MS Excel 2010)


комплектовщикона 2 набора записей возвращает или все-таки 1?
на данный момент таблицы объединены в 1 view, к которому обращается процедура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
	select *

	from 	dbo.GetFullSummary
	where submitter=@submitter


END



где GetFullSummary - имя view
...
Рейтинг: 0 / 0
08.10.2012, 16:04
    #37988546
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_blessОформила. "Sub or function not defined". Имя процедуры точно правильное.Еще раз. Это ругается компилятор ВБА и к процедуре на SQL-севрере это не имеет никакого отношения. Вы просто никак не можете разобраться с синтаксисом в ВБА

medea_blessОформила. "Sub or function not defined".Указывайте строку, на которой происходит ошибка
medea_blessНашла, что для работы с ADO нужно подключить MS Office ActiveX Data Object 2.0. & Recordset. Первую нашла, второй не вижу (MS Excel 2010)второе входит в первое, так что достаточно.

Поставьте в САМОМ начале всех модулей (где вы вводите код) строку
Код: vbnet
1.
Option Explicit
...
Рейтинг: 0 / 0
08.10.2012, 17:07
    #37988704
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Весь код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Sub GetReportData()
Dim objMyConn As ADODB.Connection
Dim objMyCommand As ADODB.Command
Dim objMyRecordset As ADODB.Recordset
Dim submitter As Range

Set objMyConn = New ADODB.Connection
Set objMyCommand = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
Set submitter = Sheets("Extended_Report").Cells(1, 1)
        
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=***;Initial Catalog=ErrorReports;User ID=***;Password=***;"
objMyConn.Open

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

Set objMyRecordset.Source = objMyCommand
objMyRecordset.Open

ActiveSheet.Range("A6").CopyFromRecordset objMyRecordset

End Sub



ругается на строку .NamedParameters и уже так: "Method or data member not found"
...
Рейтинг: 0 / 0
08.10.2012, 20:04
    #37989002
портер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
У тебя параметр в ХРП типа ВарЧар, а ты в него объект эксельный запихиваешь типа Рэнж.
Нужно
Код: vbnet
1.
2.
Dim submitter As String
submitter=ThisWorkBook.WorkSheets("Extended_Report").Cells(1, 1).text


И еще запятую вроде перед submitter пропустила
Код: vbnet
1.
CreateParameter ("@submitter", adVarChar, adParamInput, ,submitter)


ЗЫ
Код: vbnet
1.
2.
Set objMyRecordset.Source = objMyCommand
objMyRecordset.Open


Это так записывается MyRecordset.Open objMyCommand?
Можно по-простому
Код: vbnet
1.
2.
3.
4.
...
.Parameters.Append .CreateParameter("@submitter", adVarChar, adParamInput, , submitter)
Set objMyRecordset=.Execute
End With
...
Рейтинг: 0 / 0
09.10.2012, 13:55
    #37990010
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
ошибка осталась та же на той же строке. Увидела, что пропустила точку перед CreateParameter - не помогло.
...
Рейтинг: 0 / 0
09.10.2012, 14:01
    #37990020
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_blessругается на строку .NamedParameters и уже так: "Method or data member not found"Проблема в том, что в
medea_blessНашла, что для работы с ADO нужно подключить MS Office ActiveX Data Object 2.0.Надо подключить не 2.0, а 2. 8
...
Рейтинг: 0 / 0
09.10.2012, 15:36
    #37990273
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
проблема была в строке

Код: vbnet
1.
.Parameters.Append .CreateParameter("@submitter", adVarChar, adParamInput, submitter)



При передаче параметра оказывается нужно передавать длину varchar. Прокомпилировалось без ошибок, только вот на страницу ничего не вывелось.
...
Рейтинг: 0 / 0
09.10.2012, 16:15
    #37990331
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
medea_blessПрокомпилировалось без ошибок, только вот на страницу ничего не вывелось.см. сюда. 13286985 Лучше приведи весь код снова со всеми правками
...
Рейтинг: 0 / 0
09.10.2012, 16:28
    #37990346
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Все оказалось проще и с минимумом кода.

Если кому-то нужно, то " http://datapigtechnologies.com/blog/index.php/running-a-sql-stored-procedure-from-excel-with-dynamic-parameters%22%5D%D0%B2%D0%BE%D1%82]http://datapigtechnologies.com/blog/index.php/running-a-sql-stored-procedure-from-excel-with-dynamic-parameters"]вот решение
...
Рейтинг: 0 / 0
09.10.2012, 16:42
    #37990371
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Существует множество различных способов решения задачи...
...
Рейтинг: 0 / 0
09.10.2012, 17:15
    #37990422
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры с помощью VBA
Согласна, но для тех, у кого опыта работы с VBA чуть меньше, чем нисколько - самое оно. Спасибо, тему можно закрывать
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры с помощью VBA / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]