|
v8: Помогите с запросом | ☑ | ||
---|---|---|---|---|
0
adron
16.01.13
✎
14:09
|
Есть запрос:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Докум.Склад.Префикс КАК Префикс |ПОМЕСТИТЬ ВТ_ПРЕФИКС |ИЗ | &Источник КАК Докум |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ПРЕФИКС.Префикс |ИЗ | ВТ_ПРЕФИКС КАК ВТ_ПРЕФИКС"; Запрос.УстановитьПараметр("Источник",Источник); В = Запрос.Выполнить().Выбрать(); В качестве параметра "Источник" передаю ссылку на существующий документ. В итоге получаю ошибку: "Ошибка при выполнении обработчика - 'ПриУстановкеНовогоНомера' по причине: {ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(327)}: Ошибка при вызове метода контекста (Выполнить) В = Запрос.Выполнить().Выбрать(); по причине: {(5, 2)}: Неверные параметры "Источник" <<?>>&Источник КАК Докум" В чем моя ошибка? |
|||
1
Азат
16.01.13
✎
14:10
|
а что мешает сделать конструкцию типа:
ИЗ Документ.ИмяДокумента ГДЕ Ссылка = &Ссылка |
|||
2
GROOVY
16.01.13
✎
14:11
|
(0) Ссылка не является коллекцией, поместить ее во временную таблицу нельзя.
|
|||
3
adron
16.01.13
✎
14:14
|
(1) полагаю так дольше будет?
|
|||
4
adron
16.01.13
✎
14:14
|
(2) а он и на ссылку и на объект одинакого ругается...
|
|||
5
adron
16.01.13
✎
14:15
|
(1) имя документа не определено (вид документа может быть любым)
|
|||
6
GROOVY
16.01.13
✎
14:18
|
(3) Как раз быстрее.
(4) Естественно, и то и другое не является коллекциями. (5) Можно собрать текст запроса обратившись через метаданные. |
|||
7
Азат
16.01.13
✎
14:19
|
(5) метаданные?
ИЗ Документ." + ТвойДок.Метаданные().Имя + " |
|||
8
adron
16.01.13
✎
14:19
|
(6) ок. так и сделаю
Только вопрос - почему быстрее? |
|||
9
GROOVY
16.01.13
✎
14:19
|
ВЫБРАТЬ
Префикс ИЗ Документ."+Ссылка.Метаданные().Имя" ГДЕ Ссылка = &Ссылка |
|||
10
GROOVY
16.01.13
✎
14:20
|
(8) Временную таблицу не надо создавать и уничтожать. Временная таблица реально создается в базе. Это совсем не быстро.
|
|||
11
GROOVY
16.01.13
✎
14:21
|
Кстати, нафига получать запросом префикс, если его можно получить у ссылки?
|
|||
12
GROOVY
16.01.13
✎
14:22
|
(11) Лажанул, извиняюсь.
|
|||
13
Reset
16.01.13
✎
14:42
|
Запрос=Новый Запрос("Выбрать (&Ссылка).Префикс");
|
|||
14
zladenuw
16.01.13
✎
14:44
|
а так не
Префикс = Документ[Источник].Префикс; ? |
|||
15
Reset
16.01.13
✎
14:45
|
как в (0):
Запрос=Новый Запрос("Выбрать (&Источник).Склад.Префикс Как Префикс"); |
|||
16
zladenuw
16.01.13
✎
14:45
|
(14) а не .
|
|||
17
Reset
16.01.13
✎
14:50
|
(2) Можно :-)
Выбрать &Ссылка Пометить ВТ; |
|||
18
Reset
16.01.13
✎
14:50
|
поместить*
простите |
|||
19
zladenuw
16.01.13
✎
14:51
|
(0) только зачем тебе запрос ? если у тебя есть ссылка ?
ТвойПрефикс = Ссылка.Префикс; |
|||
20
Reset
16.01.13
✎
14:52
|
(19) Это залет, солдат!
|
|||
21
zladenuw
16.01.13
✎
14:54
|
(20) я не солдат. так что залет не в счет :).
Та какая задача. если есть ссылка на документ. зачем запрос и еще раз получать. если с ссылки можно получить что надо |
|||
22
Reset
16.01.13
✎
14:54
|
(21) тащить целый объект (а у ТСа и вовсе два) изза одного реквизита - не комильфо
|
|||
23
zladenuw
16.01.13
✎
15:04
|
(22) куда тащить. если он в запрос "параметр", передает ссылку на документ
|
|||
24
adron
16.01.13
✎
15:21
|
(23) одно дело в параметр передавать ссылку а другое дело тащить объект.
Решил по другому:) По началу просто ступил. ПрефиксСклада = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Склад,"Префикс"); Ибо Источник это объект. |
|||
25
iceman2112
16.01.13
✎
15:35
|
Человек ты просто псих
|
|||
26
iceman2112
16.01.13
✎
15:36
|
Не понимаю неужели
Источник.Склад.Префикс Или Источник.Сссылка.Склад.Префикс не работает? |
|||
27
adron
16.01.13
✎
15:57
|
(25) Источник.Сссылка.Склад.Префикс - это не наш метод. Это долго, некорректно с т.з. производительности. На экзаменах за это оценки снижают. Учи мат часть.
|
|||
28
Полотенчик
16.01.13
✎
16:08
|
(27) можно поподробнее, пожалуйста? для "самых маленьких и тупых"
|
|||
29
GROOVY
16.01.13
✎
16:16
|
(28) Ссылка не содержит в себе данных объекта, потому при обращении к любому свойству ссылки через точку происходит полное чтение данных из БД. При обращении через точку точки еще одно чтение и тд. Куда правильнее выбирать только нужные данные запросом, а не читать кучу ненужных данных объектов.
|
|||
30
adron
16.01.13
✎
16:17
|
(28) При обращении к реквизиту ссылки "через точку" система считывает весь объект из базы данных в кэш, а затем возвращает значение реквизита.
При обращении к реквизиту объекта - другое дело, объект уже в кэше, данные берутся из кэша. При обращении в запросе через точку:) считывается только значение реквизита. Источник.Сссылка.Склад.Префикс - тут сначала система считает все реквизиты документа в КЭШ, затем реквизиты склада, а затм вернет префикс. Это долго. |
|||
31
DUDE
16.01.13
✎
16:25
|
(30) а все-таки для непонятливых:
чем ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Склад,"Префикс") лучше Источник.Склад.Префикс? Имхо, в общей процедуре будет наворочено тоже не... оптимальный для данной задачи алгоритм. |
|||
32
adron
16.01.13
✎
16:28
|
(31) в общей процедуре как раз запрос
|
|||
33
Reset
16.01.13
✎
16:28
|
(31) Объяснения в (29)(30) разве недостаточно? в функции общего модуля формируется запрос вида (9)
|
|||
34
DUDE
16.01.13
✎
16:35
|
(32), (33) Посмотрел процедуру. Да, там действительно запрос формируется, что есть хорошо. Однако это еще не значит что для текущей задачи - получения префикса склада вызов этой процедуры даст выигрыш.
|
|||
35
GROOVY
16.01.13
✎
16:37
|
(34) Проестируй, на файловой базе, на скульной, без нагрузки, под нагрузкой, с RLS, без RLS, в привилегированном режиме, в обычном. Напиши тут отчет, всем будет интересно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |