powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры из Excel
45 сообщений из 45, показаны все 2 страниц
Запуск хранимой процедуры из Excel
    #39609857
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, помогите кодом!
Мне нужно запускать хранимую процедуру в SQL-server'е из екселя с вводом параметра. То есть, ввожу в ячейку 0,56, запускаю макрос - ХП выполняется. И ещё как-то бы получать в качестве обратной связи сообщения типа, "Не удалось записать значение плотности" или "Параметр успешно записан" - это предусмотрено скриптом ХП.
Оговорюсь сразу: из SQLа процедура успешно работает с выдачей диагностических сообщений, строка подключения тоже верна. Приведённый скрипт посоветовали, но не фурычит он, ругается "Type mismatch".
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub RecDens()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Connection
Set cn = New ADODB.Connection

cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=PowerPlant;Data Source="PROTON" 'Ïàðàìåòðû ñòðîêè ïîäêëþ÷åíèÿ
cn.Open
Set cmd = New ADODB.Command
cmd = "exec SPNetWriteGasDensity" & "0.56"
cn.Close
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609873
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovax,

у вас есть на сервере процедура с именем SPNetWriteGasDensity0.56 ?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609874
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала в этом коде синтаксическая ошибка (там где кавычки в строке подключения) - кавычки в текстовых литералах нужно задваивать

А дальше надо почитать что-нить о том, как запускать процедуры с параметрами
первое попавшееся http://www.askit.ru/custom/vba_office/m9/09_06_ado_command.htm
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609880
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
0,56 - это значение, которое процедура SPNetWriteGasDensity должная записать в прибор.
Указанная процедура, разумеется, есть.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609923
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxShocker.Pro,
0,56 - это значение, которое процедура SPNetWriteGasDensity должная записать в прибор.
Указанная процедура, разумеется, есть.нет, я спросил именно про имя "SPNetWriteGasDensity0.56"

Потому что именно такую вы пытаетесь запустить
Код: vbnet
1.
cmd = "exec SPNetWriteGasDensity" & "0.56"
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610078
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro, чёт я Вас не понимаю: Вы что имеете в виду? В вышеуказанную строку я вкладываю следующий смысл: exec(пробел)имя процедуры(пробел)значение. Может, в этом ошибка?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610095
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxимя процедуры( пробел )значениеи покажите мне этот самый пробел
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610099
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, как его показать-то... Просто нажатие клавиши пробела.
Может быть, надо: cmd = "exec SPNetWriteGasDensity 0.56"?
В понедельник на работе попробую.
Да, и на строку подключения внимания не обращайте - она у меня в других макросах используется - проверено, работает.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610114
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxХм, как его показать-то.Ну как. Я же давал ссылку на то, как оформлять сообщения. Там есть и средства выделения в коде.kovaxПросто нажатие клавиши пробела.нажатие клавиши пробела не означает появления пробела в тестовом литерале.kovaxДа, и на строку подключения внимания не обращайте - она у меня в других макросах используется - проверено, работает.строка может и рабочая, но это не значит, что втупую скопированная она будет правильно присвоена переменной.kovaxМожет быть, надо: cmd = "exec SPNetWriteGasDensity 0.56"?как вариант. А вообще, ссылку как запускать процедуру с параметрами я давал выше
kovaxПриведённый скрипт посоветовали, но не фурычит онне знаю, кто там вам чего советовал, но этот скрипт ни о чем, он ничего не делает, даже если исправить в нем ошибки
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610440
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, запускать процедуру с параметром я научился, наконец-таки!
Осталось решить задачу с обратной связью - чтобы в виде MsgBox'ов выводилось сообщение, которое выводится, если я эту процедуру выполняю из кверианализера.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Rec_Density()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Set cn = New ADODB.Connection
cn.ConnectionString = "строка подкл"
cn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "SPNetWriteGasDensity"
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 20
cmd.Parameters.Append cmd.CreateParameter("@Density", adVarChar, adParamInput, 5, TextBox1.Value)
cmd.Execute
cn.Close
Set cn = Nothing
Set cmd = Nothing
End Sub
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610446
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro,
прошу Вас помочь в этом деле! Знаю теперь, что можете!
Привожу скрипт ХП (авторство не моё, если что):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varChar(16)
AS
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Ok' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610463
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
Set rs = cmd.Execute()
MsgBox rs("Diagnostic")
rs.Close


Типа того
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610501
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Sub Rec_Density()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim rst As ADODB.Recordset
Set cn = New ADODB.Connection
cn.ConnectionString = ""
cn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "SPNetWriteGasDensity"
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 20
cmd.Parameters.Append cmd.CreateParameter("@Density", adVarChar, adParamInput, 5, TextBox1.Value)
cmd.Execute
Set rst = cmd.Execute()
MsgBox rst("Diagnostic")
cn.Close
rst.Close
Set cn = Nothing
Set cmd = Nothing
End Sub


Выскакивает ошибка "Run-time error '3265'. "Не удаётся найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
Пробовал подставлять вместо Diagnostic ErrorMessage (@ErrorMessage) - то же самое
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610540
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первым оператором хранимки напиши
Код: sql
1.
SET NOCOUNT ON
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610645
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вставил. После AS (т.е. 4-ой строкой SET NOCOUNT ON). Ничего не изменилось. Почти: если писать не "Diagnostic", а "Diagnostics", тогда выскакивает MsgBox "Ok". Правда, он выскакивает всегда, даже если в счётчик не записалось значение. А до ввода SET NOCOUNT ON даже такая "диагностика" не работала. В общем, не то, что нужно.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610647
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610676
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы что-то мутите, потому что никакого Diagnostics в вашем коде нет.
Поставьте точку останова на MsgBox, посмотрите, что возвращается в rst
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610690
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё раз скрипт ХП и скриншот
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Ok' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610693
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, скрипт чуть изменил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Успешно' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610705
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скрин с результатом точки останова на MsgBox
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610706
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот для варианта Diagnostics
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610713
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так на скрине с QA всё же видно! В первом рекордсете у вас Diagnostics="Ok", что вы голову морочите.
Чтобы получить данные из второго рекордсета, нужно брать данные из rs.NextRecordset()
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610715
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но я бы в данном случае, раз вложенные процедуры возвращают какие-то свои рекордсеты, получал бы сообщение через @ErrorMessage, объявив его как output-параметр процедуры
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610990
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заработало, как хотел. Добавил строку
Код: vbnet
1.
Set rst=rst.NextRecodrset

