Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры ms sql в макросе Excel / 18 сообщений из 18, страница 1 из 1
22.10.2010, 09:39
    #36913758
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Всем доброго времени суток!
У меня такая проблема на ms sql server 2000 крутятся две базы, одна база 1с 8.1 (monetka2) а другая база продаж по кассам (OLAP) не одинэсовская, я в базе OLAP сделала хранимую процедуру, которая берет данные из двух этих баз.
Вот ее код:
ALTER PROCEDURE dbo.GetSaleByFamily
@DateBegin int, --дата начала
@DateEnd int --дата конца
AS
BEGIN
--Временная таблица
declare @TempTable table(
Дата datetime,
Себестоимость numeric(24,2),
Сегмент varchar(100),
Семья varchar(100)
)
--Таблица с данными из 1с
declare @1C table(
Дата datetime,
Сегмент varchar(100),
Семья varchar(100),
Себестоимость numeric(24,2)
)
DECLARE
@d datetime,
@nom binary(16),
@Seb numeric(9,2),
@Segment binary(16),
@Family binary(16),
@tmp binary(16),
@segment_name varchar(100),
@family_name varchar(100)

DECLARE mycursor CURSOR FOR
select
dateadd(dd,0, datediff(dd,0,_Period)) as Дата,
_Fld2888RRef as НомСсылка,
_Fld2895 as СебестоимостьРуб
from monetka2.dbo._AccumReg2887
where dateadd(dd,0, datediff(dd,0,_Period))>=Str(@DateBegin) and dateadd(dd,0, datediff(dd,0,_Period))<=Str(@DateEnd)

OPEN mycursor
FETCH NEXT FROM mycursor
INTO @d, @nom, @seb

WHILE @@FETCH_STATUS = 0
BEGIN
select @segment=_ParentIDRRef from monetka2.dbo._Reference56 where _IDRRef=@nom
while 1=1
BEGIN
SET @Family=@Segment
select @segment=_ParentIDRRef from monetka2.dbo._Reference56 where _IDRRef=@family
select @tmp=_ParentIDRRef from monetka2.dbo._Reference56 where _IDRRef=@segment
if (@tmp=0) break
END
select @segment_name=_Description from monetka2.dbo._Reference56 where _IDRRef=@segment
select @family_name=_Description from monetka2.dbo._Reference56 where _IDRRef=@Family
insert into @TempTable(Дата,Себестоимость,Сегмент,Семья) VALUES(@d,@seb,@segment_name,@family_name)
FETCH NEXT FROM mycursor
INTO @d, @nom, @seb
END
CLOSE mycursor
DEALLOCATE mycursor

insert into @1C(Дата,Сегмент,Семья,Себестоимость)
select
Дата,
Сегмент,
Семья,
sum(Себестоимость) as Себестоимость
from @TempTable
group by
Дата,
Сегмент,
Семья
order by
Дата,
Сегмент,
Семья
--------------------------------------------------------------
--Таблица с данными из ОЛАПа
declare @OLAP table(
Дата datetime,
Сегмент varchar(100),
Семья varchar(100),
ДеньНедели int,
Сумма numeric(24,2),
[Сумма чеков] numeric(24,2),
Покупок int,
Покупателей int,
Количество numeric(24,2)
)

insert into @OLAP(Дата,Сегмент,Семья,ДеньНедели,Сумма,[Сумма чеков],Покупок,Покупателей,Количество)
select
cast((substring(str(dateid),9,2)+'.'+substring(str(dateid),7,2)+'.'+substring(str(dateid),3,4)) as datetime) as Дата,
gg3.name as Сегмент,
f as Семья,
dayofweekid as ДеньНедели,
sum(cast(summa as numeric(24,2))) as Сумма,
sum(cast(SummaCheque as numeric(24,2))) as [Сумма чеков],
count(chequeId) as Покупок,
count(DISTINCT chequeId) as Покупателей,
sum(cast(quantity as numeric(24,2))) as Количество
from
(select
segment,
gg2.name as f,
DateID,
DayOfWeekId,
q.summa,
q.SummaCheque,
q.chequeId,
q.quantity
from olap.dbo.GoodsGroup gg2 inner join
(select
ch.GoodsId,
ch.Summa,
ch.SummaCheque,
ch.dateid,
ch.dayOfWeekID,
ch.shopindex,
ch.chequeID,
ch.quantity,
g.name,
gg.branch,
family =
case
when CHARINDEX(',', gg.branch, CHARINDEX(',', gg.branch, 0)+1)>0 then
substring(gg.branch,CHARINDEX(',', gg.branch, 0)+1,CHARINDEX(',',gg.branch,CHARINDEX(',', gg.branch, 0)+1)-1 - CHARINDEX(',', gg.branch, 0))
when CHARINDEX(',', gg.branch, CHARINDEX(',', gg.branch, 0)+1)=0 then
substring(gg.branch,CHARINDEX(',', gg.branch, 0)+1,len(gg.branch))
end,
segment =
case
when CHARINDEX(',', gg.branch, 1)>0 then
substring(gg.branch,1,CHARINDEX(',', gg.branch, 0)-1)
when CHARINDEX(',', gg.branch, 1)=0 then
substring(gg.branch,1,len(gg.branch))
end
from olap.dbo.V_ChequePos ch, olap.dbo.goods g, olap.dbo.goodsGroup gg
where DateId>=@DateBegin and DateID<=@DateEnd and operationid=1 and ch.GoodsId=g.id and gg.id=-1*g.groupID) q
on gg2.code=q.family) q2, olap.dbo.goodsGroup gg3 where gg3.code=q2.segment
group by
DateID,
gg3.name,
f,
dayofweekid
order by
dateid,
gg3.name,
f
-----------------------------------------------------------------------
select
o.Дата,
o.Сегмент,
o.Семья,
o.ДеньНедели,
o.Сумма,
o.[Сумма чеков],
o.Покупок,
o.Покупателей,
o.Количество,
c.Себестоимость
from @OLAP o, @1C c
where o.Дата=c.Дата and o.Сегмент=c.Сегмент and o.Семья=c.Семья

END

На выходе получается таблица, которую я хочу вставить в Excel 2007. Пишу макрос, вот кусок кода:
.............................
sConn = "Provider=SQLOLEDB.1;User ID=sa;Password=111;Data Source=" + Array_M(iMonetka) + ";Initial Catalog=OLAP"
Set oConn = CreateObject("ADODB.Connection")
On Error GoTo CnErrorHandler
oConn.Open sConn
CnErrorHandler:
If oConn.Errors.Count > 0 Then
Exit For
End If

Dim rs
Set rs = CreateObject("ADODB.RecordSet")
rs.Open "exec dbo.GetSaleByFamily " & DateBegin & ", " & DateEnd, oConn
rs.MoveFirst
.......................
Вылетает на моменте rs.MoveFirst, синтаксис в макросе должен быть верным, потому что этот когда хранимая процедура с этими же параметрами брала данные из одной базы простым селектом, все работало, а после усложнения процедуры в экселе она работать перестала, хотя в Query Analyzer все проходит успешно.
Есть у кого-нибудь идеи по этому поводу? :)
...
Рейтинг: 0 / 0
22.10.2010, 12:58
    #36914378
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Включите профайлер и посмотрите, что реально отрабатывает у вас на сервере.
...
Рейтинг: 0 / 0
22.10.2010, 13:17
    #36914444
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
идея убрать строку
Код: plaintext
rs.MoveFirst
...
Рейтинг: 0 / 0
22.10.2010, 14:18
    #36914665
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Или вставить обработку ошибок и посмотреть, в чем же она. Разбираться в длинном коде никакого желания нет.
...
Рейтинг: 0 / 0
23.10.2010, 12:21
    #36915804
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Смотрела в Profiler, там видно что пошел вызов мой процедуры но на строчке insert into @TempTable... все заканчивается и в эксель никаких данных не передается. Почему она не отрабатывает до конца и не возвращает то, что в последнем select?
...
Рейтинг: 0 / 0
23.10.2010, 15:12
    #36915908
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Не читал ваш код, но в строчке
Код: plaintext
insert into @TempTable
название @TempTable встречается в первый раз. Откуда эта таблица берется?
...
Рейтинг: 0 / 0
23.10.2010, 23:57
    #36916243
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Пользуйся кнопкой "SRC" над текстом сообщения и кнопкой "Предварительный просмотр" под текстом сообщения


gulchitai
rs.Open "exec dbo.GetSaleByFamily " & DateBegin & ", " & DateEnd, oConn

Даты надо брать в кавычки.
...
Рейтинг: 0 / 0
24.10.2010, 02:03
    #36916354
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
White Owl

Даты надо брать в кавычки.
Нет. Это не тот случай. Там параметры в int.
...
Рейтинг: 0 / 0
25.10.2010, 03:51
    #36917107
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Хранимая процедура делает следующее:
1. Из базы 1с выбираются данные по продажам из регистра накопления "Продажи" за определенный период.
2. Для каждой записи из этой выборки бегу курсором и вместо НоменклатураСсылка подставляю верхние уровни иерархии справочника номенклатура (самый верхний уровень - сегмент, второй уровень - семья) и записываю построчно в таблицу @TempTable, которую объявила раньше.
3. В таблице @TempTable делаю group by по сегменту и семье и записываю в таблицу @1C
4. В таблицу @OLAP записываю данные со второй базы данных (там большой вложенный запрос)
5. Отображаю выборку из двух полученных таблиц @OLAP и @1C

