|
Оптимальный способ получить остатки за период | ☑ | ||
---|---|---|---|---|
0
ahahaev
03.09.13
✎
11:01
|
Возникла такая задача, нужно выгрузить за определенный период данные в разрезе периода (день), складов и номенклатуры и по каждому дню получить остатки. Сейчас сделал следующим образом: основным запросом получил все данные за период в разрезе дней и за каждый день из периода получаю запросом остатки, после чего к каждой записи основного запроса присоединяю данные из запроса с остатками по конкретному дню.
Чувствую, что должно быть какое-то более оптимальное решение, но все, что приходит в голову - примерно из той же оперы, запросы в цикле, присоединения и поиски по таблицам значений. Собственно, может кто сталкивался, как решали такие задачи? |
|||
1
ahahaev
03.09.13
✎
11:34
|
Неужели нет никаких способов оптимизировать этот алгоритм?
|
|||
2
Джинн
03.09.13
✎
11:41
|
А простой группировкой по дням уже не катит?
|
|||
3
MSOliver
03.09.13
✎
11:44
|
Покажите как делаете
|
|||
4
le_
03.09.13
✎
11:46
|
||||
5
le_
03.09.13
✎
11:52
|
||||
6
Нуф-Нуф
03.09.13
✎
11:53
|
СКД и метод дополнения
|
|||
7
Нуф-Нуф
03.09.13
✎
11:53
|
или производственный календарь и соединение с таблицей движений, так сказать ручная версия виртуальной таблицы остатки и обороты
|
|||
8
ahahaev
03.09.13
✎
11:54
|
(4) Я делаю не через систему компоновки данных. Это не отчет, а выгрузка в xml
(2) Как я понимаю, группировка по дням тоже в СКД или я что-то не понял? Остатки запросом же берутся только на определенную дату. (3) Запрос = Новый (Основной запрос); Запрос.УстановитьПараметр("ДатаНачала", ДатаОт); Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаДо)); РезультатЗапроса = Запрос.Выполнить(); Выгрузка = РезультатЗапроса.Выгрузить(); ЗапросОст = Новый (Запрос к остаткам); ДатаНачала = Неопределено; Для Каждого Строка Из Выгрузка Цикл Если ДатаНачала = Неопределено ИЛИ НЕ ДатаНачала = НачалоДня(Строка.Период) Тогда ЗапросОст.УстановитьПараметр("ДатаНачала", НачалоДня(Строка.Период)); ВыгрузкаОст = ЗапросОст.Выполнить().Выгрузить(); КонецЕсли; СтруктураФильтр = Новый Структура; СтруктураФильтр.Вставить("Склад", Строка.Склад); СтруктураФильтр.Вставить("Номенклатура", Строка.Номенклатура1); МассивСтрок = ВыгрузкаОст.НайтиСтроки(СтруктураФильтр); Если МассивСтрок.Количество() = 0 Тогда МассивСтрок = Неопределено; КонецЕсли; (Вывод) КонецЦикла; |
|||
9
MSOliver
03.09.13
✎
11:56
|
(8) плохо
|
|||
10
MSOliver
03.09.13
✎
11:57
|
Можно динамически создать текст запроса и установкой дат-параметров
|
|||
11
MSOliver
03.09.13
✎
12:00
|
Однако остатки насчитаны по месяцам, и будет досчет до дней на каждую дату. А можно сразу получить остатки и обороты за период, и высчитать остатки на день
|
|||
12
Нуф-Нуф
03.09.13
✎
12:00
|
(8) а что мешает результат СКД получить в качестве таблицы значений и выгрузить ее в хмл как тебе надо?
|
|||
13
ahahaev
03.09.13
✎
12:06
|
(11) Хм, как-то не подумал о таком способе, спасибо, сейчас попробую. А по-поводу динамического запроса - это как?
(12) Как вариант можно и так конечно, тоже приму к сведению, спасибо за совет. |
|||
14
MSOliver
03.09.13
✎
12:12
|
Текст запроса формируется в цикле по датам, на каждой итерации добавлявши запрос получения остатков на дату
|
|||
15
ahahaev
03.09.13
✎
12:24
|
(14) Ну у меня сейчас примерно так и строится. Когда дата меняется, я меняю параметр запроса и формирую остатки на эту дату.
Можно, конечно, использовать левое соединение от основного запроса и формировать все полностью в цикле, так, наверное, будет лучше, чем каждый раз искать по колонкам. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |