Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Помогите.
При запуске процедуры из QA отрабатывает без ошибок
при вызове с клиента под тем же логином
втыкает здесь
exec master..sp_executesql @cmd

и нельзя вернуть об ошибке.

не пойму в чём дело.
Настройки подключения?
Но какие и почему влияют?

Что это может быть? Кто нибудь сталкивался?

---------
---------..........

set @cmd = 
'insert into OPENDATASOURCE('+char(39)+'Microsoft.Jet.OLEDB.4.0'+char(39)+',
'+char(39)+'Data Source=c:\template.xls;Extended Properties=Excel 8.0'+char(39)+')...[Лист1$]
('
+
+ case when @s_nskuba = 1 then ' nskuba, ' else '' end 
+ ' nomer_card, ' 
+ ' kol, ' 
+ case when @s_cena_pok = 1 then ' cena_pok, ' else '' end 
+ case when @s_cena_baz = 1 then ' cena_baz, ' else '' end
+ ' proizvod, '
+ case when @s_kodomega = 1 then ' kodomega, ' else '' end
+ case when @s_kod_stroki = 1 then ' kod_stroki, ' else '' end
+ case when @s_kod_stroki = 1 then ' cena_pok_rur, ' else '' end
+ ' zap_name, '
+ case when @s_rez_id = 1 and @rez_id is not null then ' rez_id ' else '' end
+ case when @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null then ' otgr_id ' else '' end
+
')
select * from ##TT'
--print @cmd

insert into tb_chek_point (ts, value) values (getdate(), @cmd )
exec master..sp_executesql @cmd
insert into tb_chek_point (ts, value) values (getdate(), 'Done!' )
14 окт 05, 18:00    [1971351]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Расшифруйте ваше "втыкает здесь"
15 окт 05, 13:22    [1972443]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Расшифруйте ваше "втыкает здесь"

в таблице для трассировки

insert into tb_chek_point (ts, value) values (getdate(), @cmd )
есть отметка

а после
exec master..sp_executesql @cmd
insert into tb_chek_point (ts, value) values (getdate(), 'Done!' )
нет ничего.

Сервер другая машина.
Пробую со своей из QA всё нормально
из клиента .mdb не работает

Учётная запись пользователя одна и та же. для соединения в QA и в кленте.
15 окт 05, 13:48    [1972475]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
insert into tb_chek_point (ts, value) values (getdate(), @cmd )
есть отметка

а после
exec master..sp_executesql @cmd
insert into tb_chek_point (ts, value) values (getdate(), 'Done!' )
нет ничего.

И что это означает ? Что коннект зависает ?
А вы в курсе, что ошибки при обращении к linked server-ам "рубят" выполнение текущего бэтча и возвращают управление клиенту ?
Поэтому такие ошибки на стороне сервере невозможно обработать, только на клиенте
15 окт 05, 13:52    [1972484]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory

А вы в курсе, что ошибки при обращении к linked server-ам "рубят" выполнение текущего бэтча и возвращают управление клиенту ?

Да я в курсе. Здесь то же самое
Glory

Поэтому такие ошибки на стороне сервере невозможно обработать, только на клиенте

Как узнать что за ошибка? Как вернуть код?
15 окт 05, 14:20    [1972505]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory

Поэтому такие ошибки на стороне сервере невозможно обработать, только на клиенте

Как узнать что за ошибка? Как вернуть код?

Чтол значит как ? Сервер возвращает ошибку клиенту автоматически - значит клиент и должен вам отобразить сообщение об ошибке
15 окт 05, 14:24    [1972508]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Andrey K
Glory

Поэтому такие ошибки на стороне сервере невозможно обработать, только на клиенте

Как узнать что за ошибка? Как вернуть код?

Чтол значит как ? Сервер возвращает ошибку клиенту автоматически - значит клиент и должен вам отобразить сообщение об ошибке

OLE DB provider 'Microsoft.Jet.OLEDB.4.0' reported an error.
[OLE/DB provider returned message: Unspecified error
Куда дальше копать?
15 окт 05, 14:27    [1972510]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Да чёрт с ним.
Я сейчас через курсор в Excel данные загоняю.
Вопрос можно впринципе считать снятым.

И всё же какая может быть причина?
15 окт 05, 14:31    [1972515]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Если "При запуске процедуры из QA отрабатывает без ошибок"
а "при вызове с клиента под тем же логином втыкает"
то наверное дело в том
- что другой клиент отсылает серверу на выполнение
- с какими правами другой клиент соединяется с сервером
15 окт 05, 14:48    [1972528]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Если "При запуске процедуры из QA отрабатывает без ошибок"
а "при вызове с клиента под тем же логином втыкает"
то наверное дело в том
- что другой клиент отсылает серверу на выполнение
- с какими правами другой клиент соединяется с сервером

не совсем вас понял.
в каком смысле "другой клиент"?

клиент открывает ADODB соединение под тем же логином, под которым я открываю сессию в QA (авторизация SQL сервера, не Windows) и в нём запускает хп.
15 окт 05, 15:10    [1972543]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory
Если "При запуске процедуры из QA отрабатывает без ошибок"
а "при вызове с клиента под тем же логином втыкает"
то наверное дело в том
- что другой клиент отсылает серверу на выполнение
- с какими правами другой клиент соединяется с сервером

не совсем вас понял.
в каком смысле "другой клиент"?

клиент открывает ADODB соединение под тем же логином, под которым я открываю сессию в QA (авторизация SQL сервера, не Windows) и в нём запускает хп.

- Другой - это тот, который не QA.
- И что ADODB отсылает серверу на выполнение ?
15 окт 05, 15:11    [1972545]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory

- Другой - это тот, который не QA.
- И что ADODB отсылает серверу на выполнение ?

....
StrSQl = "exec usp_Name"
InConn.Execute StrSQl
....

таким образом.
InConn. открывается строкой соединения с логином как и QA.
15 окт 05, 15:31    [1972555]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory

- Другой - это тот, который не QA.
- И что ADODB отсылает серверу на выполнение ?

....
StrSQl = "exec usp_Name"
InConn.Execute StrSQl
....

таким образом.
InConn. открывается строкой соединения с логином как и QA.

:). Это то, что вы _написали_ в своем коде. А что было _отослано_ на сервер ?

Это я к тому, что если из одного приложения все работает, а из второго не работает, то проблема скорее всего не серверная.
15 окт 05, 15:43    [1972565]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory

А что было _отослано_ на сервер ?

Если имеются ввиду входные парамеры то передаётся тоже самое что и в QA.

Glory

Это я к тому, что если из одного приложения все работает, а из второго не работает, то проблема скорее всего не серверная.

Логично. Только от этого не легче. :) я не первый кто столкнулся с аналогичной ситуацией.

