Проблема передачи параметров в хранимую процедуру из VBA

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
abc
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 09.07.2004 (Пт) 17:31
Откуда: Kiev

Проблема передачи параметров в хранимую процедуру из VBA

Сообщение abc » 17.06.2008 (Вт) 10:44

Помогите решить проблему. У меня есть хранимая процедура с двумя параметрами (параметры имеют значения по умолчанию). Когда я запускаю процедуру из Query Analyzer:
declare @d1 smalldatetime
declare @d2 smalldatetime
SET @d1=GETDATE()
SET @d2=DATEADD(dd,-5,GETDATE())
exec dbo.sp_GoodsPeriod_YK @d1,@d2 она нормально отрабатывает с учетом обоих параметров (выдает данные за все даты в диапазоне между датами - параметрами).
А если запускаю ее из Excel VBA:
Dim cn As New ADODB.Connection
Dim cmd As New ADODB.Command
cn.Open "driver={SQL Server};server=...;uid=...;pwd=...;database=..."
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_GoodsPeriod_YK"
cmd.Parameters("@dd1") = Me.Calendar1.Value
cmd.Parameters("@dd2") = Me.Calendar2.Value
cmd.Execute – выдает данные только за одну дату. Подскажите, в чем может быть засада?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.06.2008 (Вт) 11:01

Код процедуры покажи.
Кроме того, полезно сделать cmd.Parameters.Refresh, чтобы проверить, какие параметры должны быть на самом деле.
Lasciate ogni speranza, voi ch'entrate.

abc
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 09.07.2004 (Пт) 17:31
Откуда: Kiev

Сообщение abc » 17.06.2008 (Вт) 11:21

cmd.Parameters.Refresh пробовал, что есть, что нет - результат тот же.
А процедура очень простая:
CREATE PROCEDURE [dbo].[sp_GoodsPeriod_YK]
@dd1 smalldatetime = GETDATE,
@dd2 smalldatetime = GETDATE
AS
declare @d1 smalldatetime
declare @d2 smalldatetime
IF @dd1>=@dd2 BEGIN
set @d1 = @dd2
set @d2 = @dd1
END
ELSE BEGIN
set @d1 = @dd1
set @d2 = @dd2
END
TRUNCATE TABLE [dbo].tbTempGoods
WHILE @d1<=@d2
BEGIN
INSERT INTO dbo.tbTempGoods
EXEC dbo.sp_GoodsOneDay_YK @d1
SET @d1=DATEADD(dd,1,@d1)
END
GO

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.06.2008 (Вт) 11:42

Как выдаются данные?
Процедура возвращает рекордсет?
Или ты затем извлекаешь содержимое tbTempGoods.
Lasciate ogni speranza, voi ch'entrate.

abc
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 09.07.2004 (Пт) 17:31
Откуда: Kiev

Сообщение abc » 17.06.2008 (Вт) 11:59

tbTempGoods - источник для построения сводной таблицы EXCEL.
Т.е. задача процедуры заполнить таблицу данными за нужный период. Данные расчетные, поэтому не хранятся в готовом виде.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.06.2008 (Вт) 12:07

Тогда перед тем, как вызвать процедуру sp_GoodsOneDay_YK выведи в лог значение @d1.
Lasciate ogni speranza, voi ch'entrate.

abc
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 09.07.2004 (Пт) 17:31
Откуда: Kiev

Сообщение abc » 17.06.2008 (Вт) 16:00

Сделал.
GetDate заполняет параметр примерно так: 2008-06-17 15:54:00
При заполнении параметра из VBA получается: 2008-06-01 00:00:00
Но, обе границы диапазона заполнены. Но, цикл почему-то не идет дальше чем один оборот. Мне выдает результат при вызове процедуры из VBA только на меньшую дату. А при вызове из Аналайзера пробегает по всем датам в диапазоне.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 18.06.2008 (Ср) 6:55

посмотрите профайлером, с какими параметрами вызывается ХП
такое ощущение, что у Вас 1 параметр, заполняется и во второй

пока правда не понятно почему :(
I Have Nine Lives You Have One Only
THINK!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.06.2008 (Ср) 7:58

Попробуй в SP поменять тип данных с smalldatetime на datetime.
Lasciate ogni speranza, voi ch'entrate.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 18.06.2008 (Ср) 9:17

все-таки у Вас проблема вот здесь
Код: Выделить всё
cmd.Parameters("@dd1") = Me.Calendar1.Value
cmd.Parameters("@dd2") = Me.Calendar2.Value


ЗЫЖ проверил Ваш код, только заменил значения на Now
все выдало нормально

попробуйте сделать тожже самое

Код: Выделить всё
cmd.Parameters("@dd1") = Now()-10
cmd.Parameters("@dd2") = Now()

и сообщите результат
I Have Nine Lives You Have One Only
THINK!

abc
Обычный пользователь
Обычный пользователь
 
Сообщения: 85
Зарегистрирован: 09.07.2004 (Пт) 17:31
Откуда: Kiev

Сообщение abc » 18.06.2008 (Ср) 11:26

Попробовал всевозможные варианты. И вывод такой: Дело не в параметрах. Почему-то при вызове процедуры из VBA, процедура не хочет больше одного раза выполнять вложенную процедуру.
Сам цикл выполняется если из него убрать вызов процедуры.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList