powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Реализация "счетчика" на базе Acess
9 сообщений из 9, страница 1 из 1
Реализация "счетчика" на базе Acess
    #39663693
ivgeorge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
важаемые форумчане, всем добрый день!

Возникла конкретная задача, над решением которой в Acess бьюсь уже очень долго, но видимо из-за недостаточного опыта без помощи уже не обойтись:

Условие задачи:

Имеется выгрузка по работе сотрудников на производстве по каждому конкретному периоду. Выгрузка имеет вид:

1. Логин (ключ) - уникальный номер идентификации сотрудника
2. Дата (дата) - дата
3. Смена (текст) - указание на время по "счетчику" в системе. имеет 2 значения: день/ночь
4. Участок (текст) - указание на участок работ (имеет всего 8 возможных значений)
5. Объем (числовой) - объем выполненных работ.

В рамках одних суток, один логин может иметь до 16 записей (сотрудник может перемещаться и выполнять работы во всех зонах, при этом работая на стыке день/ночь)

Ранее начисление по сдельной системе оплаты имело очень простой Вид:

Каждая зона имела конкретную стоимость (в зависимости от сложности). Премия начислялась по тарифам, но при условии, что СОВОКУПНЫЙ объем выполненных работ сотрудникам за сутки превышал установленную норму. Теперь, для более справедливого начисления есть необходимость ввести градацию порога выполненных работ в зависимости от стажа (в сменах).
Так как начисления призводятся на каждую смену в отдельности и необходимо иметь исторические данные для анализа, единственным верным решением оказалось ввести счетчик смен в этой же базе, опираясь на данные системной выгрузки.

Условия вычисления формулы просты:
По каждому логину просматривается дата, и к этой дате возвращается количество уникальных записей по полям Логин и дата, с условием, что Дата в возвращаемых полях будет меньше, чем в вычисляемом столбце.

После тщетных попыток решить это на базе аксесс, решил попробовать протестировать логику в экселе. Получилось не слишком "изящное", но достаточно быстрое решение с 1 вспом.таблицей и 1м доп. столбцом. Теперь использую этот файл в качестве контрольного, но в аксессе в построителе выражений все никак не могу повторить такой "финт ушами".

в целом, если в урезанном виде, свел тестовую БД без справочников до 1й таблицы, в качестве примера, думаю, подойдет.

Вот что необходимо:

В запросе "Детализация" должен быть подробный отчет, безо всяких группировок, и он должен отражать все поля из таблицы "объем" + доп. поле "смена" с той логикой, которую я описал выше.

На данный момент у меня получилось следующее:

Через формулу:

Код: plsql
1.
DCount("[Объем]![Логин]";"[Объем]";"[Логин] ='" & [Объем]![Логин] & "'AND [Дата]<" & Format([Объем]![Дата];"\#mm/dd/yyyy\#"))*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 строк из таблицы, над которой необходимо произвести манипуляцию.
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663698
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivgeorge, а в чем разница между тем, что получилось и должно получиться?
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663709
ivgeorge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин, Разница в поле "смена". В той таблице, которую я нашаманил, мой счетчик отщелкивает между датами 1.03.2018 и 02.03.2018 4 значения. И получается, что у меня сотрудник за 1 день отработал 4 смены :), а все потому, что человек в течении 1х суток успел поработать на нескольких участках. Ну и далее логика работает в том же ключе. А мне необходимо, чтобы он учитывал для каждой даты только 1 уникальное вхождение по признакам Логин+Дата.
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663715
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivgeorge,аа..понял. Ну у меня в голове сложился немного сложный запрос

Код: sql
1.
2.
3.
4.
5.
6.
SELECT o0.Код, o0.Логин, o0.Дата, o0.[День/Ночь], o0.Участок, o0.Объем, 
(SELECT count(*) 
FROM (SELECT o1.Логин, o1.Дата FROM ОБъем o1 GROUP BY o1.Логин, o1.Дата) AS o2
WHERE o2.Дата < o0.Дата AND o2.Логин = o0.Логин  
) AS Смена
FROM объем o0
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663719
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivgeorge, лучше, конечно, сделать отдельный запрос c группировкой вида: логин, дата, кол-во записей на эту дату. И потом уже с этим запросом будет проще играть в стиле:

Код: sql
1.
2.
SELECT o0.логин, o0.дата, (select sum(o1.cnt) from qry o1 WHERE o1.Логин = o0.Логин AND o1.Дата<o0.Дата)
FROM Объем o0



А сам доп запрос:

Код: sql
1.
2.
3.
SELECT Логин, Дата, 1 AS cnt
FROM Объем
GROUP BY Логин, Дата
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663727
ivgeorge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин, Прогнал сейчас запрос на тестовой БД как есть 1й запрос - вроде работает и считает все правильно!

Спасибо огромное!

Однако же, не праздного интереса ради, а для того, чтобы знания эти применять дальше на практике без бездумного копирования есть еще вопрос:

о0,о1 и о2 - это что за звери такие? вроде бы вместо них в запросе указываются названия таблиц, но на удивление, Аксесс все понял. Если не сложно, буду очень благодарен за пояснение Ваших действий, так как не хотелось бы бездумно "скатать код", и бояться потом тронуть его :)
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663736
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivgeorge, это alias
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663737
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivgeorge, я понял, вас смутило отсутствие AS. Для таблиц не обязательно перед alias ставить AS
...
Рейтинг: 0 / 0
Реализация "счетчика" на базе Acess
    #39663739
ivgeorge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое еще раз.

Направление мысли теперь у меня есть и работающий пример перед глазами! Буду пытаться освоить прием )
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Реализация "счетчика" на базе Acess
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]