powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вызов хранимой процедуры ms sql в макросе Excel
18 сообщений из 18, страница 1 из 1
Вызов хранимой процедуры ms sql в макросе Excel
    #36913758
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!
У меня такая проблема на 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
Вызов хранимой процедуры ms sql в макросе Excel
    #36914378
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Включите профайлер и посмотрите, что реально отрабатывает у вас на сервере.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36914444
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
идея убрать строку
Код: plaintext
rs.MoveFirst
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36914665
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или вставить обработку ошибок и посмотреть, в чем же она. Разбираться в длинном коде никакого желания нет.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36915804
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смотрела в Profiler, там видно что пошел вызов мой процедуры но на строчке insert into @TempTable... все заканчивается и в эксель никаких данных не передается. Почему она не отрабатывает до конца и не возвращает то, что в последнем select?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36915908
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не читал ваш код, но в строчке
Код: plaintext
insert into @TempTable
название @TempTable встречается в первый раз. Откуда эта таблица берется?
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36916243
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользуйся кнопкой "SRC" над текстом сообщения и кнопкой "Предварительный просмотр" под текстом сообщения


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

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

Даты надо брать в кавычки.
Нет. Это не тот случай. Там параметры в int.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36917107
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хранимая процедура делает следующее:
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
Вызов хранимой процедуры ms sql в макросе Excel
    #36917124
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gulchitai Но такое чувство, что до нее просто не доходит и все заканчивается на
Код: plaintext
insert into @TempTable
.

сейчас вся процедура отрабатывает полностью, в Profiler все это видно пишет "Completed", может первый раз не до конца посмотрела трассировку.
Но упорно в excel ничего не возвращается, а по идеи должно возвращать результат последней выборки select
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36917187
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовала вызывать свою процедуру через визуальные средства 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
Вызов хранимой процедуры ms sql в макросе Excel
    #36917194
energy75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gulchitai
у кого-нибудь есть пример подключения через ODBC?


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

а так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщения
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36919000
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKotа так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщенияНЕ НАДО! За SET NOCOUNT ON руки оторву и съесть заставлю. Твое счастье что ты не мой подчиненный.
Учись пользоваться методом NextResultset и не зависеть от настроек сессии.
...
Рейтинг: 0 / 0
Вызов хранимой процедуры ms sql в макросе Excel
    #36919419
gulchitai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вызов хранимой процедуры ms sql в макросе Excel
    #36919474
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlHandKotа так добавьте в код ХП строку
Код: plaintext
SET NOCOUNT ON
Без нее у вас всегда первый рекордсет будет пустым (закрытым), т.к там идут системные сообщенияНЕ НАДО! За SET NOCOUNT ON руки оторву и съесть заставлю. Твое счастье что ты не мой подчиненный.
Учись пользоваться методом NextResultset и не зависеть от настроек сессии.

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


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

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

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


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