Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Проверить наличие пользовательских функций (число прочтений - 3283 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Проверить наличие пользовательских функций
22. Февраля 2007 :: 12:53
Печать  
Привет Алл!
В скульной базе 1С применяются пользовательские функции, формируемые из одной обработки, содержимое типа:
Код
Выбрать все
Процедура Сформировать()
	ОДБС=СоздатьОбъект("ODBCRecordset");
		    ТекстЗ="CREATE FUNCTION dbo.fn_tovar_pril2 (@docum char(9))
			|returns table
			|as
			|return (
			|select
			|	d.iddoc Док,
			|	n.descr Товар,
			|	k.descr Единица,
			|   Ltrim(Str($d.КоличествоОсн,17,3)) КоличествоОсн,
			|	Ltrim(Str($d.Количество,17,3)) Количество,
			|	Ltrim(Str($d.ЦенаБезНДСОсн,17,2)) ЦенаБезНДСОсн,
			|	Ltrim(Str($d.ЦенаБезНДС,17,2)) ЦенаБезНДС,
			|	Ltrim(Str($d.ЦенаСНДС,17,2)) ЦенаСНДС,
			|	Ltrim(Str($d.СуммаБезНДС,17,2)) СуммаБезНДС,
			|	Ltrim(Str($d.СуммаСНДС,17,2)) СуммаСНДС
			|from $ДокументСтроки.Приложение2 d(nolock)
			|	left join $Справочник.Номенклатура n(nolock) on n.id = $d.Товар
			|	left join $Справочник.КлассификаторЕдИзм k(nolock) on k.id = $d.Единица
			|where d.iddoc = @docum
			|)";
	ОДБС.ВыполнитьИнструкцию(ТекстЗ);
		    ТекстЗ="CREATE FUNCTION dbo.fn_tovar_nn (@docum char(9))
			|returns table
			|as
			|return (
		     ........
		     ОДБС.ВыполнитьИнструкцию(ТекстЗ); 



Иногда требуется заменить измененную функцию, иногда добавить... Отследить наличие или версию в попыхах бывает проблематичным...

Вопрос: подскажите, плз, как в этой обработке прямым запросом к скулю узнать существует ли уже польз. функция с таким именем для автоматического или интерактивного принятия решения о перезаписи или пропуске добавления?
Как программно удалить одну/все польз. функции перед их полной перезаписью?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #1 - 22. Февраля 2007 :: 13:12
Печать  
Например:
Код
Выбрать все
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fn_tovar_pril2]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fn_tovar_pril2] 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #2 - 22. Февраля 2007 :: 13:34
Печать  
Спасибо!

А в dbo.sysobjects поле crdate - дата создания, а refdate - дата последнего изменения?

И обязательно ли условие  and xtype in (N'FN', N'IF', N'TF') если этот запрос (сейчас проверил в QA) и так прекрасно селектует?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #3 - 22. Февраля 2007 :: 13:42
Печать  
Kapet писал(а) 22. Февраля 2007 :: 13:34:
А в dbo.sysobjects поле crdate - дата создания, а refdate - дата последнего изменения?

crdate - да.
refdate - Reserved for future use. (c) BOL

Kapet писал(а) 22. Февраля 2007 :: 13:34:
И обязательно ли условие  and xtype in (N'FN', N'IF', N'TF') если этот запрос (сейчас проверил в QA) и так прекрасно селектует?

Это проверка на то, что объект с заданным именем - функция.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #4 - 22. Февраля 2007 :: 13:46
Печать  
Спасибо, Вы очень любезны!

А как перед записью удалить все польз. функции или организовать цикл по их удалению?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #5 - 22. Февраля 2007 :: 14:13
Печать  
Kapet писал(а) 22. Февраля 2007 :: 13:46:
А как перед записью удалить все польз. функции или организовать цикл по их удалению?

Код
Выбрать все
exec(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' + REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '
	+ N' where xtype in (N''FN'', N''IF'', N''TF'') ')
if (@@error = 0)
	exec sp_MSforeach_worker 'drop function ?'
 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #6 - 22. Февраля 2007 :: 15:18
Печать  
Спасибо! Пойду теперь разбираться с этим  Улыбка
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #7 - 26. Февраля 2007 :: 08:56
Печать  
Кстати так тоже работает, и судя по сравнению в QA одинаково быстро...
Код
Выбрать все
if exists (select * from dbo.sysobjects where name = 'fn_tovar_pril2' and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fn_tovar_pril2] 

  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #8 - 26. Февраля 2007 :: 09:04
Печать  
Kapet писал(а) 26. Февраля 2007 :: 08:56:
Кстати так тоже работает, и судя по сравнению в QA одинаково быстро...
Код
Выбрать все
if exists (select * from dbo.sysobjects where name = 'fn_tovar_pril2' and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fn_tovar_pril2] 


На самом деле, у тебя может быть несколько функций с одинаковым названием, если они принадлежат разным владельцам. Твой код владельца не проверяет.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Проверить наличие пользовательских функций
Ответ #9 - 26. Февраля 2007 :: 09:11
Печать  
Спасибо за науку!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать