Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Расчет сроков поставки (http://forum.oszone.net/showthread.php?t=259363)

Delirium 25-04-2013 11:17 2139278

Расчет сроков поставки
 
Вложений: 1
Задам вопрос здесь, т.к. теоретиков и практиков по логическому мышлению здесь больше всего :)

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

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

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

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

lxa85 25-04-2013 13:23 2139331

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

Delirium 25-04-2013 15:51 2139433

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

lxa85 25-04-2013 19:03 2139573

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

Delirium 26-04-2013 01:52 2139740

Цитата:

Цитата lxa85
Это должны быть различные строки базы данных. »

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

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


pva 27-04-2013 22:44 2140811

Код:

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



Время: 16:34.

Время: 16:34.
© OSzone.net 2001-