Эту выборку я хочу увидеть в excel. Но такое чувство, что до нее просто не доходит и все заканчивается на
Код: plaintext
insert into @TempTable
.
При этом когда у меня хранимая состояла просто из одного селекта, в excel все выводилось, код макроса я не меняла, просто усложнила хранимую.
При этом на сервере в Query Analyzer хранимая запускается и отрабатывает полностью и выводом того, что нужно, видимо проблема в excel
...
Рейтинг: 0 / 0
25.10.2010, 04:59
    #36917124
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
gulchitai Но такое чувство, что до нее просто не доходит и все заканчивается на
Код: plaintext
insert into @TempTable
.

сейчас вся процедура отрабатывает полностью, в Profiler все это видно пишет "Completed", может первый раз не до конца посмотрела трассировку.
Но упорно в excel ничего не возвращается, а по идеи должно возвращать результат последней выборки select
...
Рейтинг: 0 / 0
25.10.2010, 08:25
    #36917187
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
Пробовала вызывать свою процедуру через визуальные средства excel (Данные - Из других источников). Когда было подключение через ole, данные на лист не выводились, когда сделала получить из Microsoft Query по драйверу ODBC - все получилось. Значит, проблема в OLE
у кого-нибудь есть пример подключения через ODBC?
Писала вот так:
Код: plaintext
sConn = "DRIVER={SQL Server};SERVER=10.0.0.1;DATABASE=olap;UID=sa;PWD=111l;"
не подключается :(
...
Рейтинг: 0 / 0
25.10.2010, 08:32
    #36917194
energy75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
gulchitai
у кого-нибудь есть пример подключения через ODBC?


Здесь есть все: http://www.connectionstrings.com/
...
Рейтинг: 0 / 0
25.10.2010, 11:00
    #36917401
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
gulchitaiне подключается :(
Но такое чувство, что до нее просто не доходит и все заканчивается на
Не подключается это текст сообщения об ошибке? Я вам уже написал: ошибки на клиенте надо обрабатывать. ODBC-драйвер возвращает конкретный номер ошибки и текст сообщения.
...
Рейтинг: 0 / 0
25.10.2010, 12:44
    #36917709
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
перед вызовом rs.MoveFirst
неплохо (даже необходимо !!!) проверить сам рекордсет
Код: plaintext
If not (rs.EOF and rs.BOF) then

а так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщения
...
Рейтинг: 0 / 0
25.10.2010, 20:47
    #36919000
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
HandKotа так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщенияНЕ НАДО! За SET NOCOUNT ON руки оторву и съесть заставлю. Твое счастье что ты не мой подчиненный.
Учись пользоваться методом NextResultset и не зависеть от настроек сессии.
...
Рейтинг: 0 / 0
26.10.2010, 07:22
    #36919419
gulchitai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
F
Не подключается это текст сообщения об ошибке? Я вам уже написал: ошибки на клиенте надо обрабатывать. ODBC-драйвер возвращает конкретный номер ошибки и текст сообщения.
Нашла в чем "ошибка", оказывается это нормально

For SQL Server, the "Changed database context" NativeError code is 5701, and the "Changed language setting" NativeError code is 5703. These messages are normal and will always be returned through DBLib or the ODBC driver.

Убрала обработку ошибок и все заработало, данные вывелись в excel. спасибо всем огромное за помощь!
...
Рейтинг: 0 / 0
26.10.2010, 08:34
    #36919474
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой процедуры ms sql в макросе Excel
White OwlHandKotа так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщенияНЕ НАДО! За SET NOCOUNT ON руки оторву и съесть заставлю. Твое счастье что ты не мой подчиненный.
Учись пользоваться методом NextResultset и не зависеть от настроек сессии.

http://sql.ru/forum/actualthread.aspx?tid=800872]почему такая нелюбовь к NOCOUNT ?
прошу присоединяться


ЗЫЖ а пользоватся NextRecordset я умею :-)
...
Рейтинг: 0 / 0
26.10.2010, 09:24
    #36919550
Вызов хранимой процедуры ms sql в макросе Excel
White OwlHandKotа так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщенияНЕ НАДО! За SET NOCOUNT ON руки оторву и съесть заставлю. Твое счастье что ты не мой подчиненный.
Учись пользоваться методом NextResultset и не зависеть от настроек сессии.

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

Цитата из BOL:
Для хранимых процедур с несколькими инструкциями, не возвращающих большое количество фактических данных, или для процедур, содержащих циклы Transact-SQL, установка в инструкции SET NOCOUNT параметра ON может значительно повысить производительность за счет существенного снижения объема сетевого трафика.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры ms sql в макросе Excel / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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