901 / 291 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
1

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

22.07.2016, 08:58. Показов 1201. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем.
У меня уже в третий раз за последнее время образовалась задачка, в чем-то похожая на прошлые мои вопросы, но опять же, имеющая отличия, которые меня сбивают с мысли...

Ситуация:
Имеются работники, которым в месяц начисляется определенная сумма зарплаты по ставке. Ставка с течением времени может изменяться.

Соответственно, имеются таблицы:
1. Таблица Работники (поля КодРаботника, ФИО, ДатаПринятия)
2. Таблица ИсторияСтавок (поля КодРаботника, ДатаНачалаСтавки, СуммаНаМесяц)

То есть для каждого работника мы ведем историю изменения суммы его зарплаты по ставке.

И имеется форма, на которой есть поле ДатаКонца. В данное поле вводится какая-нибудь расчетная дата, по состоянию на которую нужно, исходя из имеющихся данных указанных выше таблиц рассчитать ПОЛНУЮ сумму зарплаты по ставке для каждого работника (начиная от даты принятия и заканчивая датой, указанной в форме. То есть сумма должна рассчитываться пропорционально дням в месяце.

Если, например, работник принят 01.01.2016, и в форме указали дату "12.04.2016", то нужно рассчитать общую сумму зарплаты данного работника, начиная от 01.01.2016 (то есть три полных месяца, начиная с января) - и за 12 дней апреля. При этом учитывая данные из истории ставок данного работника.
То есть, если у него с 01.01.2016 была з/п 5000, с 01.03.2016 - 7000, с 01.04.2016 - 10000, то в итоге мы должны получить:
5000 (январь) + 5000 (февраль) + 7000 (март) + (10000/30 дней * 12 дней = 4000) = 21000 по состоянию на 12.04.2016.

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

Мне кажется, что выстроить подсчет только с помощью запросов будет сложно, может, имеет смысл как-то выполнять эти рассчеты в VBA?.. И уже результаты заносить во временную таблицу?..
Или все-таки здесь тоже возможно построить какой-нибудь хитрый запрос (с использованием самописных функций и т.д.)?

Базу с описанными таблицами и формой прилагаю на всякий случай.

Буду очень признателен за идеи и советы)
Вложения
Тип файла: rar Database.rar (21.1 Кб, 3 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2016, 08:58
Ответы с готовыми решениями:

Снова построение запроса с учетом дат
Добрый день всем. Совсем недавно я здесь создавал тему, в которой нужно было запросом определить...

Создание запроса в MS Access для вывода интервала дат с учетом пересечения этих интервалов
Доброго времени суток дамы и господа как то на этом форуме мне очень помогли с задачей похожего...

Проверка периодов дат на пересечение.
Есть база 'Склад', в которую заносятся даты периода проката товаров. 1дата - когда берут, 2дата -...

Хранение периодов дат. И работа с ними.
Есть необходимость проверять какой лимит был у абонента в том или ином месяце. В работе должно...

5
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
22.07.2016, 09:33 2
Если бы была еще таблица с перечнем всех вообще дат с самой ранней даты приема на работу до самой поздней даты, до которой нужно сичтать начисления, то я бы делала так:

0) В таблице ИсторияСтавок нужно кроме даты начала получить дату конца действия каждой ставки. С точки зрения нормализации бази данных правильно это вычислять запросом, но я бы сделала поле и перед начислением заполняна/проверяла корректность заполнения.

1) каждой дате в заданном интервале сопоставила число дней в соответствующем месяце (формула), ставку (JOIN ИсторияСтавок он дата between ДатаНачалаСтавки and ДатаКонцаСтавки) и получила бы сумму за день

2) просуммировать результат п. 1
1
901 / 291 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
22.07.2016, 11:00  [ТС] 3
texnik-san, Примерно о чем-то похожем я думал... Но как-то считать за КАЖДЫЙ ДЕНЬ диапазона... Вот смущает меня это, не знаю...
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
23.07.2016, 02:04 4
Лучший ответ Сообщение было отмечено Kkarn как решение

Решение

Kkarn, смотрите вариант. Выполнен в коде (процедура calcStavka) с использованием запроса z2. В цикле по записям запроса создается цикл по месяцам от даты самой первой ставки до даты из формы, рассчитываются количество дней в месяце с учетом для заданной даты ставки и находится сумма. Сумма записывается во ВременнаяТаблицаРезультатов. В начале процедуры эта таблица очищается.
Функция dateCalc сделана для удобства работы с запросом и процедурой calcStavka. Она считывает дату из формы, если форма открыта или задает текущую дату, если формы нет на столе или пустое поле даты.
Вложения
Тип файла: rar Database160723.rar (28.4 Кб, 12 просмотров)
2
901 / 291 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
23.07.2016, 08:35  [ТС] 5
mobile, Спасибо огромное! К сожалению, за компом буду уже завтра, тогда и смогу посмотреть Ваш вариант, но уже заранее уверен, что он подходит)))
0
901 / 291 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
25.07.2016, 11:56  [ТС] 6
mobile, Наконец-то добрался до компа, посмотрел Ваш вариант. Как я и думал - все супер и идеально подходит, так что еще раз большое Вам спасибо за скорость и качество ответа!
0
25.07.2016, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2016, 11:56
Помогаю со студенческими работами здесь

Оптимизация кода запроса, или как обойтись без запроса?
Здравствуйте! Решаю задачу по автоматизации отгрузки товаров. Надо для проведенным заказам...

Построение на диаграмме графика,состоящего из трех периодов треугольного равнобедренного зубца
построение на диаграмме графика,состоящего из трех периодов треугольного равнобедренного зубца...

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

Построение итерационных программ для обработки списков
Помогите, пожалуйста, написать 2 программы с использованием цикла loop) Заранее огромное спасибо))...

отдельный процесс для обработки каждого запроса
Создание клиент-серверных приложений под windows с установлением логического соединения (TCP/IP),...

Кроссбраузерность обработки кода или почему мой код работает только в Chrome ?
Доброго времени суток! есть у меня вот такой вот код <!DOCTYPE HTML> <html> <head> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru