|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
важаемые форумчане, всем добрый день! Возникла конкретная задача, над решением которой в Acess бьюсь уже очень долго, но видимо из-за недостаточного опыта без помощи уже не обойтись: Условие задачи: Имеется выгрузка по работе сотрудников на производстве по каждому конкретному периоду. Выгрузка имеет вид: 1. Логин (ключ) - уникальный номер идентификации сотрудника 2. Дата (дата) - дата 3. Смена (текст) - указание на время по "счетчику" в системе. имеет 2 значения: день/ночь 4. Участок (текст) - указание на участок работ (имеет всего 8 возможных значений) 5. Объем (числовой) - объем выполненных работ. В рамках одних суток, один логин может иметь до 16 записей (сотрудник может перемещаться и выполнять работы во всех зонах, при этом работая на стыке день/ночь) Ранее начисление по сдельной системе оплаты имело очень простой Вид: Каждая зона имела конкретную стоимость (в зависимости от сложности). Премия начислялась по тарифам, но при условии, что СОВОКУПНЫЙ объем выполненных работ сотрудникам за сутки превышал установленную норму. Теперь, для более справедливого начисления есть необходимость ввести градацию порога выполненных работ в зависимости от стажа (в сменах). Так как начисления призводятся на каждую смену в отдельности и необходимо иметь исторические данные для анализа, единственным верным решением оказалось ввести счетчик смен в этой же базе, опираясь на данные системной выгрузки. Условия вычисления формулы просты: По каждому логину просматривается дата, и к этой дате возвращается количество уникальных записей по полям Логин и дата, с условием, что Дата в возвращаемых полях будет меньше, чем в вычисляемом столбце. После тщетных попыток решить это на базе аксесс, решил попробовать протестировать логику в экселе. Получилось не слишком "изящное", но достаточно быстрое решение с 1 вспом.таблицей и 1м доп. столбцом. Теперь использую этот файл в качестве контрольного, но в аксессе в построителе выражений все никак не могу повторить такой "финт ушами". в целом, если в урезанном виде, свел тестовую БД без справочников до 1й таблицы, в качестве примера, думаю, подойдет. Вот что необходимо: В запросе "Детализация" должен быть подробный отчет, безо всяких группировок, и он должен отражать все поля из таблицы "объем" + доп. поле "смена" с той логикой, которую я описал выше. На данный момент у меня получилось следующее: Через формулу: Код: plsql 1.
Коряво, конечно, но все же базовая логика работает :) У меня получилась: Такая таблицаКод Логин Дата День/Ночь Участок Объем смена1 11706016 01.03.2018 день 11B 74 02 11706016 01.03.2018 день 11A 93 03 11706016 01.03.2018 день 11F 1058 04 11706016 01.03.2018 ночь 11F 55 05 11706016 02.03.2018 день 11F 1092 46 11706016 02.03.2018 день 11A 195 47 11706016 02.03.2018 ночь 11F 5 48 11706016 03.03.2018 день 11K 52 79 11706016 03.03.2018 день 11Y 6 710 11706016 03.03.2018 день 11A 143 711 11706016 03.03.2018 день 11F 1426 712 11706016 03.03.2018 день 11M 2 713 11706016 03.03.2018 ночь 11F 56 714 11706016 03.03.2018 день 11W 61 715 11706016 04.03.2018 день 11F 1248 1416 11706016 04.03.2018 ночь 11F 22 1417 11706016 04.03.2018 день 11A 37 14 А необходимо, чтобы получилась: Вот такая таблицаКод Логин Дата День/Ночь Участок Объем смена1 11706016 01.03.2018 день 11B 74 02 11706016 01.03.2018 день 11A 93 03 11706016 01.03.2018 день 11F 1058 04 11706016 01.03.2018 ночь 11F 55 05 11706016 02.03.2018 день 11F 1092 16 11706016 02.03.2018 день 11A 195 17 11706016 02.03.2018 ночь 11F 5 18 1170601603.03.2018 день 11K 52 29 11706016 03.03.2018 день 11Y 6 210 11706016 03.03.2018 день 11A 143 211 11706016 03.03.2018 день 11F 1426 212 11706016 03.03.2018 день 11M 2 213 11706016 03.03.2018 ночь 11F 56 214 11706016 03.03.2018 день 11W 61 215 11706016 04.03.2018 день 11F 1248 316 11706016 04.03.2018 ночь 11F 22 317 11706016 04.03.2018 день 11A 37 3 И тут у меня ступор, как в том старом анекдоте: "Вижу, что Шарик, понимаю, что Шарик, но ничего сделать не могу..." Я понимаю, что тут не хватает части формулы, которая укажет на то, что считать надо только уникальные вхождения по признакам Логин+Дата, но мне не хватает какого-то элементарного знания, чтобы допилить логику. Заранее спасибо неравнодушным. На всякий случай прилагаю урезанную БД без справочников и прочего, только вырезка на 1500 строк из таблицы, над которой необходимо произвести манипуляцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:04 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
ivgeorge, а в чем разница между тем, что получилось и должно получиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:17 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
Озверин, Разница в поле "смена". В той таблице, которую я нашаманил, мой счетчик отщелкивает между датами 1.03.2018 и 02.03.2018 4 значения. И получается, что у меня сотрудник за 1 день отработал 4 смены :), а все потому, что человек в течении 1х суток успел поработать на нескольких участках. Ну и далее логика работает в том же ключе. А мне необходимо, чтобы он учитывал для каждой даты только 1 уникальное вхождение по признакам Логин+Дата. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:26 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
ivgeorge,аа..понял. Ну у меня в голове сложился немного сложный запрос Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:31 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
ivgeorge, лучше, конечно, сделать отдельный запрос c группировкой вида: логин, дата, кол-во записей на эту дату. И потом уже с этим запросом будет проще играть в стиле: Код: sql 1. 2.
А сам доп запрос: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:39 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
Озверин, Прогнал сейчас запрос на тестовой БД как есть 1й запрос - вроде работает и считает все правильно! Спасибо огромное! Однако же, не праздного интереса ради, а для того, чтобы знания эти применять дальше на практике без бездумного копирования есть еще вопрос: о0,о1 и о2 - это что за звери такие? вроде бы вместо них в запросе указываются названия таблиц, но на удивление, Аксесс все понял. Если не сложно, буду очень благодарен за пояснение Ваших действий, так как не хотелось бы бездумно "скатать код", и бояться потом тронуть его :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 16:51 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
ivgeorge, это alias ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 17:02 |
|
Реализация "счетчика" на базе Acess
|
|||
---|---|---|---|
#18+
ivgeorge, я понял, вас смутило отсутствие AS. Для таблиц не обязательно перед alias ставить AS ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2018, 17:03 |
|
|
start [/forum/topic.php?fid=45&fpage=49&tid=1611358]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 23ms |
total: | 177ms |
0 / 0 |