Shocker Pro, спасибо!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611026
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro, может быть, подскажете, в чём дело?
Обычно я ввожу число, где разделителем служит точка - тогда ХП пишет "Успешно". Если поставить разделителем запятую и попытаться запустить ХП через QA, то анализер будет ругаться, а число не запишется - проверено. Если так же сделать, используя ексель, он выдаст сообщение "Успешно", хотя ХП ведь не выполнит запись! Даже если перезагрузить комп (чтобы исключить сохранение Recordset'ов), открыть книгу и сразу попытаться записать число с "неправильным"разделителем- всё равно пишет, что успешно. Меня вот это напрягает!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611032
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделайте параметр @Density числовым
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611179
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxShocker Pro, может быть, подскажете, в чём дело?
Обычно я ввожу число, где разделителем служит точка - тогда ХП пишет "Успешно". Если поставить разделителем запятую и попытаться запустить ХП через QA, то анализер будет ругаться, а число не запишется - проверено. Если так же сделать, используя ексель, он выдаст сообщение "Успешно", хотя ХП ведь не выполнит запись! Даже если перезагрузить комп (чтобы исключить сохранение Recordset'ов), открыть книгу и сразу попытаться записать число с "неправильным"разделителем- всё равно пишет, что успешно. Меня вот это напрягает!

Почему Вы решили, что "ХП ведь не выполнит запись"
Если Вам вернулось "Успешно", то ХП отработала на "ура"

Вы не путайте запуск ХП в QA и из других мест. В QA разделитель целой и дробной части всегда точка. Он упадет на этапе компиляции запроса.
В Экселе, если Вы создали парамер типа число, то туда и будет передаваться число (по-возможности конвертица)
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611203
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKotВ Экселе, если Вы создали парамер типа число, то туда и будет передаваться число (по-возможности конвертица)В том-то и дело, косяк тут
Код: vbnet
1.
cmd.Parameters.Append cmd.CreateParameter("@Density", adVarChar, adParamInput, 5, TextBox1.Value)
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611235
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,
прежде чем писать сюда, я проверяю всегда результат, чтобы ни самому, ни других участников не запутать.
Ещё вот раз попытался значение с запятой из экселя отправить - не записалось, я это прямо в приборе (газовый счётчик, СПТ-761) смотрю.
Shocker Pro,
QA "согласна работать" только с varchar. Ни с real, ни c float не хочет никак, самому странно!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611238
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxQA "согласна работать" только с varchar. Ни с real, ни c float не хочет никак, самому странно!а) ерунду говорите
б) решение я сказал - меняйте varchar на число и ADO сам разберется, как туда корректно передать число, независимо от локализации винды
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611239
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или Вы имеете в виду, что в ХП оставить @Dencity как есть, то есть varchar, а adVarChar заменить другим типом (числовым)?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611241
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxв ХП оставить @Dencity как естьнет, менять в обоих местах, да и в xp_SPNet_set_array тоже
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611248
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, в тот файл я не полезу, это файл типа *dll, выполняет роль драйвера счётчика для SQL. С этим пока всё.
Ломаю голову теперь над другой ХП, которая бы эту плотность теперь из памяти счётчика получала, а в перспективе - на лист екселя (в качестве обратной связи).
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611281
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxНе, в тот файл я не полезуну хотя бы на входе в свою ХП надо поставить число, а при вызове xp_SPNet_set_array конвертировать в строку
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611283
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял, попробую!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611610
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxПонял, попробую!
Мне кажется поменять будет бесполезно, проблема видать в вызове ХП master..xp_SPNet_set_array внутри ХП SPNetWriteGasDensity

Сделайте простой костыль, т.к параметр @Density используется только при вызове ХП master..xp_SPNet_set_array , то просто забейте костыль добавьте строку

Код: sql
1.
2.
3.
4.
-- Счетчик 7, канал 1
Set @Density = Replace(@Density , ',', '.')
exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
set @WriteResult = @WriteResult + @rc
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611663
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, работает!
Спасибо!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611815
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл в списке ХП процедуру для чтения плотности из газового счётчика. Кто-то до меня её ещё написал, не знаю даже, рабочая ли - надо проверить, запустив её в кверианализере и указав значения переменных, в том числе и @SPNetHandle. И вот с ней проблема! Что это такое, как узнать её величину - понятия не имею!
Эта же переменная есть в ХП для записи, текст которой я уже приводил, но там она, видимо, сама вычисляется, а здесь её значение нужно указать при попытке запуска в QA.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE PROCEDURE SPNetGetGasDensity
	@SPNetHandle int,
	@RequestID int,
	@Device int,
	@Channel int,
	@Array int,
	@ArrayIndex int,
	@DateTime datetime
AS

declare @rc as int

-- Временная таблица результатов запросов к СПСети
create table #GetGasDensityResultTMP (
	Device int,
	Channel int,
	Array int,
	ArrayIndex int,
	Value varchar(32),
	Unit varchar(32),
	DateTime varchar(32)
)


insert into #GetGasDensityResultTMP exec @rc = master..xp_SPNet_get_array @SPNetHandle, 7, 1, 125, 9, 1

