Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Список рабочих дней / 20 сообщений из 20, страница 1 из 1
30.06.2003, 21:35
    #32195536
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
Люди добрые.
Есть две даты, надо сделать перекрестный запрос, со столбцами, в которые входят все рабочие дни за этот период, вне зависимости от наличия или отсутствия данных.

PS. Владимиру Санычу.
Сегодня ничего не успел сделать - весь день на ремонте, да еще на ночь глядя отчет новый подкинули. :(
Завтра выложу очередную переработку.
...
Рейтинг: 0 / 0
30.06.2003, 21:50
    #32195543
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
Т.е. собственно вопрос: как бы это лучше сделать? Или только создавать временную таблицу, заполненную рабочими датами?
...
Рейтинг: 0 / 0
30.06.2003, 22:24
    #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
30.06.2003, 23:32
    #32195560
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
Владимир Саныч, я тебя люблю! (я в хорошем смысле этого слова:))
Большое спасибо. Пока сделал временную таблицу, которая заполняется на основании заданного периода. Но идея - зер гут! Завтра переделаю.
Кстати, я доклал изменения (об изменениях).
Спасиба.
...
Рейтинг: 0 / 0
30.06.2003, 23:43
    #32195564
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
Это называется - был бы ты девушкой, расцеловал бы... Спасибо. :^)

Изменения я видел. Все хорошо.
...
Рейтинг: 0 / 0
01.07.2003, 00:04
    #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
01.07.2003, 00:27
    #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
05.07.2003, 12:19
    #32200139
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
2 ВС
Раз уж ты предлагаешь заполнять временную таблицу в цикле, то можно заполнять не по неделям, а по дням (дополнение к условию: как правило, отчет будет подготавливаться за период, не превышающий один-два месяца, так что заполняться она будет достаточно быстро). Есть известная формула (всем, кроме меня, я помню только о ее существовании, и, примерно, о расположении книжки, в которой ее можно найти:)), которая позволяет по дате получать день недели. Получится в три строчки:
For d = FirstDay to LastDay
if ChudoFormula(d)<6 then InsertNewRec(d)
next d
...
Рейтинг: 0 / 0
05.07.2003, 12:33
    #32200143
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Список рабочих дней
Мои три строчки

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

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

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

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

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

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

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

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

- или построить учет на исключениях из правил: не дороаботал 2 часа такой-то сотрудник - в табличку его, переработал - в табличку с указанием что переработка и сколько.
...
Рейтинг: 0 / 0
16.07.2003, 13:07
    #32209608
VIG
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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Список рабочих дней / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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