Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника / 25 сообщений из 30, страница 1 из 2
30.03.2020, 10:54
    #39942171
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Здравствуйте!

Применяя эту функцию в запросе к ДатеПриема на работу Сотрудника получаем последний (текущий) период. Подскажиите, пж, как получить все периоды с первого года работы?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function Otpusk(dtmDate As Date, intBeginEnd As Integer) As Date
dtmDate = DateSerial(Year(Date), Month(dtmDate), Day(dtmDate))
    If dtmDate <= Date Then
        Otpusk = dtmDate
    Else
        Otpusk = DateAdd("yyyy", -1, dtmDate)
    End If
    Select Case intBeginEnd
        Case 1
            Otpusk = Otpusk
        Case 2
            Otpusk = DateAdd("yyyy", 1, Otpusk) - 1
    End Select
End Function
...
Рейтинг: 0 / 0
30.03.2020, 11:20
    #39942178
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga

...получаем последний (текущий) период. Подскажиите, пж, как получить все периоды с первого года работы?...
Поясните:что есть "последний(текущий)период" и "все периоды с первого года работы?"
...
Рейтинг: 0 / 0
30.03.2020, 12:58
    #39942217
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Например:
1. Создаете и сохраняете запрос с именем Digits
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT TOP 1 0 AS digit FROM MSysObjects
UNION All
SELECT TOP 1 1 FROM MSysObjects
UNION All 
SELECT TOP 1 2 FROM MSysObjects
UNION All
SELECT TOP 1 3 FROM MSysObjects
UNION All
SELECT TOP 1 4 FROM MSysObjects
UNION All
SELECT TOP 1 5 FROM MSysObjects
UNION All
SELECT TOP 1 6 FROM MSysObjects
UNION All
SELECT TOP 1 7 FROM MSysObjects
UNION All
SELECT TOP 1 8 FROM MSysObjects
UNION ALL 
SELECT TOP 1 9 FROM MSysObjects;


2. Создаете запрос:
Код: sql
1.
2.
3.
4.
SELECT T.Сотрудник, T.ДатаПриема, DateAdd('yyyy',[nn].[n]-1,[T].[ДатаПриема]) AS ДатаС, (DateAdd('yyyy',[nn].[n],[T].[ДатаПриема])-1) AS ДатаПо
FROM (SELECT (D1.digit & D0.digit)+1 AS n FROM Digits AS D0, Digits AS D1)  AS NN, Таблица1 AS T
WHERE ((((DateAdd('yyyy',[nn].[n],[T].[ДатаПриема])-1))<=Date()))
ORDER BY T.Сотрудник, DateAdd('yyyy',[nn].[n]-1,[T].[ДатаПриема]);

Смотрите результат. Функция не нужна.

ЗЫ. Идея с Digits не моя. Спасибо одноклубникам.
...
Рейтинг: 0 / 0
30.03.2020, 14:52
    #39942260
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
sdku,

Последний(текущий) это буквально этот год , но с дня и месяца найма на работу. А все периоды я имею в виду года, начиная с самого первого года работы.
Это будут как бы отчетные года для отображения потом в отчете. Сколько дней отпуска в тот или иной отчётный год было использовано сотрудником.
...
Рейтинг: 0 / 0
30.03.2020, 15:15
    #39942272
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Кривцов Анатолий,

Класс, спасибо! Выводит периоды какие надо.
...
Рейтинг: 0 / 0
30.03.2020, 15:36
    #39942280
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Извиняюсь,

применил запрос в своей БД и увидел, что последний (текущий) период не показывает. Например, Иванов принят 02.02.2017, то выдает
01.02.2018
01.02.2019
01.02.2020 и все, а по идее февраль уже пройден и значит надо захватить уже следющий период тоже: 01.02.2021

Как подправить?
...
Рейтинг: 0 / 0
30.03.2020, 19:24
    #39942336
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga
Иванов принят 02.02.2017, то выдает
01.02.2018
01.02.2019
01.02.2020 и все, а по идее февраль уже пройден и значит надо захватить уже следющий период тоже: 01.02.2021

Как подправить?
В запросе условие: ДатаПо <= Date(). Переставьте это условие к полю ДатаС. Или оставьте как есть, но ДатаПо <= (Date() + 365).
...
Рейтинг: 0 / 0
30.03.2020, 23:49
    #39942389
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Без лишних сложностей как-то так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function period(pr) ' аргумент(pr)-дата приема на работу
Dim N, K, I
N = Format(pr, "dd.mm.")
For I = 0 To Year(Date) - Year(pr)
    If I = 0 Then
        Debug.Print "s " & N & Year(pr) + I & " po " & N & Year(pr) + 1
    Else
        Debug.Print "s " & Format(DateAdd("d", 1, pr), "dd.mm.") & Year(pr) + I & " po " & N & Year(pr) + 1 + I
    End If
Next
End Function

Код: vbnet
1.
2.
3.
4.
5.
?period("21.02.2017")
s 21.02.2017 po 21.02.2018
s 22.02.2018 po 21.02.2019
s 22.02.2019 po 21.02.2020
s 22.02.2020 po 21.02.2021
...
Рейтинг: 0 / 0
30.03.2020, 23:55
    #39942390
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
переменная К не использована,забыл убрать,предполагалась дата увольнения-тогда б она понадобилась
...
Рейтинг: 0 / 0
31.03.2020, 05:55
    #39942409
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
sdku
Код: vbnet
1.
Dim N, K, I

почему не типизированы?
...
Рейтинг: 0 / 0
31.03.2020, 10:15
    #39942455
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Большое спасибо за помощь!
Подправил в запросе, все ок! А вот функция у меня что-то возвращает пустые значения..
В примере три запроса:
1) с работающей функцией на Текущий период;
2) с работающим запросом на Все периоды;
3) функция на Все периоды не возвращает значения (хотелось бы чтобы заработала).
Просто еще не знаю, что будет мне удобней применить, функцию или запрос.
...
Рейтинг: 0 / 0
31.03.2020, 11:09
    #39942476
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Панург
sdku
Код: vbnet
1.
Dim N, K, I

почему не типизированы?
Потому что это пример,а не 100% выполнение некого задания-указание направления разработки.В "боевой" БД были бы типизированы
...
Рейтинг: 0 / 0
31.03.2020, 11:53
    #39942491
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga
3) функция на Все периоды не возвращает значения (хотелось бы чтобы заработала).
Просто еще не знаю, что будет мне удобней применить, функцию или запрос.
kniga, а в каком виде вы хотите получить из функции "все периоды"? Вот sdku методом Debug.Print вывалил вам данные в окно отладки. То же самое может вернуть функция, собрав это в строке.
Вас этот результат устраивает? Что вы с ним будете делать дальше?
Можно заполнить и вернуть двумерный массив. Вам этот термин знаком?
Сначала определитесь, как и где вы будете использовать "все периоды".
...
Рейтинг: 0 / 0
31.03.2020, 12:01
    #39942493
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga
...3) функция на Все периоды не возвращает значения (хотелось бы чтобы заработала).
Просто еще не знаю, что будет мне удобней применить, функцию или запрос.
Код, что приведен в качестве примера, ничего и не вернет-значение функции не вычисляется-только печатаются значения от и до периодов. Т.к неизвестно что Вы хотите делать далее с результатами работы функции-"допилите" сами-например если день и месяц приема больше соответствующих компонентов текущей даты надо на единицу уменьшать верхнюю границу цикла FOR.Наверно еще что нибудь
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function period(pr)
Dim N, K, I
N = Format(pr, "dd.mm.")
For I = 0 To Year(Date) - Year(pr)
    If I = 0 Then
        K = K & ", s " & N & Year(pr) + I & " po " & N & Year(pr) + 1
    Else
        K = K & ", s " & Format(DateAdd("d", 1, pr), "dd.mm.") & Year(pr) + I & " po " & N & Year(pr) + 1 + I
    End If
Next
period = Mid(K, 3)
End Function

Код: vbnet
1.
2.
?period("10.10.15")
s 10.10.2015 po 10.10.2016, s 11.10.2016 po 10.10.2017, s 11.10.2017 po 10.10.2018, s 11.10.2018 po 10.10.2019, s 11.10.2019 po 10.10.2020, s 11.10.2020 po 10.10.2021
...
Рейтинг: 0 / 0
31.03.2020, 12:04
    #39942494
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Кривцов Анатолий
...Сначала определитесь, как и где вы будете использовать "все периоды".
+100500
...
Рейтинг: 0 / 0
31.03.2020, 12:13
    #39942497
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
даже вернее так:(как видите процесс доработки кода всегда имеет место быть)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function period(pr)
Dim N, K, I
N = Format(pr, "dd.mm.")
For I = 0 To Year(Date) - Year(pr)
    If I = 0 Then
        K ="s " & N & Year(pr) + I & " po " & N & Year(pr) + 1
    Else
        K = K & ", s " & Format(DateAdd("d", 1, pr), "dd.mm.") & Year(pr) + I & " po " & N & Year(pr) + 1 + I
    End If
Next
period =К
End Function
...
Рейтинг: 0 / 0
31.03.2020, 14:40
    #39942553
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
автор а в каком виде вы хотите получить из функции "все периоды"?
Ну, в таком же виде как и с запроса. Просто в существующий запрос, который у меня работает с функц otpusk для текущ периода я попробовал добавить ваш Запрос и с первой атаки с шашкой наголо не получилось )) Буду конечно дальше пробовать. Думал если как функция будет, то проще в существующий запрос ее добавить к полю ДатаПриема )

Есть ещё в БД таблица с отпусками. Мне надо показать в отчёте сколько дней отпуска имел Сотрудник в каждом отчетном периоде с начала устройства на работу.
Сотрудник. ДатаПриема
Период1 (первый год работы). 25 дн
Дата отпуска 2 дн
Дата отпуска. 23 дн
Период2 (второй год работы). 35 дн
Дата отпуска. 30 дн
Дата отпуска. 5 дн
И т.д.
...
Рейтинг: 0 / 0
31.03.2020, 16:02
    #39942579
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga,
как вариант:
Написать процедуру, на основе предложенного кода,которая создаст(заполнит) временную таблицу а в ней Dlookup(ом)создать поля начало и конец отпуска для данного периода and конкретного клиента и использовать её(таблицу) в качестве источника для отчета(при закрытии отчета тбл.очищать)
...
Рейтинг: 0 / 0
31.03.2020, 16:22
    #39942588
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
sdku,

спасибо за совет, "написать процедуру" это вы мне льстите :) Я умею (мой уровень) только воспользоваться кодом, поменять в нем поля и другие мелочи.
Кажется почти получается с запросом, не показывает только тот период, где нет отпусков, вроде соединение Left стоит... а в отчете надо бы показать (
...
Рейтинг: 0 / 0
31.03.2020, 16:36
    #39942599
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
Я применил к полю ДатаОтпуска условие Between (ДатаС) And (ДатаПо) - начало и конец отчетного периода и соответственно где нет отпуска, период не показывается.
Подскажите, пж, изменение в этом выражении, я так подозреваю в нем собака порылась ))
...
Рейтинг: 0 / 0
31.03.2020, 16:36
    #39942600
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga
автор а в каком виде вы хотите получить из функции "все периоды"?

Ну, в таком же виде как и с запроса. Не понял! Ваша функция возвращает в запрос дату, которая и отражается в поле. Функция "Все периоды" вернет вам строку с перечнем периодов, вы даже это увидите, а дольше что?
kniga
Просто в существующий запрос, который у меня работает с функц otpusk для текущ периода я попробовал добавить ваш Запрос и с первой атаки с шашкой наголо не получилось ))
Тоже не понял. Вы лучше в "мой" запрос добавьте поле ID сотрудника и получите всё, как в "вашем", только по всем периодам. А еще можете добавить поле "n" из "nn" и получите номер периода.
kniga
Есть ещё в БД таблица с отпусками. Мне надо показать в отчёте сколько дней отпуска имел Сотрудник в каждом отчетном периоде с начала устройства на работу.
И как вы собираетесь связать таблицу и запрос? Если в таблицу с отпусками добавить поле и ручками там указать номера периодов для каждого отпуска, то да - можно.
А иначе как?
...
Рейтинг: 0 / 0
31.03.2020, 16:47
    #39942604
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga,
between применяйте только к записям в которых поля про отпуск Not Null
(ф-ции NZ или IF)
...
Рейтинг: 0 / 0
31.03.2020, 16:49
    #39942605
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
автор а в каком виде вы хотите получить из функции "все периоды"?
Ну, в таком же виде как и с запроса. Просто в существующий запрос, который у меня работает с функц otpusk для текущ периода я попробовал добавить ваш Запрос и с первой атаки с шашкой наголо не получилось )) Буду конечно дальше пробовать. Думал если как функция будет, то проще в существующий запрос ее добавить к полю ДатаПриема )

Есть ещё в БД таблица с отпусками. Мне надо показать в отчёте сколько дней отпуска имел Сотрудник в каждом отчетном периоде с начала устройства на работу.
Сотрудник. ДатаПриема
Период1 (первый год работы). 25 дн
Дата отпуска 2 дн
Дата отпуска. 23 дн
Период2 (второй год работы). 35 дн
Дата отпуска. 30 дн
Дата отпуска. 5 дн
И т.д.
...
Рейтинг: 0 / 0
31.03.2020, 17:36
    #39942632
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
kniga
sdku,
спасибо за совет, "написать процедуру" это вы мне льстите :) Я умею (мой уровень) только воспользоваться кодом, поменять в нем поля и другие мелочи...
Ну если ничего не придумаете выложите свои наработки(лень самому придумывать пример-можно БД только таблицы)сочиню код,но займусь только поздно вечером
...
Рейтинг: 0 / 0
01.04.2020, 13:49
    #39942832
kniga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника
sdku,

авторсочиню код спасибо! )

Но вот пытаюсь пока запросом от Анатолия. Как я писал выше, осталось решить один нюас, т.е. показать период, если в нем нет отпуска.
Я выложил пример, где две связанные таблицы и запрос с периодами и отпусками в течение этих периодов. Возможно ли в запросе "Отпуска" определить, что подзапрос с периодами отображает все данные (периоды) всегда , независимо от того, есть ли в этот период отпуск или нет (просто пустые строки в полях с датами отпуска)?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Получить в запросе Отчетные периоды по годам с Даты принятия на работу Сотрудника / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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