-- Запрос удачен?
if @rc = 0  and @@rowcount != 0 begin
	-- Данные числовые?
	declare @Value as varchar(32)
	select @Value = Value from #GetGasDensityResultTMP

	if isnumeric(@Value) = 1 begin
		declare @SaveValueResult as int

		-- Помещение результата запроса в архив c избежанием дублирования 
		update SPNetArchive set Value = cast(Value as float), StoredInOracle = 0 where RequestID = @RequestID and [DateTime] = @DateTime
		set @SaveValueResult = @@rowcount

		if @SaveValueResult = 0 begin
			insert SPNetArchive select @RequestID as RequestID, @DateTime, cast(Value as float), Unit, 0 as StoredInOracle from #GetGasDensityResultTMP
			set @SaveValueResult = @@rowcount
		end

		-- Удачная попытка добавиления?
		if @SaveValueResult != 0 begin
			-- Удаление запроса из очереди
			delete from SPNetRequestsQueue where RequestID = @RequestID and DateTime = @DateTime
			set @rc = 0
		end
		else begin
			set @rc = 1
		end
	end
	else begin
		set @rc = 1
	end
end

-- Очистка результата запроса
delete #GetGasDensityResultTMP

return @rc
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611821
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxЭта же переменная есть в ХП для записи, текст которой я уже приводилнету
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, там есть @Handle, ну так она возвращается из xp_SPNet_connect
kovax
Код: sql
1.
exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611846
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro, а есть идеи, что это может быть?
У меня единственная версия - SPNetHandle - это номер сети, (приборы объединены в сеть), в данном случае 1. И каждая сеть соединяется со своим СОМ-портом.
Делаю такой запрос в QA
Код: sql
1.
exec SPNetGetGasDensity 1, 226, 7, 1, 125, 9, "20180303"


Пишет в ответ "1 row affected = 0" - типа, все строки пустые.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611851
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скажем так, это условный номер некоего объекта соединения, которое создается xp_SPNet_connect и через которое идет обмен со счетчиком. Придумать его нельзя - нужно использовать xp_SPNet_connect для его получения
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39616873
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заставил, наконец, работать процедуру
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
CREATE PROCEDURE SPNetGetGasDensity
	--@Handle int,
	--@RequestID int,
	--@Device int,
	--@Channel int,
	--@Array int,
	--@ArrayIndex int,
	--@DateTime datetime
            --set  @DateTime = getdate
AS
--SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT
--declare @rc as int

-- Временная таблица результатов запросов к СПСети
create table #GetGasDensityResultTMP (
	Device int,
	Channel int,
	Array int,
	ArrayIndex int,
	Value varchar(32),
	Unit varchar(32),
	DateTime varchar(32)
)

--set  @DateTime = GETDATE()
insert into #GetGasDensityResultTMP exec @rc = master..xp_SPNet_get_array @Handle, 7, 1, 125, 9, 1

-- Запрос удачен?
if @rc = 0  and @@rowcount != 0 begin
	-- Данные числовые?
	declare @Value as varchar(32)
	select @Value = Value from #GetGasDensityResultTMP

	if isnumeric(@Value) = 1 begin
		declare @SaveValueResult as int

		-- Помещение результата запроса в архив c избежанием дублирования 
		update SPNetArchive set Value = cast(Value as float), StoredInOracle = 0 where RequestID = 226 and [DateTime] = getdate()
		set @SaveValueResult = @@rowcount

		if @SaveValueResult = 0 begin
			insert SPNetArchive select 226 as RequestID, getdate(), cast(Value as float), Unit, 0 as StoredInOracle from #GetGasDensityResultTMP
			set @SaveValueResult = @@rowcount
		end

		-- Удачная попытка добавления?
		if @SaveValueResult != 0 begin
			-- Удаление запроса из очереди
			delete from SPNetRequestsQueue where RequestID = 226 and DateTime = getdate()
			set @rc = 0
		end
		else begin
			set @rc = 1
		end
	end
	else begin
		set @rc = 1
	end
end
exec master..xp_SPNet_disconnect @Handle
-- Очистка результата запроса
delete #GetGasDensityResultTMP

return @rc
GO


Не знаю только что с getdate делать - она выводит дату-время, а мне нужно только дату. Что нужно дописать?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39616879
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39616901
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, а то всё время забываю про фак
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры из Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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