powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Список рабочих дней
20 сообщений из 20, страница 1 из 1
Список рабочих дней
    #32195536
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди добрые.
Есть две даты, надо сделать перекрестный запрос, со столбцами, в которые входят все рабочие дни за этот период, вне зависимости от наличия или отсутствия данных.

PS. Владимиру Санычу.
Сегодня ничего не успел сделать - весь день на ремонте, да еще на ночь глядя отчет новый подкинули. :(
Завтра выложу очередную переработку.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195543
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. собственно вопрос: как бы это лучше сделать? Или только создавать временную таблицу, заполненную рабочими датами?
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195553
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
1. Вот получилось нечто. Недостатков куча, это только первый набросок.

Таблица дней недели tabDays с одним полем целого типа по имени d. Заполнена числами от 1 до 7.

Таблица недель tabWeeks с одним полем целого типа по имени w. Заполнена пока числами от 5390 до 5410, но ее можно программно пополнять по мере необходимости.

Модуль:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Public Const TTT1 = # 6 / 29 / 03 #
Public Const TTT2 = # 8 / 2 / 03 #

Function TTT(w As Integer, d As Integer) As Variant
Dim tmp As Date
tmp = w *  7 # + d +  1 
Select Case tmp
    Case Is < TTT1, Is > TTT2
        TTT = Null
    Case Else
        TTT = tmp
End Select
End Function

Function WWW(TTT As Date) As Integer
Dim tmp As Integer
tmp = TTT \  7 
If tmp =  0  Then tmp =  7 
WWW = tmp
End Function

Function WWW1() As Integer
WWW1 = WWW(TTT1)
End Function

Function WWW2() As Integer
WWW2 = WWW(TTT2)
End Function


При этом TTT1 и TTT2 описаны как константы, но их надо превратить в переменные и задавать им значения перед запуском запроса.

И сам запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
TRANSFORM First(TTT([w],[d])) AS Expr1
SELECT tabWeeks.w
FROM tabWeeks, tabDays
WHERE (((tabWeeks.w)>=WWW1()- 1  And (tabWeeks.w)<=WWW2()))
GROUP BY tabWeeks.w
ORDER BY tabWeeks.w, tabDays.d
PIVOT tabDays.d;


2. Да я-то ничего, меня от Интернета не отключают... :^)
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195560
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч, я тебя люблю! (я в хорошем смысле этого слова:))
Большое спасибо. Пока сделал временную таблицу, которая заполняется на основании заданного периода. Но идея - зер гут! Завтра переделаю.
Кстати, я доклал изменения (об изменениях).
Спасиба.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195564
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Это называется - был бы ты девушкой, расцеловал бы... Спасибо. :^)

Изменения я видел. Все хорошо.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195567
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Что-то я перемудрил с делением на 7. Все гораздо проще. Функция WWW лишняя, а две последних функции должны выглядеть так:

Код: plaintext
1.
2.
3.
4.
5.
6.
Function WWW1() As Integer
WWW1 = TTT1 \  7 
End Function

Function WWW2() As Integer
WWW2 = TTT2 \  7 
End Function
...
Рейтинг: 0 / 0
Список рабочих дней
    #32195572
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Последняя версия.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function WWW1() As Integer
WWW1 = (TTT1 -  2 ) \  7 
End Function

Function WWW2() As Integer
WWW2 = (TTT2 -  2 ) \  7 
End Function

Sub FillWeeks()
Dim i As Integer
For i = WWW1 To WWW2
    CurrentDb.Execute  "INSERT INTO tabWeeks (w) SELECT "  & Str(i)
Next
End Sub


Код: plaintext
1.
2.
3.
4.
5.
6.
TRANSFORM First(TTT([w],[d])) AS Expr1
SELECT tabWeeks.w
FROM tabWeeks, tabDays
WHERE (((tabWeeks.w)>=WWW1() And (tabWeeks.w)<=WWW2()))
GROUP BY tabWeeks.w
ORDER BY tabWeeks.w, tabDays.d
PIVOT tabDays.d;


Убраны пустые записи, которые иногда появлялись в начале и конце периода, и добавлена процедура для пополнения таблицы недель. Спать...
...
Рейтинг: 0 / 0
Список рабочих дней
    #32200139
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС
Раз уж ты предлагаешь заполнять временную таблицу в цикле, то можно заполнять не по неделям, а по дням (дополнение к условию: как правило, отчет будет подготавливаться за период, не превышающий один-два месяца, так что заполняться она будет достаточно быстро). Есть известная формула (всем, кроме меня, я помню только о ее существовании, и, примерно, о расположении книжки, в которой ее можно найти:)), которая позволяет по дате получать день недели. Получится в три строчки:
For d = FirstDay to LastDay
if ChudoFormula(d)<6 then InsertNewRec(d)
next d
...
Рейтинг: 0 / 0
Список рабочих дней
    #32200143
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мои три строчки

For i = WWW1 To WWW2
CurrentDb.Execute "INSERT INTO tabWeeks (w) SELECT " & Str(i)
Next

не длиннее. :^) Зато оборотов цикла у меня меньше в 7 раз.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32200175
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть известная формула ..., которая позволяет по дате получать день недели
Код: plaintext
DatePart( "w" , Date, vbMonday)
...
Рейтинг: 0 / 0
Список рабочих дней
    #32200761
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одна чудо формула всего в два слова (читайте хэлп %-):

Weekday(MyDate)
...
Рейтинг: 0 / 0
Список рабочих дней
    #32201396
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто теоретически.
Стопроцентный правильный результат дает только индивидуальный календарь на каждого работника. Но этот календарь первоначально может быть заполнен некими стандартными для профессии, смены, категории работника, страны, значениями.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32201736
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Типа, у водопроводчика и у стоматолога одна и та же дата может оказаться разными днями недели?
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202359
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разными днями недели вряд ли но в одной фирме может быть 1 апреля рабочим днем а во второй выходным по случаю дня дурака ....
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202372
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Понял. Это надо включить в мою функцию TTT.

If праздник Then Null.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202511
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>If праздник Then Null
Возьму эту строку девизом на следующие выходные!...
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202512
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
:^) Будем здоровы!
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202532
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Cat2
Действительно, в конце концов выяснилось, что куча народу работает по "выходным". Но, поскольку первоначальный отчет назывался "список отсутствующих работников", и он при отработке, скажем, за субботу выдавал список всех рабочих предприятия, кроме одного-двух дворников, решили оставить все как есть (бог с ними, с "праздник=null":)), а добавить отчет "список присутствующих работников", который работает не взирая на выходные и праздники.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32202683
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Действительно, в конце концов выяснилось, что куча народу работает >по "выходным". Но, поскольку первоначальный отчет назывался "список >отсутствующих работников", и он при отработке, скажем, за субботу >выдавал список всех рабочих предприятия, кроме одного-двух дворников, >решили оставить все как есть (бог с ними, с "праздник=null":)), а добавить >отчет "список присутствующих работников", который работает не взирая на >выходные и праздники.

я достаточно долго занимался разработкой систем учета рабочего времени
вот мое мнение:

1. Должен быть учет графика работы фирмы
учет
+ празники
- выходные дни, перенесенные на будни
на основе таблички исключений формировать месячный график и рассчитывать фонд рабочего времени.

2. Должен быть персональный учет по сотруднику

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

- или построить учет на исключениях из правил: не дороаботал 2 часа такой-то сотрудник - в табличку его, переработал - в табличку с указанием что переработка и сколько.
...
Рейтинг: 0 / 0
Список рабочих дней
    #32209608
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут на досуге "нарисовал" запрос, который генерирует
последовательные даты (у меня 1000,но это легко изменить),начиная с некоторой заданной
Код: plaintext
1.
2.
3.
SELECT dateadd( "d" ,nr,# 01 / 01 / 2003 #) AS dt
FROM [SELECT  100 *a.num+ 10 *b.num+c.num as nr
FROM Nums as a,nums as b,nums as c]. AS [numbers]
ORDER BY dateadd( "d" ,nr,# 01 / 01 / 2003 #)

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


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