важаемые форумчане, всем добрый день!
Возникла конкретная задача, над решением которой в Acess бьюсь уже очень долго, но видимо из-за недостаточного опыта без помощи уже не обойтись:
Условие задачи:
Имеется выгрузка по работе сотрудников на производстве по каждому конкретному периоду. Выгрузка имеет вид:
1. Логин (ключ) - уникальный номер идентификации сотрудника
2. Дата (дата) - дата
3. Смена (текст) - указание на время по "счетчику" в системе. имеет 2 значения: день/ночь
4. Участок (текст) - указание на участок работ (имеет всего 8 возможных значений)
5. Объем (числовой) - объем выполненных работ.
В рамках одних суток, один логин может иметь до 16 записей (сотрудник может перемещаться и выполнять работы во всех зонах, при этом работая на стыке день/ночь)
Ранее начисление по сдельной системе оплаты имело очень простой Вид:
Каждая зона имела конкретную стоимость (в зависимости от сложности). Премия начислялась по тарифам, но при условии, что СОВОКУПНЫЙ объем выполненных работ сотрудникам за сутки превышал установленную норму. Теперь, для более справедливого начисления есть необходимость ввести градацию порога выполненных работ в зависимости от стажа (в сменах).
Так как начисления призводятся на каждую смену в отдельности и необходимо иметь исторические данные для анализа, единственным верным решением оказалось ввести счетчик смен в этой же базе, опираясь на данные системной выгрузки.
Условия вычисления формулы просты:
По каждому логину просматривается дата, и к этой дате возвращается количество уникальных записей по полям Логин и дата, с условием, что Дата в возвращаемых полях будет меньше, чем в вычисляемом столбце.
После тщетных попыток решить это на базе аксесс, решил попробовать протестировать логику в экселе. Получилось не слишком "изящное", но достаточно быстрое решение с 1 вспом.таблицей и 1м доп. столбцом. Теперь использую этот файл в качестве контрольного, но в аксессе в построителе выражений все никак не могу повторить такой "финт ушами".
в целом, если в урезанном виде, свел тестовую БД без справочников до 1й таблицы, в качестве примера, думаю, подойдет.
Вот что необходимо:
В запросе "Детализация" должен быть подробный отчет, безо всяких группировок, и он должен отражать все поля из таблицы "объем" + доп. поле "смена" с той логикой, которую я описал выше.
На данный момент у меня получилось следующее:
Через формулу:
DCount("[Объем]![Логин]";"[Объем]";"[Логин] ='" & [Объем]![Логин] & "'AND [Дата]<" & Format([Объем]![Дата];"\#mm/dd/yyyy\#"))*1
Коряво, конечно, но все же базовая логика работает :)
У меня получилась:
+ Такая таблица |
Код | Логин | Дата | День/Ночь | Участок | Объем | смена | 1 | 11706016 | 01.03.2018 | день | 11B | 74 | 0 | 2 | 11706016 | 01.03.2018 | день | 11A | 93 | 0 | 3 | 11706016 | 01.03.2018 | день | 11F | 1058 | 0 | 4 | 11706016 | 01.03.2018 | ночь | 11F | 55 | 0 | 5 | 11706016 | 02.03.2018 | день | 11F | 1092 | 4 | 6 | 11706016 | 02.03.2018 | день | 11A | 195 | 4 | 7 | 11706016 | 02.03.2018 | ночь | 11F | 5 | 4 | 8 | 11706016 | 03.03.2018 | день | 11K | 52 | 7 | 9 | 11706016 | 03.03.2018 | день | 11Y | 6 | 7 | 10 | 11706016 | 03.03.2018 | день | 11A | 143 | 7 | 11 | 11706016 | 03.03.2018 | день | 11F | 1426 | 7 | 12 | 11706016 | 03.03.2018 | день | 11M | 2 | 7 | 13 | 11706016 | 03.03.2018 | ночь | 11F | 56 | 7 | 14 | 11706016 | 03.03.2018 | день | 11W | 61 | 7 | 15 | 11706016 | 04.03.2018 | день | 11F | 1248 | 14 | 16 | 11706016 | 04.03.2018 | ночь | 11F | 22 | 14 | 17 | 11706016 | 04.03.2018 | день | 11A | 37 | 14 |
|
|
А необходимо, чтобы получилась:
+ Вот такая таблица |
Код | Логин | Дата | День/Ночь | Участок | Объем | смена | 1 | 11706016 | 01.03.2018 | день | 11B | 74 | 0 | 2 | 11706016 | 01.03.2018 | день | 11A | 93 | 0 | 3 | 11706016 | 01.03.2018 | день | 11F | 1058 | 0 | 4 | 11706016 | 01.03.2018 | ночь | 11F | 55 | 0 | 5 | 11706016 | 02.03.2018 | день | 11F | 1092 | 1 | 6 | 11706016 | 02.03.2018 | день | 11A | 195 | 1 | 7 | 11706016 | 02.03.2018 | ночь | 11F | 5 | 1 | 8 | 11706016 | 03.03.2018 | день | 11K | 52 | 2 | 9 | 11706016 | 03.03.2018 | день | 11Y | 6 | 2 | 10 | 11706016 | 03.03.2018 | день | 11A | 143 | 2 | 11 | 11706016 | 03.03.2018 | день | 11F | 1426 | 2 | 12 | 11706016 | 03.03.2018 | день | 11M | 2 | 2 | 13 | 11706016 | 03.03.2018 | ночь | 11F | 56 | 2 | 14 | 11706016 | 03.03.2018 | день | 11W | 61 | 2 | 15 | 11706016 | 04.03.2018 | день | 11F | 1248 | 3 | 16 | 11706016 | 04.03.2018 | ночь | 11F | 22 | 3 | 17 | 11706016 | 04.03.2018 | день | 11A | 37 | 3 |
|
|
И тут у меня ступор, как в том старом анекдоте: "Вижу, что Шарик, понимаю, что Шарик, но ничего сделать не могу..."
Я понимаю, что тут не хватает части формулы, которая укажет на то, что считать надо только уникальные вхождения по признакам Логин+Дата, но мне не хватает какого-то элементарного знания, чтобы допилить логику.
Заранее спасибо неравнодушным.
На всякий случай прилагаю урезанную БД без справочников и прочего, только вырезка на 1500 строк из таблицы, над которой необходимо произвести манипуляцию.
http://www.sql.ru/forum/1296639/realizaciya-schetchika-na-baze-acess