0. bforce 427 01.04.14 00:37 Сейчас в теме

Решение транспортной задачи запросом

Списание по двум последовательностям партий запросом (без программной обработки)

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. ildarovich 6514 30.04.14 20:30 Сейчас в теме
Отличное оформление!

Для полноты картины добавлю пару ссылок:
1)ФИФО для любопытных - описание не такое детальное и наглядное, но задача та же и условие соединения в запросе чуть проще. Кстати, в комментарии http://forum.infostart.ru/forum24/topic32459/message361880/#message361880 к той статье дается оценка быстродействия запросного метода. Она совсем не такая оптимистичная, как в этой статье, но на примере списания остатков заказов этого заметно не будет. Также в комментарии http://forum.infostart.ru/forum24/topic32459/message361861/#message361861 приведен рисунок - ментальная модель, используемая при синтезе запроса. Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат. Двумерная модель транспортной задачи, приведенная в данной статье, очевидно, нагляднее.
2)Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая) - также говорится об использовании аналогии между списанием по партиям и транспортной задачей, правда для скорости она решается не запросом, а программно. Обратите внимание на скриншоты хода решения задачи - они очень похожи на рисунки из статьи.

Ну и остались вопросы по постановке задачи. Что-то из серии "угадал все буквы, но не смог назвать слова" (это я про себя). Понятно, когда есть несколько заказов и требуется закрыть их одним поступлением. Тогда закрываем их по ФИФО. Например, заполняем товары и количество, затем запускаем обработку заполнения табличной части и она разбивает строки по заказам. То есть запрос в ОЗТЧ? Но почему не свернуть ТЧ по одинаковым товарам перед вызовом ОЗТЧ. Это ведь сам подбор делает (серии?). Как кладовщик решает, что заказа нет? В этом случае оформляет ордер? В какой момент на ордер поступление делается? То есть непонятна роль ордера и причины возникновения строк с одинаковым товаром. Или обработка одним запросом сразу много поступлений обрабатывает? - Разъясните, пожалуйста!
jobkostya1c8; dour-dead; DO_WHILE_LOOP; Артано; igormiro; dark_wolf; DrAku1a; bulpi; Aleks_Antonuk; Redokov; bforce; +11 Ответить
2. bforce 427 02.05.14 00:00 Сейчас в теме
(1), спасибо за отзыв.
Интересные ссылки! Жаль, что они мне не попались в процессе работы над задачей.

В первой статье, действительно, интересное решение и его проще осознать. Я бы добавил туда несколько иллюстраций.
Над оценкой трудоемкости запроса я задумался. Мой перебор далеко не оптимален, у него трудоемкость О(n * m). Да и запросы на стороне SQL, как я понимаю, приводят к полному соединению таблиц, и только потом применению условия (я клоню к тому, что трудоемкость не должна делиться на два n * m / 2) . Пусть даже так, но почему тогда запрос отрабатывает быстрее? На досуге я над этим поработаю.
Это два стоящих рядом столбика приходов и расходов, общие отрезки в которых и образуют результат.

Мне показалась, что здесь есть над чем подумать. Например, что будет, если я выберу сначала только интервалы из двух таблиц, отсортирую и соединю их с двумя другими таблицами по условию попадания в интервал? Не получится ли сразу искомая таблица?

По поводу постановки задачи. В статье я немного упростил ее. Возможно, в этом причина вопросов.
Начну с кладовщика. У него свой АРМ. В нем он просто сканирует штрихкод товара и переносит его в табличную часть. По нажатию кнопки "Принять" АРМ делает за него всю работу: анализирует остатки по Заказам поставщику, по Поступлениям товаров и услуг и создает соответствующие документы. Если поступления нет - перед нами излишек (Ордер на излишки), а если есть - обычный товар (Приходный ордер на товары). В целях сохранности товара кладовщик не знает какой документ был создан.

А теперь интересное. Нет никакой ОЗТЧ. Сам запрос в обработке проведения (о, ужас!). Подбор в поступление позволяет выбрать только товары из заказов, пусть, даже, нескольких. Таким образом, эти строки никогда не свернутся.
В момент проведения Поступления мы должны закрыть два взаимосвязанных регистра: +Товары к поступлению (какие товары предстоит принять на складе), -Излишки (какие товары из этого поступления уже находятся на складе). Если мы находим товар в излишках, значит, в Товары к поступлению мы его не пишем.

Надеюсь, я не слишком выболтал бизнес-процессы фирмы, и Вам стало яснее.
18. AlexO 126 18.07.14 12:32 Сейчас в теме
(1) (17) так когда будет чектий и конкретный запрос на все эти "графы"?!
Все жду, что вот-вот, создадут идеальный запрос, который можно будет везде использовать без переписывания 2/3.
3. Synoecium 633 06.05.14 09:30 Сейчас в теме
Шикарно оформлено, прям курсовая работа. И задача интересная.
4. Bukaska 130 06.05.14 10:39 Сейчас в теме
Однозначно ставлю +, не перевелись ещё на форуме специалисты)))
5. Гошик54 07.05.14 06:37 Сейчас в теме
Это конечно все интересно. Но мне кажется, что в этом примере нет чистоты эксперимента, а именно:
1. Исходный массив данных. На примере рассматривается не большой массив данных тут и так понятно что прямой перебор справится быстрее SQl (SQL - это как межгалактический челнок, но его нужно разогнать). Было бы интересно посмотреть графики скорости с нарастанием объема обрабатываемых данных до сотен тысяч позицый.
2. Может я и ошибаюсь но в эксперименте данные обрабатываются из виртуальной таблицы значений(из кэша памяти), а не поднимаются с файловой системы. В этом случае прямому перебору данные предоставили прямо на блюдечке.
9. bforce 427 07.05.14 12:52 Сейчас в теме
(5), вы немного все переиначили.
  1. У меня получилось, что запрос отрабатывает быстрее, чем перебор, а не наоборот! В моем примере прямой перебор медленнее. Или вы ведете к тому, что преимущества запроса можно еще больше улучшить?
  2. Исходный массив данных. Об этом я обязательно должен был написать (и думал, что написал). Я не тестировал алгоритм на супер больших объемах. Например, таблица 1000 х 1000 у меня решалась несколько минут. Больше делать не стал.
  3. Здесь вы тоже не верно все истолковали. Для перебора используется таблицы объекта (внешней обработки). Непосредственно в них происходят вычисления. Для запроса же эти таблицы выгружаются в параметры запроса, при выполнении запроса помещаются во временные, и только потом используются для расчета нарастающего итога и дальнейших вычислений.
    То есть, действий запросный метод выполняет больше.
6. human_new 328 07.05.14 08:39 Сейчас в теме
Вот это я понимаю подход! Все с разъяснениями. Подобного рода задачи постоянно приходится решать, например, в ЗУПе когда НДФЛ нужно грамотно перекрыть и не держать остатков по периодам или перекрыть любой отрицательный остаток по регисту положительными остатками по этому же регистру. Но то что это Транспортная задача я даже не задумался.
7. alek111--- 07.05.14 09:15 Сейчас в теме
8. wolfsoft 2420 07.05.14 11:36 Сейчас в теме
Дельный материал доступным языком.
10. bulpi 155 07.05.14 13:11 Сейчас в теме
Поставил + за изложение. Но вот за это :

"нередки ситуации, когда менеджер не успевает оформить Заказ поставщику и принимаемый товар записывается как излишек. Если с течением времени будет введен документ Поступление товаров и услуг по этому Заказу, то товар снимается с излишков и все - он уже на складе."

нужно бить линейкой по рукам того, кто придумал (организатора учета) . Сильно, больно и долго.
Это не уменьшает теоретической и методической ценности статьи.
11. rasswet 82 08.05.14 09:47 Сейчас в теме
шикарное оформление, респект!
12. tr75 24.05.14 14:08 Сейчас в теме
13. tr75 24.05.14 14:08 Сейчас в теме
14. oberonm 9 27.05.14 11:05 Сейчас в теме
15. yelena-ppm 1 30.05.14 14:36 Сейчас в теме
Отличное практическое применение элегантной теории :)
16. Abbra 22 17.07.14 23:33 Сейчас в теме
Подскажите, пожалуйста, кто знает, как в примере с курсами валют реализовать на языке запросов следующее: "В третьей группе мы соединяем эти две таблицы по условию ПериодКурса, в результате чего получаем избыточное количество записей. Но достаточно сгруппировать их по дате документа и выбрать максимальное из значений ПериодКурса, как мы получим требуемую таблицу."
17. bforce 427 18.07.14 11:43 Сейчас в теме
(16), вы можете обратиться к статье Срез последних на каждую дату в запросе, там есть то, что нужно.
19. Abbra 22 22.07.14 01:27 Сейчас в теме
(17), спасибо. Из этой статьи я понял как объединить таблицу, содержащую все даты периода с колонкой дат известных остатков, а потом уже объединить с колонкой сумм известных остатков.
у Вас же присоединяются сразу две колонки и я не представляю, что потом с этой таблицей делать, чтобы выделить из нее нужное
20. jobkostya1c8 25.08.14 23:15 Сейчас в теме
Отличная статья. Все для производительности.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист 1С
Москва
зарплата от 120 000 руб.
Полный день

Руководитель проекта, аналитик, консультант
Санкт-Петербург
По совместительству

Программист 1С
Самара
зарплата от 100 000 руб. до 150 000 руб.
Полный день

Программист 1С
Тюмень
зарплата от 65 000 руб.
Полный день