Могу привести полный текст процедур, если интересует. Первый вариант который через QA работает а через клиента не хочет. И второй, который пришлось написать, заполнение excel с использованием курсора, который работает.
15 окт 05, 17:00    [1972640]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory

А что было _отослано_ на сервер ?

Если имеются ввиду входные парамеры то передаётся тоже самое что и в QA.

Имеются ввиду, команды действительно выполняются на сервере и которые видны в утилите Profiler.
Причем под командами понимается все, что клиентское приложение отослало серверу, начиная с процесса установки коннекта
15 окт 05, 17:35    [1972661]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory

Это я к тому, что если из одного приложения все работает, а из второго не работает, то проблема скорее всего не серверная.

Логично. Только от этого не легче. :) я не первый кто столкнулся с аналогичной ситуацией.

Могу привести полный текст процедур, если интересует. Первый вариант который через QA работает а через клиента не хочет. И второй, который пришлось написать, заполнение excel с использованием курсора, который работает.

Не совсем понятно - использование той же OPENDATASOURCE но в курсоре работает без ошибок что ли ?
15 окт 05, 17:40    [1972666]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory

Не совсем понятно - использование той же OPENDATASOURCE но в курсоре работает без ошибок что ли ?

В курсоре без ошибок.

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

Первая идея была исполозовать OPENDATASOURCE. Строк в документах относительно немного поэтому думаю через курсор тоже покатит.

CREATE PROCEDURE usp_Mail_RO1
(@rez_id int,
@otgr_id int)
 AS

begin

declare 
@firm_id int,
@firm_name varchar(150),
@user_name varchar(150),
@mail_to varchar(150),
@tmp varchar(200)

if @rez_id is not null and @otgr_id is null
begin
select @firm_id = kontragent, @user_name = user_name from doc_rezerv where id_doc = @rez_id
end


if @otgr_id is not null and @rez_id is null
begin
select @firm_id = kontragent from doc_rezerv where id_doc in (select top 1 rez_id from at_sborka where n = @otgr_id) 
select @user_name = name from sysusers where uid in (select top 1 u_id from at_sborka where n = @otgr_id) 
end


if (@otgr_id is not null and @rez_id is not null) or (@otgr_id is null and @rez_id is null)
begin
return
end

declare
@s_nskuba bit,
@s_cena_pok bit,
@s_cena_pok_rur bit,
@s_cena_baz bit,
@s_kod_stroki bit,
@s_kodomega bit,
@s_rez_id bit,
@s_otgr_id bit,
@do_send bit

select
@s_nskuba = s_nskuba,
@s_cena_pok = s_cena_pok,
@s_cena_pok_rur = s_cena_pok_rur,
@s_cena_baz = s_cena_baz,
@s_kod_stroki = s_kod_stroki,
@s_kodomega = s_kodomega,
@s_rez_id = s_rez_id,
@s_otgr_id = s_otgr_id,
@do_send = do_send,
@firm_name = name,
@mail_to = email
from spr_firm where spr_firm.firm_id = @firm_id 

--- TEST MODE
set @s_nskuba = 1
set @s_cena_pok = 1
set @s_cena_pok_rur = 1
set @s_cena_baz = 1
set @s_kod_stroki = 1
set @s_kodomega = 1
set @s_rez_id = 1
set @s_otgr_id = 1
set @do_send = 1
set @mail_to = 'mail@mail.com'

if @do_send = 0 or @mail_to is null return

if @s_nskuba = 0 and @s_cena_pok = 0 and @s_cena_pok_rur=0 and @s_cena_baz=0 and @s_kod_stroki=0 and @s_kodomega=0 and @s_rez_id=0 and @s_otgr_id = 0
begin
return
end

DECLARE 
@WordObject int, 
@RetCode int, 
@Document int, 
@Filename varchar(255), 
@cmd nvarchar(4000),
@Counter int

set @counter = 1
SELECT @Filename = 'C:\template.xls'

set @cmd = 'del /f /q ' + @Filename  
EXEC master..xp_cmdshell @cmd
insert into tb_test (ts, value) values (getdate(), @cmd)

DECLARE @desc varchar(255) -- text desctiption of the error
Declare @ObjProp varchar(100) -- holds the full description of the property

EXEC @RetCode = sp_OACreate 'Excel.Application', @WordObject OUTPUT, 4
print @retcode
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler

EXEC @RetCode = sp_OAMethod @WordObject, 'Workbooks.Add', @Document OUTPUT
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler
BEGIN

	if @s_nskuba = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1,' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'nskuba'
	set @counter = @counter + 1 
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'nomer_card'
	set @counter = @counter + 1

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kol'
	set @counter = @counter + 1

	if @s_cena_pok = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_pok'
	set @counter = @counter + 1
	end

	if @s_cena_baz = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_baz'
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'proizvod'
	set @counter = @counter + 1

	if @s_kodomega = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kodomega'
	set @counter = @counter + 1
	end

	if @s_kod_stroki = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kod_stroki'
	set @counter = @counter + 1
	end

	if @s_cena_pok_rur = 1 
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_pok_rur'
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'zap_name'
	set @counter = @counter + 1

	if @s_rez_id = 1 and @rez_id is not null
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'rez_id'
	set @counter = @counter + 1
	end

	if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'otgr_id'
	set @counter = @counter + 1
	end

END 

EXEC @RetCode = sp_OAMethod @WordObject,'Application.ActiveWorkbook.SaveAs',Null, @Filename
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler
EXEC @RetCode = sp_OAMethod @WordObject, 'Quit'

GOTO Done

