|
![]() |
#1 |
Участник
|
Не знаю, может не в тему. Была у меня частная задача - в отчете посчитать плановую себестоимость продукции, когда известна покупная цена сырья. Реализовал целиком на SQL в одной хранимой процедуре. Несмотря на поддержку рекурсии в SQL, я от нее отказался - ведь не было задачи получить список сырья, надо было получить только цифру стоимости. Сделал так - выгрузил все (то есть вообще все) строки BOM во временную таблицу, добавив служебные поля, и запустил итеративный цикл вычисления себестоимости ГП/ПФ на основании строк (при условии что все строки имеют непустую себестоимость). При первом проходе стоимость могли получить только ПФ 1-го уровня, при втором проходе - ПФ 2-го уровня, и так далее. Цикл останавливался, когда очередная итерация не производила ни одного update - это означало что все, что можно вычислить - вычислено. Далее из полного массива ГП выбирал только интересующие позиции (в моем случае join с прогнозом продаж). На объеме порядка 20 000 строк BOM, расчет выполялся считанные секунды. Еще раз убедился, что итерации с последовательным приближением - быстрее рекурсии, да и по вычислительным ресурсам более прогнозируемо. Если кому интересно - могу подарить расчет. Там еще учитывались технологические отходы, потери сырья, и вторым проходом распределялись FIC - тоже в SQL. В итоге получались несколько составляющих себестоимости - материальная и полная. Конечно, код немного специфичен для заказчика, и поскольку полностью отсутствуют циклы по курсорам (все реализовано матричными операциями на чистом SQL), код не вполне очевиден, зато фантастически быстр. Я люблю SQL...
Последний раз редактировалось Индра; 08.02.2011 в 19:35. |
|
![]() |
#2 |
Участник
|
Цитата:
Не знаю, может не в тему.
Если ПФ - это полуфабрикат или сырье. А исходная таблица для всех специфивкаций предприятия имеет 3 колонки : РодительПФ , РебенокПФ , Количество То тогда понятно , что хранимая процедура это запрос в цикле. И мы получаем поуровневый обход графа. ПФ1,ПФ2 и т.д. Что мы при этом высчитываем не так важно. Так вот представьте , что у Вас в исходной таблице 1 000 000 строк , уровней графа -20 , возможны зацикливания и вы в своей хранимой процедуре ОБЯЗАНЫ не просто отбрасывать (игнорировать) зацикленные ветки (Родитель является ребенком) , но и представить пользователю работающему со спецификациями удобный интерфейс для исправления ошибок зацикливания . Возможно, Ваш взгляд на саму эту задачу и достигнутые Вами фантастические скорости изменится самым радикальным образом. Последний раз редактировалось Ish_2; 14.02.2011 в 14:31. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|