|
|
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! У меня такая проблема на 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 все проходит успешно. Есть у кого-нибудь идеи по этому поводу? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 09:39 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Включите профайлер и посмотрите, что реально отрабатывает у вас на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 12:58 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
идея убрать строку Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 13:17 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Или вставить обработку ошибок и посмотреть, в чем же она. Разбираться в длинном коде никакого желания нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 14:18 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Смотрела в Profiler, там видно что пошел вызов мой процедуры но на строчке insert into @TempTable... все заканчивается и в эксель никаких данных не передается. Почему она не отрабатывает до конца и не возвращает то, что в последнем select? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2010, 12:21 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Не читал ваш код, но в строчке Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2010, 15:12 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Пользуйся кнопкой "SRC" над текстом сообщения и кнопкой "Предварительный просмотр" под текстом сообщения gulchitai rs.Open "exec dbo.GetSaleByFamily " & DateBegin & ", " & DateEnd, oConn Даты надо брать в кавычки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2010, 23:57 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
White Owl Даты надо брать в кавычки. Нет. Это не тот случай. Там параметры в int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2010, 02:03 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Хранимая процедура делает следующее: 1. Из базы 1с выбираются данные по продажам из регистра накопления "Продажи" за определенный период. 2. Для каждой записи из этой выборки бегу курсором и вместо НоменклатураСсылка подставляю верхние уровни иерархии справочника номенклатура (самый верхний уровень - сегмент, второй уровень - семья) и записываю построчно в таблицу @TempTable, которую объявила раньше. 3. В таблице @TempTable делаю group by по сегменту и семье и записываю в таблицу @1C 4. В таблицу @OLAP записываю данные со второй базы данных (там большой вложенный запрос) 5. Отображаю выборку из двух полученных таблиц @OLAP и @1C Эту выборку я хочу увидеть в excel. Но такое чувство, что до нее просто не доходит и все заканчивается на Код: plaintext При этом когда у меня хранимая состояла просто из одного селекта, в excel все выводилось, код макроса я не меняла, просто усложнила хранимую. При этом на сервере в Query Analyzer хранимая запускается и отрабатывает полностью и выводом того, что нужно, видимо проблема в excel ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 03:51 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
gulchitai Но такое чувство, что до нее просто не доходит и все заканчивается на Код: plaintext сейчас вся процедура отрабатывает полностью, в Profiler все это видно пишет "Completed", может первый раз не до конца посмотрела трассировку. Но упорно в excel ничего не возвращается, а по идеи должно возвращать результат последней выборки select ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 04:59 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
Пробовала вызывать свою процедуру через визуальные средства excel (Данные - Из других источников). Когда было подключение через ole, данные на лист не выводились, когда сделала получить из Microsoft Query по драйверу ODBC - все получилось. Значит, проблема в OLE у кого-нибудь есть пример подключения через ODBC? Писала вот так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 08:25 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
gulchitai у кого-нибудь есть пример подключения через ODBC? Здесь есть все: http://www.connectionstrings.com/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 08:32 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
gulchitaiне подключается :( Но такое чувство, что до нее просто не доходит и все заканчивается на Не подключается это текст сообщения об ошибке? Я вам уже написал: ошибки на клиенте надо обрабатывать. ODBC-драйвер возвращает конкретный номер ошибки и текст сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 11:00 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
перед вызовом rs.MoveFirst неплохо (даже необходимо !!!) проверить сам рекордсет Код: plaintext а так добавьте в код ХП строку Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 12:44 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
HandKotа так добавьте в код ХП строку Код: plaintext Учись пользоваться методом NextResultset и не зависеть от настроек сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 20:47 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
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. спасибо всем огромное за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 07:22 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
White OwlHandKotа так добавьте в код ХП строку Код: plaintext Учись пользоваться методом NextResultset и не зависеть от настроек сессии. http://sql.ru/forum/actualthread.aspx?tid=800872]почему такая нелюбовь к NOCOUNT ? прошу присоединяться ЗЫЖ а пользоватся NextRecordset я умею :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 08:34 |
|
||
|
Вызов хранимой процедуры ms sql в макросе Excel
|
|||
|---|---|---|---|
|
#18+
White OwlHandKotа так добавьте в код ХП строку Код: plaintext Учись пользоваться методом NextResultset и не зависеть от настроек сессии. Смелое неаргументированное заявление. Приведите пример того, как Вы используете системные сообщения из хранимок. В подавляющем большинстве случаев они просто мешают. Цитата из BOL: Для хранимых процедур с несколькими инструкциями, не возвращающих большое количество фактических данных, или для процедур, содержащих циклы Transact-SQL, установка в инструкции SET NOCOUNT параметра ON может значительно повысить производительность за счет существенного снижения объема сетевого трафика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:24 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=36917194&tid=2177530]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 538ms |

| 0 / 0 |