OLE_Error_Handler:
EXEC sp_oageterrorinfo @WordObject, @RetCode out, @desc out
select @retCode, @desc
EXEC @RetCode = sp_OAMethod @WordObject, 'Quit'
EXEC sp_OADestroy @WordObject
insert into tb_test (ts, value) values (getdate(), 'OLE_Error_Handler')
--GOTO Done

Done:

--/*
declare
@file_folder varchar(150)

set @cmd = 'SELECT '
+ case when @s_nskuba = 1 then ' workbase..spr_zap.nskuba, ' else '' end 
+ ' workbase..doc_rezerv_sostav.nomer_card, ' 
+ ' workbase..doc_rezerv_sostav.kol, ' 
+ case when @s_cena_pok = 1 then ' workbase..doc_rezerv_sostav.cena as cena_pok, ' else '' end 
+ case when @s_cena_baz = 1 then ' workbase..zap_na_sklade.cena_baz, ' else '' end
+ ' workbase..zap_na_sklade.proizvod, '
+ case when @s_kodomega = 1 then ' workbase..spr_zap.my_number as kodomega, ' else '' end
+ case when @s_kod_stroki = 1 then ' workbase..doc_rezerv_sostav.id_sostav as kod_stroki, ' else '' end
+ case when @s_cena_pok_rur = 1 then ' workbase..doc_rezerv_sostav.cena_val as cena_pok_rur, ' else '' end
+ ' isnull(workbase..spr_zap.zap_name,'+char(39)+char(39)+') +'+char(39)+' '+char(39)+'+ isnull(workbase..spr_zap.opisanie,'+char(39)+char(39)+') as zap_name, '
+ case when @s_rez_id = 1 and @rez_id is not null then ' workbase..doc_rezerv_sostav.id_doc as rez_id ' else '' end
+ case when @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null 
then cast(@otgr_id as varchar(15)) + ' as otgr_id ' else '' end

+ case when @s_rez_id = 1 and @rez_id is not null then ' into ##TT 
from workbase..doc_rezerv_sostav inner join workbase..spr_zap 
 on workbase..doc_rezerv_sostav.id_zap = workbase..spr_zap.zap_id 
inner join workbase..zap_na_sklade 
on workbase..zap_na_sklade.id = workbase..doc_rezerv_sostav.id_nasklade
 where workbase..doc_rezerv_sostav.id_doc = ' + cast(@rez_id as varchar(15)) else '' end

+ case when @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null then ' into ##TT from 
workbase..doc_rezerv_sostav inner join workbase..spr_zap 
 on workbase..doc_rezerv_sostav.id_zap = workbase..spr_zap.zap_id 

inner join workbase..zap_na_sklade 
on workbase..zap_na_sklade.id = workbase..doc_rezerv_sostav.id_nasklade
 where workbase..doc_rezerv_sostav.id_doc in 
(select workbase..at_sborka.rez_id from workbase..at_sborka where workbase..at_sborka.n = ' 
+ cast(@otgr_id as varchar(15)) + ')' else '' end

IF OBJECT_ID('tempdb..##TT') IS NOT NULL drop table ##TT
exec master..sp_executesql @cmd

select @tmp = cast(count(*) as varchar(15)) from ##TT
insert into tb_test (ts, value) values (getdate(), 'Count ##TT -' + @tmp)

set @cmd = 
'insert into OPENDATASOURCE('+char(39)+'Microsoft.Jet.OLEDB.4.0'+char(39)+',
'+char(39)+'Data Source=c:\template.xls;Extended Properties=Excel 8.0'+char(39)+')...[Лист1$]
('
+
+ case when @s_nskuba = 1 then ' nskuba, ' else '' end 
+ ' nomer_card, ' 
+ ' kol, ' 
+ case when @s_cena_pok = 1 then ' cena_pok, ' else '' end 
+ case when @s_cena_baz = 1 then ' cena_baz, ' else '' end
+ ' proizvod, '
+ case when @s_kodomega = 1 then ' kodomega, ' else '' end
+ case when @s_kod_stroki = 1 then ' kod_stroki, ' else '' end
+ case when @s_kod_stroki = 1 then ' cena_pok_rur, ' else '' end
+ ' zap_name, '
+ case when @s_rez_id = 1 and @rez_id is not null then ' rez_id ' else '' end
+ case when @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null then ' otgr_id ' else '' end
+
')
select * from ##TT'
--print @cmd

exec master..sp_executesql @cmd

--SELECT * 
--FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
--'Excel 8.0;Database=C:\template.xls', 'SELECT * FROM [Лист1$]')

select @file_folder = key_value from tb_DB_Const where key_name = 'SMTP_LOCAL_FOLDER'

if @s_rez_id = 1 and @rez_id is not null
begin
set @Filename = @file_folder + 'rez_' + cast(@rez_id as varchar(150)) + '.xls'
end

if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
begin
set @Filename = @file_folder + 'otgr_' + cast(@otgr_id as varchar(150)) + '.xls'
end

set @cmd='copy c:\template.xls ' + @filename + ' /y'

EXEC master..xp_cmdshell @cmd

insert into tb_test (ts, value) values (getdate(), @cmd)

--set @cmd =
--'SELECT * into ##Tmp 
--FROM OPENROWSET('+char(39)+'Microsoft.Jet.OLEDB.4.0'+char(39)+',
--'+char(39)+'Excel 8.0;Database=C:\template.xls'+char(39)+', '+char(39)+'SELECT * FROM [Лист1$]'+char(39)+')'
--print @cmd
--IF OBJECT_ID('tempdb..##Tmp') IS NOT NULL drop table ##Tmp
--EXEC master..xp_cmdshell @cmd
--select * from ##Tmp


-->>>>>>>>>>>>>>>
declare 
@body varchar(8000),
@id int,
@vid varchar(150)

if @s_rez_id = 1 and @rez_id is not null
begin
set @Filename = 'rez_' + cast(@rez_id as varchar(150)) + '.xls'
set @vid = 'Резерв'
set @id = @rez_id
end

if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
begin
set @Filename = 'otgr_' + cast(@otgr_id as varchar(150)) + '.xls'
set @vid = 'Отгрузка'
set @id = @otgr_id
end

set @body = ' <html><body><font size = "1" face="Verdana" >
<font size=1 face="Verdana"><font color="008800"><b>Документ № ' + cast(@id as varchar(50))  + '</b></font>  Клиент: "' + isnull(@firm_name, '???')+  '" <b>'
 + isnull(cast(@firm_id as varchar(15)),'0') + '</b> Пользователь: <b>' + @User_name  + '<font color="cccccc">      
     ' + cast(getdate() as varchar(50)) +  '</font></b><br><br>
'
+ @vid + ' № ' + cast(@id as varchar(50)) +
'
</body></html>' 

insert into tb_mail_thread (subject, body, mail_from, mail_to, type, attachments)
values
(
'Расходный документ (' + @vid + ') № - ' + cast(@id as varchar(15)),
@body,
@User_name + ' <mail@mail.com>',
@mail_to,
2,
@Filename
)
-->>>>>>>>>>>>>>>

exec usp_Mail_Send



end
GO


Вторая

CREATE PROCEDURE usp_Mail_RO3
(@rez_id int,
@otgr_id int)
 AS

begin

declare 
@firm_id int,
@firm_name varchar(150),
@user_name varchar(150),
@mail_to varchar(150),
@tmp varchar(200)

if @rez_id is not null and @otgr_id is null
begin
select @firm_id = kontragent, @user_name = user_name from doc_rezerv where id_doc = @rez_id
end


if @otgr_id is not null and @rez_id is null
begin
select @firm_id = kontragent from doc_rezerv where id_doc in (select top 1 rez_id from at_sborka where n = @otgr_id) 
select @user_name = name from sysusers where uid in (select top 1 u_id from at_sborka where n = @otgr_id) 
end

if (@otgr_id is not null and @rez_id is not null) or (@otgr_id is null and @rez_id is null)
begin
return
end

declare
@s_nskuba bit,
@s_cena_pok bit,
@s_cena_pok_rur bit,
@s_cena_baz bit,
@s_kod_stroki bit,
@s_kodomega bit,
@s_rez_id bit,
@s_otgr_id bit,
@do_send bit

select
@s_nskuba = s_nskuba,
@s_cena_pok = s_cena_pok,
@s_cena_pok_rur = s_cena_pok_rur,
@s_cena_baz = s_cena_baz,
@s_kod_stroki = s_kod_stroki,
@s_kodomega = s_kodomega,
@s_rez_id = s_rez_id,
@s_otgr_id = s_otgr_id,
@do_send = do_send,
@firm_name = name,
@mail_to = email
from spr_firm where spr_firm.firm_id = @firm_id 

--- TEST MODE
--%af_src_comm_0

if @do_send = 0 or @mail_to is null return

if @s_nskuba = 0 and @s_cena_pok = 0 and @s_cena_pok_rur=0 and @s_cena_baz=0 and @s_kod_stroki=0 and @s_kodomega=0 and @s_rez_id=0 and @s_otgr_id = 0
begin
return
end


--=======================================

declare
@nskuba varchar(50),
@nomer_card varchar(50),
@kol varchar(50),
@cena_pok varchar(50),
@cena_baz varchar(50),
@proizvod varchar(50),
@kodomega varchar(50),
@kod_stroki varchar(50),
@cena_pok_rur varchar(50),
@zap_name varchar(150),
@rez_id1 varchar(50),
@Counter2 int

if (@s_rez_id = 1 and @rez_id is not null) or (@s_otgr_id = 1 and @rez_id is null and @otgr_id is not null)
begin
SELECT spr_zap.nskuba, 
doc_rezerv_sostav.nomer_card, 
doc_rezerv_sostav.kol, 
doc_rezerv_sostav.cena as cena_pok, 
--zap_na_sklade.cena_baz, 
doc_rezerv_sostav.cena_baza as cena_baz, 
zap_na_sklade.proizvod, 
spr_zap.my_number as kodomega, 
doc_rezerv_sostav.id_sostav as kod_stroki,
doc_rezerv_sostav.cena_val as cena_pok_rur, 
isnull(workbase..spr_zap.zap_name,'') + ' ' +  isnull(workbase..spr_zap.opisanie,'') as zap_name, 
doc_rezerv_sostav.id_doc as rez_id, 
cast(@otgr_id as varchar(15))  as otgr_id 
into #Tmp 
from doc_rezerv_sostav inner join spr_zap 
on doc_rezerv_sostav.id_zap = spr_zap.zap_id 
inner join zap_na_sklade 
on zap_na_sklade.id = doc_rezerv_sostav.id_nasklade
where 
(doc_rezerv_sostav.id_doc = cast(@rez_id as varchar(15)) and @otgr_id is null)
or
(
doc_rezerv_sostav.id_doc in (select at_sborka.rez_id from workbase..at_sborka where workbase..at_sborka.n =  cast(@otgr_id as varchar(15))) and @rez_id is null
) 
end
else
begin
return
end

--=======================================

DECLARE 
@WordObject int, 
@RetCode int, 
@Document int, 
@Filename varchar(255), 
@cmd nvarchar(4000),
@Counter int

set @counter = 1

DECLARE @desc varchar(255) -- text desctiption of the error
Declare @ObjProp varchar(100) -- holds the full description of the property

EXEC @RetCode = sp_OACreate 'Excel.Application', @WordObject OUTPUT, 4
print @retcode
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler

EXEC @RetCode = sp_OAMethod @WordObject, 'Workbooks.Add', @Document OUTPUT
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler
BEGIN

	if @s_nskuba = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1,' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'nskuba'
	set @counter = @counter + 1 
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'nomer_card'
	set @counter = @counter + 1

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kol'
	set @counter = @counter + 1

	if @s_cena_pok = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_pok'
	set @counter = @counter + 1
	end

	if @s_cena_baz = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_baz'
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'proizvod'
	set @counter = @counter + 1

	if @s_kodomega = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kodomega'
	set @counter = @counter + 1
	end

	if @s_kod_stroki = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'kod_stroki'
	set @counter = @counter + 1
	end

	if @s_cena_pok_rur = 1 
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'cena_pok_rur'
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'zap_name'
	set @counter = @counter + 1

	if @s_rez_id = 1 and @rez_id is not null
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'rez_id'
	set @counter = @counter + 1
	end

	if @s_otgr_id = 1 and @otgr_id is not null and @rez_id is null 
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(1, ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, 'otgr_id'
	set @counter = @counter + 1
	end
--================= Заполняем поля документа
set @Counter = 1
set @Counter2 = 2

	DECLARE cur CURSOR for
	select * from #tmp order by zap_name

	OPEN cur

	FETCH NEXT FROM cur INTO @nskuba, @nomer_card, @kol, @cena_pok, @cena_baz, @proizvod, @kodomega, @kod_stroki, @cena_pok_rur, @zap_name,  @rez_id1, @otgr_id 
	WHILE (@@fetch_status <> -1) 
	BEGIN
-- ==================================================================

	if @s_nskuba = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ',' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @nskuba
	set @counter = @counter + 1 
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @nomer_card
	set @counter = @counter + 1

	set @kol = replace(@kol,'','')
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @kol
	set @counter = @counter + 1

	if @s_cena_pok = 1
	begin
	--set @cena_pok = replace(@cena_pok,'.',',')
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @cena_pok
	set @counter = @counter + 1
	end

	if @s_cena_baz = 1
	begin
	set @cena_baz = replace(@cena_baz,'.',',')
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @cena_baz
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @proizvod
	set @counter = @counter + 1

	if @s_kodomega = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @kodomega
	set @counter = @counter + 1
	end

	if @s_kod_stroki = 1
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @kod_stroki
	set @counter = @counter + 1
	end

	if @s_cena_pok_rur = 1 
	begin
	set @cena_pok_rur = replace(@cena_pok_rur,'.',',')
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @cena_pok_rur
	set @counter = @counter + 1
	end

	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @zap_name
	set @counter = @counter + 1

	if @s_rez_id = 1 and @rez_id is not null
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @rez_id1
	set @counter = @counter + 1
	end

	if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
	begin
	set @ObjProp='Application.ActiveWorkbook.Sheets(1).Cells(' + cast(@Counter2 as varchar(15)) + ', ' + cast(@Counter as varchar(15)) + ').value'
	EXEC @RetCode = sp_OASetProperty @WordObject, @ObjProp, @otgr_id
	set @counter = @counter + 1
	end


set @Counter2 = @Counter2 + 1
set @Counter = 1

-- ==================================================================
	FETCH NEXT FROM cur INTO @nskuba, @nomer_card, @kol, @cena_pok, @cena_baz, @proizvod, @kodomega, @kod_stroki, @cena_pok_rur, @zap_name,  @rez_id1, @otgr_id 
	END

	CLOSE cur
	DEALLOCATE cur
--=================

END 


declare
@file_folder varchar(150)

select @file_folder = key_value from tb_DB_Const where key_name = 'SMTP_LOCAL_FOLDER'

if @s_rez_id = 1 and @rez_id is not null
begin
set @Filename = @file_folder + 'rez_' + cast(@rez_id as varchar(150)) + '.xls'
end

if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
begin
set @Filename = @file_folder + 'otgr_' + cast(@otgr_id as varchar(150)) + '.xls'
end

set @cmd = 'del /f /q ' + @Filename  -- на всякий случай удаляем если есть
EXEC master..xp_cmdshell @cmd

EXEC @RetCode = sp_OAMethod @WordObject,'Application.ActiveWorkbook.SaveAs',Null, @Filename
IF @RetCode <> 0 or @@Error <> 0 GOTO OLE_Error_Handler
EXEC @RetCode = sp_OAMethod @WordObject, 'Quit'

--/*

-->>>>>>>>>>>>>>>
declare 
@body varchar(8000),
@id int,
@vid varchar(150)

if @s_rez_id = 1 and @rez_id is not null
begin
set @Filename = 'rez_' + cast(@rez_id as varchar(150)) + '.xls'
set @vid = 'Резерв'
set @id = @rez_id
end


if @s_otgr_id = 1 and @rez_id is null and @otgr_id is not null
begin
set @Filename = 'otgr_' + cast(@otgr_id as varchar(150)) + '.xls'
set @vid = 'Отгрузка'
set @id = @otgr_id
end

set @body = ' <html><body><font size = "1" face="Verdana" >
<font size=1 face="Verdana"><font color="008800"><b>Документ (' + @vid + ') №' + cast(@id as varchar(50))  + '</b></font>  Клиент: "' + isnull(@firm_name, '???')+  '" <b>'
 + isnull(cast(@firm_id as varchar(15)),'0') + '</b> Пользователь: <b>' + @User_name  + '<font color="cccccc">      
     ' + cast(getdate() as varchar(50)) +  '</font></b><br><br>
'
+ --@vid + ' № ' + cast(@id as varchar(50)) +
'
</body></html>' 

insert into tb_mail_thread (subject, body, mail_from, mail_to, type, attachments)
values
(
'Приходный документ (' + @vid + ') № - ' + cast(@id as varchar(15)),
@body,
@User_name + ' <o@uck.ru>',
@mail_to,
2,
@Filename
)
--после отладки можно удалить либо изменить
insert into tb_mail_thread (subject, body, mail_from, mail_to, type, attachments)
values
(
'Расходный документ (' + @vid + ') № - ' + cast(@id as varchar(15)),
@body,
@User_name + ' <a@uck.ru>',
'mail_to@mai.com',
2,
@Filename
)



-->>>>>>>>>>>>>>>

exec usp_Mail_Send

OLE_Error_Handler:
EXEC sp_oageterrorinfo @WordObject, @RetCode out, @desc out
select @retCode, @desc
EXEC @RetCode = sp_OAMethod @WordObject, 'Quit'
EXEC sp_OADestroy @WordObject
insert into tb_test (ts, value) values (getdate(), @desc)

end
GO

15 окт 05, 18:07    [1972684]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Извните, но чем отличаются ваши два скрипта ? У меня нет времени сравнивать их построчно.
15 окт 05, 18:13    [1972686]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Извните, но чем отличаются ваши два скрипта ? У меня нет времени сравнивать их построчно.

В первом создаётся динамически шаблон excel с нужными полями, потом так же соответственно создаётся строка insert into OPENDATASOURCE.
Во втором, как заголовки столбцов шаблона, так и все содержимое excel файла, заполняются через Excel.Application с использованием курсора.
16 окт 05, 18:07    [1973415]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory
Извните, но чем отличаются ваши два скрипта ? У меня нет времени сравнивать их построчно.

В первом создаётся динамически шаблон excel с нужными полями, потом так же соответственно создаётся строка insert into OPENDATASOURCE.
Во втором, как заголовки столбцов шаблона, так и все содержимое excel файла, заполняются через Excel.Application с использованием курсора.

Не понял. Вы вроде бы утверждали, что в первом скрипте один раз выполняется OPENDATASOURCE, а во втором эта же команда выполняется в цикле(крусоре).
17 окт 05, 11:02    [1974126]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory

Вы вроде бы утверждали, что в первом скрипте один раз выполняется OPENDATASOURCE, а во втором эта же команда выполняется в цикле(крусоре).

Где я такое утверждал?
Покажите пожалуйса.
17 окт 05, 12:23    [1974530]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrey K
Glory

Не совсем понятно - использование той же OPENDATASOURCE но в курсоре работает без ошибок что ли ?


В курсоре без ошибок.

17 окт 05, 12:26    [1974547]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Andrey K
Glory

Не совсем понятно - использование той же OPENDATASOURCE но в курсоре работает без ошибок что ли ?


В курсоре без ошибок.



Извиняюсь. зачем использовать OPENDATASOURCE в курсоре действительно не совсем понятно. Я имел ввиду что процедура с курсором, в отличии от той что с OPENDATASOURCE работает. :)
17 окт 05, 12:49    [1974672]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тогда еще непонятнее - сраниваются две _разные процедруы_.
В то время как надо сравнивать в чем различие в работе двух _разных приложений_
17 окт 05, 12:51    [1974689]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при insert into OPENDATASOURCE  [new]
Andrey K
Member

Откуда: Москва
Сообщений: 676
Glory
Тогда еще непонятнее - сраниваются две _разные процедруы_.
В то время как надо сравнивать в чем различие в работе двух _разных приложений_

Процедуры реализуют одину и ту же функцию только по разному. Вызываются с одного и того же клиента одинаково. Первая где строка динамически формируется для insert into OPENDATASOURCE работает только если из QA запустить.
17 окт 05, 13:36    [1974944]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить