PDA

Показать полную графическую версию : Расчет сроков поставки


Delirium
25-04-2013, 11:17
Задам вопрос здесь, т.к. теоретиков и практиков по логическому мышлению здесь больше всего :)

Стоит задача автоматизировать расчет сорванных сроков поставок товаров, точнее вывод разницы в сроках в днях. Для того, чтобы было понятней, прикладываю файлик в Excel.
Частично я задачу решил, но когда наткнулся на некоторые условия, зашел в тупик.

Поставки разбиты помесячно.
Итак, допустим по плану поставка должна быть 05.01.2013. В феврале поставок не намечалось.
Фактически в январе ничего не поставили, а в феврале поставили за январь. Получается, мы должны посчитать разницу в днях за январь + количество дней до поставки в феврале. (Я выделил красным на листе этот вариант)
А может быть так, что по плану поставка должна быть в феврале, а по факту еще вообще ничего не было. Надо тоже как то считать.

В Excel я сделал примерный набросок, которой работает корректно во всех случаях, кроме описанного мною первого случая.

Прошу совета, и речь не идет о какой то унифицированной формуле, а скорее о теоретической форме расчета, которую потом можно будет переложить на C#.

lxa85
25-04-2013, 13:23
Delirium, посмотрел табличку. Первая мысль - у тебя не нормализована форма что ли. Ну т.е. не хватает еще одной колонки, чтобы получить полностью определенную запись в базе денных. Хм... поясню из далека.
Беру в пример 11ую строку. Спецификацией определены две поставки по ID 5001397 в январе и в марте. Как определить, какой приход товара (январский или мартовский)
был в апреле (ну перенесем дату с февраля для большей наглядности)? Ответ - никак. Можно конечно взять предположение, что поставки закрываются в порядке поступления, но сам понимаешь - в жизни это далеко не факт.
Подожди, но при работе с поставщиками и со складским учетом есть сквозные номера отчетности? + опять же поставка может быть не полной. Или это сейчас не рассматривается?
Т.е. ИМХО должны быть только две даты. Дата конкретного заказа, и дата его привоза. В базе данных (сейчас я больше в них) id, data_spec, data_fact.
Это основное. Дальше можно будет внести еще одно поле, например номер договора, в рамках которого осуществляется ежеквартальная отгрузка товара. Нууу и еще + одно для описания подробностей. Например частичной отгрузки.

Delirium
25-04-2013, 15:51
lxa85, это лишь часть из базы, показанная для сравнения. На самом деле там порядка 200 колонок с десятками других дат :). В данном случае надо отследить именно срыв поставки в разрезе таких дат. Поставка одна, т.е. после торгов, например, планируется поставить 24 единицы товара, по 2 каждый месяц. Да, бывает так, что в январе не поставят 2, а в феврале поставят сразу 4. Но январский срок все равно считается просроченным, а февральский нет(если конечно в феврале не поставили позже февральского срока). Это такая специфика расчетов в данном случае.

lxa85
25-04-2013, 19:03
Delirium, мы друг друга поняли :)
В любом случае, нужен какой-то параметр "принципиально отличающий"крутон от гренки одну поставку от другой.
Это должны быть различные строки базы данных.
Посмотри, возможно будет целесообразно сделать "Представление", т.е. краткую выборку, по которой искать срывы сроков поставки.

Delirium
26-04-2013, 01:52
Это должны быть различные строки базы данных. »
К сожалению, нет :) Одна строка - 1 позиция. Весь список (порядка 10 000 позиций) импортируется из жестокого xls файла, и потом с ним приходится работать.
Представление я бы сделал, если бы понял, какое.
Пока что идея примерно такая:

Берем текущий месяц(скажем, апрель), ищем в спецификации ближайшую дату поставки от СЕГОДНЯ до начала года по месяцам
1) Если нет дат в спецификации, значит поставок не запланировано и отклонения нет.
2) Если нашли(допустим, март) в спецификации
2.1) Смотрим факт за март, если есть - считаем разницу
2.2) Если факта за март нет, обходим месяцы по убывающей и ищем ближайшую поставку. Если ничего нет, берем день текущего месяца и считаем разницу.
3) Ищем следующий, более ранний месяц, и далее по кругу.

pva
27-04-2013, 22:44
переменная "дата поставки" = NULL
для каждого месяца:
если есть поставка по спецификации, то дата поставки = поставка по спецификации;
если дата поставки не NULL и дата поставки < факт за месяц, то срыв = факт за месяц - дата поставки, дата поставки = NULL;
иначе срыв = NULL




© OSzone.net 2001-2012