Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Подскажите с параметризированным запросом (число прочтений - 3422 )
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Подскажите с параметризированным запросом
16. Ноября 2011 :: 11:51
Печать  
Класс ПрямойЗапрос скачан новый, 1Cpp 3.2.3.16
Что я сделал не так?
Аналогично, по примеру с ценами работает.

в ГМ
Код
Выбрать все
Перем глРазрешенияДоступа Экспорт;

Процедура глИнициализироватьЗапросПрав()
	глРазрешенияДоступа.Текст = "
	|ВЫБРАТЬ
	|	РазрешенияДоступа.ТекущийЭлемент [ТекущийЭлемент $Справочник.РазрешенияДоступа]
	|ИЗ
	|	$Справочник.РазрешенияДоступа КАК РазрешенияДоступа $nolock
	|ГДЕ (РазрешенияДоступа.PARENTEXT = @Владелец)
	|	И ($РазрешенияДоступа.ВидСправочника = @ЭлементВид)
	|	И (РазрешенияДоступа.ISMARK = 0)
	|";
	глРазрешенияДоступа.ОписаниеПараметра("Владелец","Справочник.Пользователи");
	глРазрешенияДоступа.ОписаниеПараметра("ЭлементВид","Строка.33");
	глРазрешенияДоступа.ПодготовитьПараметризованныйЗапрос();
КонецПроцедуры // глИнициализироватьЗапросПрав 



в ПриначалеРаботыСистемы()

Код
Выбрать все
	//Параметризированный запрос для получения прав доступа
	глРазрешенияДоступа.БухгалтерскийУчет = 0;
	глРазрешенияДоступа.ОперативныйУчет = 0;
	глРазрешенияДоступа.ПериодическиеЗначения = 0;
	глИнициализироватьЗапросПрав(); 

     

В момент вызова
Код
Выбрать все
	глРазрешенияДоступа.ПодставлятьПараметры("Владелец",глПользователь);
	глРазрешенияДоступа.ПодставлятьПараметры("ЭлементВид",Элемент.Вид());
	глСпрРазрешенияДоступа = глРазрешенияДоступа.ВыполнитьПараметризованныйЗапрос(); 



Структура таблицы
# Name    |Descr                         |SQLTableNam|RecordLock
T=SC27747 |Справочник РазрешенияДоступа  |SC27747    |R        
#-----Fields-------
# Name                  |Descr               |Type|Length|Precision
F=ROW_ID                |Row ID              |I   |0     |0        
F=ID                    |ID object           |C   |9     |0        
F=PARENTEXT             |Parent in other tabl|C   |9     |0        
F=ISMARK                |Object is Marked for|L   |0     |0        
F=VERSTAMP              |Version stamp       |I   |0     |0        
F=SP27744               |(P)ВидСправочника   |C   |33    |0        
F=SP27745               |(P)ВариантДоступа   |N   |1     |0        
F=SP29634               |(P)ПоНаборуПрав     |N   |1     |0  

Вываливается ошибка

ПрямойЗапрос::ВыполнитьПараметризованныйЗапрос(Строка ТипОбъекта=ИндексированнаяТаблица) : Meta name parser error: неизвестное метаимя или алиас "$SC27747"
ЗапросODBC.ВыполнитьИнструкцию(,ПолучательЗапроса);
{C:\rh\analit_trening\Classes\ПрямойЗапрос\ПрямойЗапрос.ert(13300) }

глСпрРазрешенияДоступа = глРазрешенияДоступа.ВыполнитьПараметризованныйЗапрос();
{Глобальный модуль(52634)}: ПрямойЗапрос::ВыполнитьПараметризованныйЗапрос(Строка ТипОбъекта=ИндексированнаяТаблица) : Meta name parser error: неизвестное метаимя или алиас "$SC27747"
ЗапросODBC.ВыполнитьИнструкцию(,ПолучательЗапроса);
{C:\rh\analit_trening\Classes\ПрямойЗапрос\ПрямойЗапрос.ert(13300) }
  
Наверх
www  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Подскажите с параметризированным запросом
Ответ #1 - 17. Ноября 2011 :: 02:56
Печать  
Попробуй избавиться от совпадения Алиаса и метаимени таблицы. Например так:
Код
Выбрать все
|ВЫБРАТЬ
	|	спрРазрешенияДоступа.ТекущийЭлемент [ТекущийЭлемент $Справочник.РазрешенияДоступа]
	|ИЗ
	|	$Справочник.РазрешенияДоступа КАК спрРазрешенияДоступа $nolock 



Баг (или фича) в классе прямой запрос, судя по всему. Класс неверно определяет, что нужно разименовывать.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #2 - 17. Ноября 2011 :: 05:52
Печать  
та же фигня Печаль

Код
Выбрать все
	глРазрешенияДоступа.Текст = "
	|ВЫБРАТЬ
	|	спрРазрешенияДоступа.ТекущийЭлемент [ТекущийЭлемент $Справочник.РазрешенияДоступа]
	|ИЗ
	|	$Справочник.РазрешенияДоступа КАК спрРазрешенияДоступа $nolock
	|ГДЕ (спрРазрешенияДоступа.PARENTEXT = @Владелец)
	|	И ($спрРазрешенияДоступа.ВидСправочника = @ЭлементВид)
	|	И (спрРазрешенияДоступа.ISMARK = 0)
	|"; 

  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #3 - 17. Ноября 2011 :: 05:56
Печать  
Подскажите пожалуйста, как переписать все это же без класса прямой запрос.
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #4 - 17. Ноября 2011 :: 06:08
Печать  
тебе в результате нужна именно ссылка на элемент или достаточно получить набор свойств элемента?
  

1&&2&&3
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #5 - 17. Ноября 2011 :: 06:09
Печать  
Ссылка.
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #6 - 17. Ноября 2011 :: 06:19
Печать  
т.е. ТЗ с сылками?
  

1&&2&&3
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #7 - 17. Ноября 2011 :: 06:21
Печать  
Да.
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #8 - 17. Ноября 2011 :: 06:23
Печать  
Код
Выбрать все
Перем глРазрешенияДоступа Экспорт;

Процедура глИнициализироватьЗапросПрав()
	ТекстЗапроса = "
	|select
	|	РазрешенияДоступа.id [ТекущийЭлемент $Справочник.РазрешенияДоступа]
	|from
	|	$Справочник.РазрешенияДоступа as РазрешенияДоступа (nolock)
	|where РазрешенияДоступа.ismark = 0
	|  and РазрешенияДоступа.parentext = ?
	|  and $РазрешенияДоступа.ВидСправочника = ?
	|";
	глРазрешенияДоступа=СоздатьОбъект("ODBCRecordset");
	глРазрешенияДоступа.Подготовить(ТекстЗапроса);
	глРазрешенияДоступа.ДобПараметр(1,14,9,0); //Владелец
	глРазрешенияДоступа.ДобПараметр(1,14,33,0);//ВидСправочника
КонецПроцедуры // глИнициализироватьЗапросПрав

Функция глПолучитьПрава(Пользователь, Вид) Экспорт
	глРазрешенияДоступа.УстПараметр(1, Пользователь);
	глРазрешенияДоступа.УстПараметр(2, Вид);
	Возврат глРазрешенияДоступа.ВыполнитьИнструкцию();
КонецФункции

Процедура ПриначалеРаботыСистемы()
	глИнициализироватьЗапросПрав();
КонецПроцедуры


//Вызов
глСпрРазрешенияДоступа = глПолучитьПрава(глПользователь, Элемент.Вид());
 

  

1&&2&&3
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Подскажите с параметризированным запросом
Ответ #9 - 17. Ноября 2011 :: 06:23
Печать  
в ГМ
Код
Выбрать все
Перем глРазрешенияДоступа Экспорт;

Процедура глИнициализироватьЗапросПрав()
	Текст = "
	|SELECT
	|	РазрешенияДоступа.ТекущийЭлемент [ТекущийЭлемент $Справочник.РазрешенияДоступа]
	|FROM
	|	$Справочник.РазрешенияДоступа КАК РазрешенияДоступа (nolock)
	|WHERE (РазрешенияДоступа.PARENTEXT = ?)
	|	И ($РазрешенияДоступа.ВидСправочника = ?)
	|	И (РазрешенияДоступа.ISMARK = 0)
	|";
	глРазрешениеДоступа = СоздатьОбъект("ODBCRecordSet");
	глРазрешенияДоступа.ДобПараметр(1, 14, 9, );
	глРазрешенияДоступа.Добпараметр(1, 14, 33,);
	глРазрешенияДоступа.Подготовить(Текст);
КонецПроцедуры // глИнициализироватьЗапросПрав 



В момент вызова
Код
Выбрать все
	глРазрешенияДоступа.УстПараметр(1, РадугаСервис.ЗначениеВСтрокуБД(глПользователь));
	глРазрешенияДоступа.УстПараметр(2 ,Элемент.Вид());
	глСпрРазрешенияДоступа = глРазрешенияДоступа.ВыполнитьИнструкцию(); 




Это если просто твой запрос переделать.
Я же подозреваю, что в запрос можно смело добавить "Топ 1", и зменить ВыполнитьИнструкцию() на ВыполнитьСкалярный()


Тащемто, я опять же подозреваю, что первый параметр можно прошить сразу в запрос:
"Where РазрешенияДоступа.PARENTEXT = '" + РадугаСервис.ЗначениеВСтрокуБД(глПользователь) + "' ..."

и тогда выкинуть первый ДобПараметр(), и глРазрешенияДоступа.УстПараметр(1 ,Элемент.Вид());
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Подскажите с параметризированным запросом
Ответ #10 - 17. Ноября 2011 :: 06:33
Печать  
2 trad:
УстПараметр() тоже приводит ссылочный тип к Char(9) (как и уСтановитьТекстовыйПараметр)?
А к Char(13) модификатором можно привести?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #11 - 17. Ноября 2011 :: 06:43
Печать  
Satans Claws писал(а) 17. Ноября 2011 :: 06:33:
2 trad:
УстПараметр() тоже приводит ссылочный тип к Char(9) (как и уСтановитьТекстовыйПараметр)?
А к Char(13) модификатором можно привести?

да.
да. УстПараметр(,,1)
  

1&&2&&3
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #12 - 17. Ноября 2011 :: 06:50
Печать  
to trad и Satans Claws
спасибище Улыбка
Воспользовался методом trad, хотя по коду практически одинаково.

Все таки лишние классы приводят к увеличению ошибок, да и привычнее уже стало воспринимать Select нежели Выбрать.
  
Наверх
www  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Подскажите с параметризированным запросом
Ответ #13 - 17. Ноября 2011 :: 06:56
Печать  
В chm-ке от 2.5 у функции третий параметр не описан (нет его) =))
А поскольку для 3 chm-ки нету, а каждый раз лезть на сайт - неудобно...
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подскажите с параметризированным запросом
Ответ #14 - 17. Ноября 2011 :: 06:59
Печать  
Satans Claws писал(а) 17. Ноября 2011 :: 06:56:
В chm-ке от 2.5 у функции третий параметр не описан (нет его) =))
неужели нету Озадачен
если даже в als от 2.0 он есть

upd
хм. нету даже в свежайшем html/chm
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать