Вопрос с запросом
11.01.2012
08:26
#1
"Написал простенький запрос:
Его задача - найти количественный остаток конкретной номенклатуры на указанную дату на указанном складе.
Оно работает, но очень уж долго. Подскажите пожалуйста, как можно оптимизировать этот запрос, с целью сокращения времени его выполнения? Или нужно было писать по другому?"
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХозрасчетныйОстатки.КоличествоОстаток КАК Количество |ИЗ | РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки |ГДЕ | ХозрасчетныйОстатки.Субконто1.Ссылка = &Номенклатура | И ХозрасчетныйОстатки.Субконто2.Ссылка = &Склад | И ХозрасчетныйОстатки.Счет = &Счет"; Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Период", Дата); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01")); ТЗ = Запрос.Выполнить().Выгрузить(); Его задача - найти количественный остаток конкретной номенклатуры на указанную дату на указанном складе.
Оно работает, но очень уж долго. Подскажите пожалуйста, как можно оптимизировать этот запрос, с целью сокращения времени его выполнения? Или нужно было писать по другому?"
11.01.2012
10:11
#3
"у меня там период задан *смущенно
То есть мысль в том, чтобы запихнуть туда все остальные параметры?
Смотрим:
Субконто - у нас отбор по видам субконто, в рамках конкретной задачи, ИМХО, не нужно;
УсловиеСчета - выражение типа Булево, условие отбора счёта. Вот тут у меня вопрос - как записать такое условие? *чешет в затылке
Условие - произвольное выражение, возвращающее значение типа Булево. Опять же.... Как?
Если не трудно - напишите, пожалуйста, пару примеров, чтобы я увидел, и больше не приставал с вопросами"
То есть мысль в том, чтобы запихнуть туда все остальные параметры?
Смотрим:
Субконто - у нас отбор по видам субконто, в рамках конкретной задачи, ИМХО, не нужно;
УсловиеСчета - выражение типа Булево, условие отбора счёта. Вот тут у меня вопрос - как записать такое условие? *чешет в затылке
Условие - произвольное выражение, возвращающее значение типа Булево. Опять же.... Как?
Если не трудно - напишите, пожалуйста, пару примеров, чтобы я увидел, и больше не приставал с вопросами"
11.01.2012
10:20
#4
"
// Вставить содержимое обработчика."
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет В ИЕРАРХИИ (&Счет),
| ,
| Субконто1 В ИЕРАРХИИ (&Номенклатура)
| И Субконто2 В ИЕРАРХИИ (&Склад)) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Период", Дата);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладе);
ТЗ = Запрос.Выполнить().Выгрузить();
11.01.2012
14:41
#6
1. Почему проявляется пренебрежение к отбору по виду субконто? Его зря что ли придумали?
2. Судя по "СтрокаТЧ.Номенклатура" остатки нужно получать для всех товаров в табличной части, а не перебором строк каждый раз "дергать" таблицы регистров бух.учета.
2. Судя по "СтрокаТЧ.Номенклатура" остатки нужно получать для всех товаров в табличной части, а не перебором строк каждый раз "дергать" таблицы регистров бух.учета.
11.01.2012
15:38
#7
- Если заранее известен счет, то явным определением порядка субконто можно пренебречь
- Попросили оптимизировать запрос, а не всю задачу.
- Попросили оптимизировать запрос, а не всю задачу.
11.01.2012
18:29
#8
в цикле получили остаток по конкретной номенклатуре - сравнили с количеством в ТЧ - если больше - то записываем в новую ТЗ1, дальше будем разбираться. Если =< - то нормально, пропускаем.
Получили новую ТЗ1. Теперь надо посмотреть, на каких складах есть остатки? Снова запрос и снова в цикл. Понятно, что запрос тут точно такой же, и повторяется столько раз, сколько у нас складов, но я не очень представляю, как можно использовать один запрос в данной задаче.
То, что нашлось (причем, элементы из ТЗ1, естественно, могут находиться на разных складах), записываем в ТЗ2, и на её основе делаем документы перемещения товаров, а то, чего на складах нет - делаем поступление.
Вот такая задачка.
А как по другому? И будет ли это производительнее?
Получили новую ТЗ1. Теперь надо посмотреть, на каких складах есть остатки? Снова запрос и снова в цикл. Понятно, что запрос тут точно такой же, и повторяется столько раз, сколько у нас складов, но я не очень представляю, как можно использовать один запрос в данной задаче.
То, что нашлось (причем, элементы из ТЗ1, естественно, могут находиться на разных складах), записываем в ТЗ2, и на её основе делаем документы перемещения товаров, а то, чего на складах нет - делаем поступление.
Вот такая задачка.
А как по другому? И будет ли это производительнее?
Читают тему
(гостей: 1)