|
v7: Долго выполняется запрос | ☑ | ||
---|---|---|---|---|
0
r1000
23.10.13
✎
12:01
|
Перем Запрос, ТекстЗапроса;
ПустойНаряд = ПолучитьПустоеЗначение("Документ.ВыпускПродукции"); ДокЗадание = ""; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |ТекущийДокумент = Документ.Задание.ТекущийДокумент; |Наряд = Документ.Задание.Наряд; |Исполнитель = Документ.Задание.Исполнитель; |Группировка ТекущийДокумент; |Условие(Наряд = ПустойНаряд); |Условие(Исполнитель = Сотрудник); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Пока Запрос.Группировка() = 1 Цикл ДокЗадание = Запрос.ТекущийДокумент; Прервать; КонецЦикла; Вот такой код использую, чтобы найти документ по 2ум условиям. Сотрудник - это элемент справочника, который передается в эту функцию. Проблема в том, что когда эта функция поиска выполняется, 1ка начинает ацки перемалывать документ за весь период базы. Гуру, как оптимизировать. Мне всего лишь нужно найти документ по 2ум условиям. Спасибо. |
|||
1
mikecool
23.10.13
✎
12:02
|
указать период выборки
переделать на прямой запрос |
|||
2
dk
23.10.13
✎
12:03
|
Задать период не предлагать?
|
|||
3
pofigos
23.10.13
✎
12:04
|
(0) Период выборки документов поставить.
|
|||
4
r1000
23.10.13
✎
12:05
|
(1)Но это значит, что если реально док в другом периоде, она его не найдет ?
|
|||
5
varelchik
23.10.13
✎
12:28
|
(4) А что ты хотел?
Самое елементарное: Пустить в цикле с уменьшением даты. и уменьшать до тех пор пока не наткнешься на своего сотрудника. |
|||
6
varelchik
23.10.13
✎
12:36
|
Что-то типа:
НачДата=ТекущаяДата(); Стоп=0; Запрос = СоздатьОбъект("Запрос"); ДокЗадание=""; КонДата=Дата(1980,1,1); Пока Стоп=0 Цикл ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по НачДата |ТекущийДокумент = Документ.Задание.ТекущийДокумент; |Наряд = Документ.Задание.Наряд; |Исполнитель = Документ.Задание.Исполнитель; |Группировка ТекущийДокумент; |Условие(Наряд = ПустойНаряд); |Условие(Исполнитель = Сотрудник); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Прервать;; КонецЕсли; Пока Запрос.Группировка() = 1 Цикл ДокЗадание = Запрос.ТекущийДокумент; Стоп=1; Прервать; КонецЦикла; НачДата=НачДата-1; Если НачДата<КонДата Тогда Стоп=1; КонецЕсли; КонецЦикла; Если ПустоеЗначение(ДокЗадание)=0 Тогда Сообщить(ДокЗадание); Иначе Сообщить("Ничего не найдено"); КонецЕсли; |
|||
7
sapphire
23.10.13
✎
12:37
|
DOCPRINT.ert что говорит?
|
|||
8
pofigos
23.10.13
✎
12:39
|
(6) Запрос в цикле??? жестоко однако.
|
|||
9
varelchik
23.10.13
✎
12:46
|
ну так по крайней мере это не запрос ко всей базе.
Все ж меньше времени займет. |
|||
10
varelchik
23.10.13
✎
12:47
|
(8) Он же не знает в какой дате искать.
|
|||
11
varelchik
23.10.13
✎
12:52
|
Или так:
Текст=" |select |j.iddoc [Док $Документ], |j.iddocdef Док_вид |from $Документ.Задание Шапка (nolock) |inner join _1sjourn j (nolock) on j.iddoc=Шапка.iddoc |WHERE |$Шапка.Сотрудник=:ВыбСотр |and |$Шапка.Наряд=$ПустойИД |"; Запрос=СоздатьОбъект("ODBCRecordSet"); Запрос.УстановитьТекстовыйПараметр("ВыбСотр",Сотрудник); ТЗ=Запрос.ВыполнитьИнструкцию(Текст); ТЗ.ВыбратьСтроку(); |
|||
12
КонецЦикла
23.10.13
✎
12:54
|
Графу отбора сделать не предлагать?
|
|||
13
VladZ
23.10.13
✎
12:57
|
Я бы для начала графу отбора попробовал. Потом уже прямые запросы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |