Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Распределение чисел

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
rebel25
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 06.10.2008
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Ср Окт 26, 2011 13:17    Заголовок сообщения: Распределение чисел Ответить с цитатой

declare @plan table (id int IDENTITY(1,1) NOT NULL, days_plan int NULL);

insert into @plan (days_plan) values (7);
insert into @plan (days_plan) values (14);

declare @rest table (id int IDENTITY(1,1) NOT NULL, days_rest int NULL);

insert into @rest (days_rest) values (-3);
insert into @rest (days_rest) values (7);
insert into @rest (days_rest) values (19);
insert into @rest (days_rest) values (28);

В таблице @plan могут числа 7,14,21,28 - это дни плановых отпусков
В таблице @rest могут быть положительные и отрицательные целые числа- это остатки отпусков по периодам.

Нужно распределить плановые отпуска по периодам - Из таблицы @plan последовательно считываются числа. Каждое число нужно распределить по строкам таблицы @rest так чтобы сумма чисел @rest равнялась этому числу. Строки @rest можно разбивать.
Поясню на примере.

Берётся число 7
1-я строка @rest: 7 - - 3 осталось 10 - т к число из @rest отрицательное - оно увеличит количество остатка, но из него самого вычесть нечего.
2-я строка @rest: 10 - 7 осталось 3
3-я строка @rest: 3 - 19 Здесь 7 закончилось, и осталось 16.
Берём следующее число 14
3-я строка @rest: 14 - 16 Здесь закончилось 14, и осталось 2
3-я строка @rest: 2 если дальше чисел в @plan нет - записываем оставшийся остаток с id строки 3
4-я строка @rest: 28 на последнюю строку распределять нечего, она остаётся без изменений.

Итак, на выходе:

ID rezult
1 | -3
2 | 7
3 | 3
----------------------7
3 | 14
---------------------14
3 | 2
4 | 28
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Чт Окт 27, 2011 13:45    Заголовок сообщения: Ответить с цитатой

Что-то нифигашеньки не поняла Smile
Почему в большинстве строк от остатка отнимается @rest, а когда берётся 14, то от 14 отнимается 16, а не наоборот?
И вообще непонятно, для чего это нужно, что должно быть на выходе и в чём, собственно, вопрос? Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DUCKKK
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 16.09.2009
Сообщения: 1680

СообщениеДобавлено: Пт Окт 28, 2011 09:53    Заголовок сообщения: Ответить с цитатой

Это, наверное, просто похвастаться .... Или поговорить.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
rebel25
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 06.10.2008
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Пт Окт 28, 2011 15:12    Заголовок сообщения: Ответить с цитатой

Непосредственные руководители сотрудников не работают с босс-м и заполняют план отпусков своих работников в файле excel.
Этот файл закачивается в босс и автоматически проставляются периоды и остатки по ним.
Далее отчет выдает сотрудников у которых перебор или недобор дней отпусков. Эта информация передается обратно линейным руководителям.
Они корректируют плановые отпуска и передают файл на повторную закачку.
У меня проблема с вычислением остатка за каждый период. Алгоритм я не знаю и в примере правильные только итоговые цифры.

Нужно последовательно брать дни плановых отпусков по каждому работнику и распределять каждый из них по периодам лет этого работника, в которых есть перебор или недобор дней отпусков.

Проще говоря мне нужно заполнить периоды и остатки так как они сейчас заполняются при вводе одного отпуска, но сделать это автоматически из файла для контроля перебора дней и для облегчения ввода этих данных в программу.
Меня бы устроило использование тиражного алгоритма, хотя он мне не совсем понятен и работает не очень надежно.
Если делать это самостоятельно, то знающие люди посоветовали использовать рекурсию СТЕ...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
zhenya17



Зарегистрирован: 04.02.2009
Сообщения: 190
Откуда: Кемерово

СообщениеДобавлено: Сб Окт 29, 2011 06:28    Заголовок сообщения: Ответить с цитатой

Дело в том, что алгоритм распределения по периодам (если речь о периодах, за который предоставляется отпуск) проще Вашего. Проще он в том, что у Вас написано, что существуют периоды 7,14,21 и 28 дней, но в жизни у конкретного сотрудника только одно количество дней, а не 4 варианта. Например, у меня стандартно лишь 28 дней в периоде (= в году) и чтобы распределить мои отпуска, не нужно перебирать все остальные значения.
В таком случае алгоритм будет примерно следующий:
1) Ищем кол-во положенных дней отпуска (КДО) сотрудника.
2) Перебираем каждый плановый отпуск и пихаем его в первый свободный период. По следующему алгоритму:
Код:
Если Дней <= ООП№, то
   * В период=№ записываем Дней
   * Если Дней = ООП№, то №=№+1, ООП№=КДО, иначе ООП№=ООП№-Дней
Иначе
   * В период=№ записываем ООП№ дней
   * Дней = Дней - ООП№ (высчитываем остаток дней, которые уйдут в след.период)
   * №=№+1
   * В период=№ записываем Дней
   * ООП№ = КДО - Дней


Пример: Пусть у сотрудника 28 дней, остаток отпуска -3 дня.
Допустим, человеку напланировали отпусков с запасом на 14, 14 и 23 дня.
Код:
1. №=1, остаток отпуска в периоде1 (ООП1) = 28 - 3 = 25 дней
2. 14 <= 25? Да, тогда
   * В период1 записываем 14 дней
   * ООП1 = 25-14 = 11
3. 14 <= 11? Нет, тогда
   * В период1 записываем 11 дней
   * Дней = 14-11 = 3
   * №=1+1 = 2
   * В период2 записываем 3 дня
   * ООП2 = 28 - 3 = 25 дней
4. 23 <= 25? Да, тогда
   * В период2 записываем 23 дня
   * ООП1 = 25-23 = 2


Итого на выходе получится:
период1 - 14 дней
период1 - 11 дней
период2 - 3 дня
период2 - 23 дня

В общем, как-то так. Единственный минус алгоритма - это если количество плановых дней отпуска больше КДО. Например, поставили в план 70 дней отпуска при положенных 28 днях... тогда алгоритм сработает не совсем верно и в этом блоке можно было бы доавить рекурсию. Но такие отпуска скорее фантазия, чем реальность.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
rebel25
Большой шоколадный орден
Большой шоколадный орден


Зарегистрирован: 06.10.2008
Сообщения: 578
Откуда: Москва

СообщениеДобавлено: Ср Ноя 02, 2011 11:48    Заголовок сообщения: Ответить с цитатой

Спасибо, в итоге получилось ещё проще.

if object_id('tempdb..#vst') IS NOT NULL then DROP TABLE #vst;
create table #vst (days int);

let pl_ = 28; --дней планового отпуска
let sm_ = 0;
--положено минус отгуляно
SCAN @OT --не использованные дни отпусков по периодам
select -3
union all
select 7
union all
select 19
union all
select 28
Execute
{
select sum(isnull(days,0)) into :sm_ from #vst;
return pl_ - sm_,@OT:1['];
IF (pl_ - sm_) < @OT:1['] then {insert into #vst (days) values (pl_ - sm_); goto end_;} else if (pl_ - sm_) > @OT:1['] then {insert into #vst (days) values (@OT:1[']); };
};
end_: ;

На выходе -3,7,19,5. Эти результаты я вставлю в закачанный плановый отпуск по соответствующим периодам и перейду к следующему.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU