Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Даты
 
 автор: FORMAT   (17.09.2008 в 16:41)   личное сообщение
 
 

Часто приходится работать с датами, и соответственно, так же часто возникает ряд вопросов, связанный с этими же датами.
Возникающие вопросы, которые смог придумать:
-вычисление разницы между 2 датами,
-сложение/вычитание какой либо даты определенного количества дней
-Проверка "високосности года"
-преобразование разницы дат в формат вида 2 года 6 мес. 5 дней
-вычисление даты опережающей/отстающей от сегодняшней на какое либо количество дней
-Преобразование дат из одного формата в другой
-Преобразование дат к какому либо формату

Да, так вот к чему весь этот поток сознания: Существует куча функций, позволяющих решить каждый из этих вопросов. Но каждый раз их приходится писать заново, вот я и хочу создать пользовательский класс,объединив эти фукции, позволяющий решать эти вопросы. Его проще вставить в модуль акса и работать как с обычным классом.
Так вот, народ, плиз напишите кто с какими вопросами при работе с датами сталкивался и какие еще вопросы могут быть. Их тоже можно описать в этом классе.
Бысторого решения не обещаю, но если получится, выложу сюда, авось кому и сгодится.

  Ответить  
 
 автор: час   (17.09.2008 в 16:46)   личное сообщение
 
 

Спасибо тебе формат за энтузиазм
вот посмотри
http://hiprog.com/forum/read.php?id_forum=1&id_theme=3806&page=1
А если коротко:
Recordset Не видит полей на форме, а там даты в том числе.
Даты в запросе просят английского формата или ##

  Ответить  
 
 автор: Lukas   (17.09.2008 в 16:57)   личное сообщение
 
 

1. Наверное стоит включить проверку на пересечение интервалов дат, и на вхождение одного интервала в другой полностью.
2. Определение дат начала и конца недели для заданной даты.

  Ответить  
 
 автор: osmor   (17.09.2008 в 19:05)   личное сообщение
 
 

в помощь
http://hiprog.com/index.php?option=com_content&task=view&id=396
http://hiprog.com/index.php?option=com_content&task=view&id=280
http://hiprog.com/index.php?option=com_content&task=view&id=163
http://hiprog.com/index.php?option=com_content&task=view&id=134

  Ответить  
 
 автор: FORMAT   (18.09.2008 в 18:46)   личное сообщение
 
 

osmor!
Большое спасибо за ссылки. Они, практически, решают проблему.

  Ответить  
 
 автор: KrukVN   (18.09.2008 в 20:51)   личное сообщение
 
 

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

  Ответить  
 
 автор: FORMAT   (22.09.2008 в 12:46)   личное сообщение
22 Кб.
 
 

Наконец то дошли руки до класса.
Вот сам класс и его описание.
Там порядка 10 функций. Его не тестириовал, так, что если будут глюки - пишите какие. исправим. В принципе расширить его можно.

  Ответить  
 
 автор: FORMAT   (22.09.2008 в 12:48)   личное сообщение
2 Кб.
 
 

описание класса

  Ответить  
 
 автор: час   (22.09.2008 в 13:00)   личное сообщение
 
 

Пока не тестировал, но FORMAT _МОЛОДЕЦ!
Обещал, - получите.........

  Ответить  
 
 автор: Lukas   (22.09.2008 в 18:26)   личное сообщение
 
 

При компилировании сразу всплыло:

Public Function IsIntervalCrossing(dtBeginDateFirstInterval, dtEndDateFirstInterval, dtBeginDateSecondInterval, dtEndDateSecondInterval) As Boolean
If .... Then
IsIntervalCrossing = True ' здесь я подправил
Else
IsIntervalCrossing = False ' здесь я подправил
End If
End Function


И попутно вопрос:
Оформление в виде класса не позволяет использовать функции в сохраненных запросах, или я не умею это делать?

  Ответить  
 
 автор: Lukas   (22.09.2008 в 19:46)   личное сообщение
 
 

И еще возник вопрос:
Для чего объявлены переменные типа Date в области объявления переменных модуля класса?

  Ответить  
 
 автор: FORMAT   (23.09.2008 в 10:49)   личное сообщение
 
 

Для того, чтобы каждый раз в функциях не указывать тип переменной "as date"

  Ответить  
 
 автор: Lukas   (23.09.2008 в 11:51)   личное сообщение
 
 

Интересно, не знал что так можно.

  Ответить  
 
 автор: Lukas   (22.09.2008 в 20:46)   личное сообщение
22 Кб.
 
 

Позволил себе некоторую вольность, переписал несколько иначе класс, предложенный FORMATом.
В файле обе версии.
В модуле1 функция тестирования класса clsDate.

  Ответить  
 
 автор: Lukas   (22.09.2008 в 21:29)   личное сообщение
 
 

Интересно, а можно-ли использовать для определения високосного года такую функцию:


Public Function funIsLeapYear(dtDate As Date) As Boolean
    funIsLeapYear = ((year(dtDate) Mod 4) = 0)
End Function

  Ответить  
 
 автор: FORMAT   (23.09.2008 в 10:45)   личное сообщение
 
 

такую функцию использовать нельзя, т.к. не все високосные года те, что кратны 4.
например 1900 год кратен 4, но он не високосный.

  Ответить  
 
 автор: Lukas   (23.09.2008 в 11:52)   личное сообщение
 
 

Чувствовал, что где-то подвох.
Что за дискриминация такая?

  Ответить  
 
 автор: Lukas   (22.09.2008 в 23:57)   личное сообщение
25 Кб.
 
 

Вариант №2.
Добавил функции квартала.

  Ответить  
 
 автор: FORMAT   (23.09.2008 в 10:57)   личное сообщение
 
 

Мне вариант Lukasa нравится больше.

  Ответить  
 
 автор: Lukas   (23.09.2008 в 11:56)   личное сообщение
 
 

  Ответить  
 
 автор: час   (24.09.2008 в 18:59)   личное сообщение
 
 

а вот мне попалось - добрый человек делал - может добавить.....
Входная короткая дата, а на выходе сколько прошло времени.

Function MyDateDiff(ByVal D1 As Date, D2 As Date) As String
Dim Y As Integer, M As Integer, D As Integer
Y = DateDiff("YYYY", D1, D2)
If DateAdd("YYYY", Y, D1) > D2 Then Y = Y - 1
D1 = DateAdd("YYYY", Y, D1)
M = DateDiff("M", D1, D2)
If DateAdd("M", M, D1) > D2 Then M = M - 1
D1 = DateAdd("M", M, D1)
D = DateDiff("D", D1, D2)
MyDateDiff = Y & " лет, " & M & " месяцев, " & D & " дней"
End Function

  Ответить  
 
 автор: час   (24.09.2008 в 19:04)   личное сообщение
 
 

И вот ещё от Матющенко:

Совет: 
'Примечание:
'если в качестве входного параметра указано (Optional dteDate As Date),
'то вызов функции можно осуществлять как НазваниеФункции()
'- то есть можно оставлять пустые скобки.
'Например:
'MsgBox FirstOfQuarter()


--------------------------------------------------------------------------------

' определение первого дня месяца
Function FirstOfMonth(Optional dteDate As Date) As Date
'если параметр dteDate = 0 то для вычисления берется текущая дата
If CLng(dteDate) = 0 Then
dteDate = Date
End If
FirstOfMonth = DateSerial(Year(dteDate), Month(dteDate), 1)
MsgBox "Первый день месяца - " & FirstOfMonth
End Function 
--------------------------------------------------------------------------------

Function LastOfMonth(Optional dteDate As Date) As Date
'если параметр dteDate = 0 то для вычисления берется текущая дата
If CLng(dteDate) = 0 Then
dteDate = Date
End If
'Ищется первый день следующего месяца, и вычитается один день
LastOfMonth = DateSerial(Year(dteDate), Month(dteDate) + 1, 1) - 1
MsgBox "Первый день месяца - " & LastOfMonth
End Function 
--------------------------------------------------------------------------------

' определение первого дня месяца предыдущего указанному
Function FirstOfPreviousMonth(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
FirstOfPreviousMonth = DateSerial(Year(dteDate), Month(dteDate) - 1, 1)
MsgBox "Первый день предыдущего месяца - " & FirstOfPreviousMonth
End Function 
--------------------------------------------------------------------------------

' определение последнего дня месяца предыдущего указанному
Function LastOfPreviousMonth(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
LastOfPreviousMonth = DateSerial(Year(dteDate), Month(dteDate), 0)
MsgBox "Последний день предыдущего месяца - " & LastOfPreviousMonth
End Function 
--------------------------------------------------------------------------------


' определение первого дня месяца следующего за указанным
Function FirstOfNextMonth(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
FirstOfNextMonth = DateSerial(Year(dteDate), Month(dteDate) + 1, 1)
MsgBox "Первый день следующего месяца - " & FirstOfNextMonth
End Function 
--------------------------------------------------------------------------------

' определение последнего дня месяца следующего за указанным
Function LastOfNextMonth(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
LastOfNextMonth = DateSerial(Year(dteDate), Month(dteDate) + 2, 0)
MsgBox "Последний день следующего месяца - " & LastOfNextMonth
End Function 
--------------------------------------------------------------------------------

'Определение первого дня текущего квартала
Function FirstOfQuarter(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
FirstOfQuarter = DateSerial(Year(dteDate), Int((Month(dteDate) - 1) / 3) * 3 + 1, 1)
MsgBox "Первый день текущего квартала - " & FirstOfQuarter
End Function 
--------------------------------------------------------------------------------

'Определение последнего дня текущего квартала
Function LastOfQuarter(Optional dteDate As Date) As Date
If CLng(dteDate) = 0 Then
dteDate = Date
End If
LastOfQuarter = DateSerial(Year(dteDate), Int((Month(dteDate) - 1) / 3) * 3 + 4, 0)
MsgBox "Последний день текущего квартала - " & LastOfQuarter
End Function 
--------------------------------------------------------------------------------

Function FirstOfPolugod(Optional dteDate As Date) As Date
'Dim dteDate As Date
'dteDate = #12/15/02#
If CLng(dteDate) = 0 Then
dteDate = Date
End If
FirstOfPolugod = DateSerial(Year(dteDate), Int((Month(dteDate) - 1) / 6) * 6 + 1, 1)
MsgBox "Первый день текущего полугодия - " & FirstOfPolugod
End Function 
--------------------------------------------------------------------------------

Function LastOfPolugod(Optional dteDate As Date) As Date
'Dim dteDate As Date
'dteDate = #12/15/02#
If CLng(dteDate) = 0 Then
dteDate = Date
End If
LastOfPolugod = DateSerial(Year(dteDate), Int((Month(dteDate) - 1) / 6) * 6 + 7, 0)
MsgBox "Первый день текущего полугодия - " & LastOfPolugod
End Function 
--------------------------------------------------------------------------------

' Первый день недели
Function StartOfWeek(Optional D As Variant) As Variant '
Dim FirstWeekday As Integer
FirstWeekday = 2
If IsMissing(D) Then 'Первый день недели - понедельник
D = Date
StartOfWeek = D - WeekDay(D) + 2
Else
StartOfWeek = D - WeekDay(D, FirstWeekday) + 1
End If
MsgBox "Первый день недели - " & StartOfWeek
End Function 
--------------------------------------------------------------------------------

' Последний день недели
Function EndOfWeek(Optional D As Variant) As Variant '
Dim FirstWeekday As Integer
FirstWeekday = 2
If IsMissing(D) Then 'Последний день недели - воскресенье
D = Date
EndOfWeek = D - WeekDay(D) + 8
Else
EndOfWeek = D - WeekDay(D, FirstWeekday) + 7
End If
MsgBox "Последний день недели - " & EndOfWeek
End Function 
--------------------------------------------------------------------------------

Function LeapYear(YYYY As Integer) As Integer
'Функция возвращает -1, если указанный входной параметр (год) является високосным
'Пример: MsgBox LeapYear(1996)
LeapYear = YYYY Mod 4 = 0 And (YYYY Mod 100 <> 0 Or YYYY Mod 400 = 0)
If LeapYear = -1 Then
MsgBox "Високосный"
Else
MsgBox "Простой год"
End If
End Function 
--------------------------------------------------------------------------------

Function LeapYear2(YYYY As Integer) As Integer
'Функция возвращает -1, если указанный входной параметр (год) является високосным
'Пример: MsgBox LeapYear(1996)
LeapYear2 = Month(DateSerial(YYYY, 2, 29)) = 2
If LeapYear2 = -1 Then
MsgBox "Високосный"
Else
MsgBox "Простой год"
End If
End Function 
--------------------------------------------------------------------------------

Function IsLeapYear(DateIn As Date) As Boolean
'Функция возвращает True, если год в указанной дате является високосным
'Проверка: MsgBox IsLeapYear("01/01/00")
If IsDate("29/02/" & Format(DateIn, "yyyy")) = True Then
IsLeapYear = True
MsgBox "Високосный"
Else
MsgBox "Простой год"
End If
End Function 
--------------------------------------------------------------------------------

' Определение номера дня недели в году
Function DayOfYear(Optional dteDate As Date) As Long
If CLng(dteDate) = 0 Then
dteDate = Date
End If
DayOfYear = Abs(DateDiff("d", dteDate, DateSerial(Year(dteDate) - 1, 12, 31)))
MsgBox "День № " & DayOfYear & " в году"
End Function 
--------------------------------------------------------------------------------

' Рабочий день или нет
Function IsWorkday(Optional dteDate As Date) As Boolean
If CLng(dteDate) = 0 Then
dteDate = Date
End If
Select Case WeekDay(dteDate)
Case vbMonday To vbFriday
IsWorkday = True
MsgBox "Рабочий день"
Case Else
IsWorkday = False
MsgBox "Выходной"
End Select
End Function 
--------------------------------------------------------------------------------

'Функция определения полных лет со дня рождения
Function CalcAge(dteBirthdate As Date) As Long
'В качестве параметра dteBirthdate необходимо задать дату рождения
'Пример: MsgBox CalcAge("09/03/75")
Dim lngAge As Long
If Not IsDate(dteBirthdate) Then
dteBirthdate = Date
End If
'Проверить, чтобы в качестве входного параметра не была задана дата в будущем
If dteBirthdate > Date Then
dteBirthdate = Date
End If
'Подсчет разницы в годах между текущей датой и датой рождения
lngAge = DateDiff("yyyy", dteBirthdate, Date)
'Вычитается один год, если в этом году дня рождения еще не было
If DateSerial(Year(Date), Month(dteBirthdate), Day(dteBirthdate)) > Date Then
lngAge = lngAge - 1
End If
CalcAge = lngAge
MsgBox "Итого полных лет - " & CalcAge
End Function 
--------------------------------------------------------------------------------

'Функция возвращает последний рабочий день в текущем месяце (Понедельник-Пятница)
Function LastBusDay(D As Variant) As Variant
'Пример: MsgBox LastBusDay(Date)
Dim D2 As Variant
If VarType(D) <> 7 Then
LastBusDay = Null
Else
D2 = DateSerial(Year(D), Month(D) + 1, 0)
Do While WeekDay(D2) = 1 Or WeekDay(D2) = 7
D2 = D2 - 1
Loop
LastBusDay = D2
End If
MsgBox "Последний рабочий день - " & LastBusDay
End Function 
--------------------------------------------------------------------------------

 
Матющенко Георгий

  Ответить  
 
 автор: час   (24.09.2008 в 19:10)   личное сообщение
 
 

А вот от Serge_Gavrilov


Вопрос: Проблемы с датами

Совет: 
...а я пользую функцию типа to_lng и по-любому везде с датами все работает...
' "SELECT * FROM Rates WHERE to_lng(InputDate)=" & to_lng(Format(Now(),"dd.mm.yyyy"))


а собственно Date работает
попробуй с  to_lng, указанным выше, а то с этими датами проблем не оберешься...
- неправильные национальные настройки
- прибабахи SQL по работе только с амрыканскими датами, да еще и ## решетки им дай
... уж и не вспомню, что еще, но меня эта лабуда достала еще в аксес2.0 и я пользую to_lng или to_dbl (если и время надо) а точнее вот такой маленький модуль... в неизменном виде с 1994 года...

Option Compare Database
Option Explicit
Public X, Y, Z

Function to_cur(Num) As Currency
 On Error Resume Next

 to_cur = CCur(Num)
 If Err <> 0 Then to_cur = 0
 If IsNull(Num) Then to_cur = 0
 
 On Error GoTo 0
End Function

'==============

Function to_dbl(Num) As Double
 On Error Resume Next

 to_dbl = CDbl(Num)
 If Err <> 0 Then to_dbl = 0
 If IsNull(Num) Then to_dbl = 0
 
 On Error GoTo 0
End Function

'==============

Function to_int(Num) As Integer
 On Error Resume Next

 to_int = CInt(Num)
 If Err <> 0 Then to_int = 0
 If IsNull(Num) Then to_int = 0
 
 On Error GoTo 0
End Function

'==============

Function to_lng(Num) As Long
 On Error Resume Next

 to_lng = CLng(Num)                 'ВНИМАНИЕ! См. замечание ниже
 If Err <> 0 Then to_lng = 0
 If IsNull(Num) Then to_lng = 0
 
 On Error GoTo 0
End Function

'==============

Function to_sng(Num) As Single
 On Error Resume Next

 to_sng = CSng(Num)
 If Err <> 0 Then to_sng = 0
 If IsNull(Num) Then to_sng = 0
 
 On Error GoTo 0
End Function

'==============

Function to_str(VarStr) As String
 On Error Resume Next

 to_str = CStr(VarStr)
 If Err <> 0 Then to_str = ""
 If IsNull(VarStr) Then to_str = ""

 On Error GoTo 0
End Function

'==============

Function to_date(VarDate) As Date
 On Error Resume Next

 to_date = CDate(VarDate)
 If Err <> 0 Then to_date = 0
 If IsNull(VarDate) Then to_date = 0

 On Error GoTo 0
End Function
 
'==============

  AR 

========
========

Некоторое замечание...
Если использовать CLng() для полной даты, то можете ошибиться.
Например сейчас Now дает
?now()
28.01.2003 13:03:14
В Double это:
?cdbl(cdate("28.01.2003 13:03:14"))
37649,543912037 
CLng() даст  37650, т.е. другую дату:
?cdate(37650)
29.01.2003 
Надо еще Int пользоваться
?сLng(Int(now()))
37649 
  Serge_Gavrilov

  Ответить  
 
 автор: час   (24.09.2008 в 19:11)   личное сообщение
 
 

Может чё пригодиться и стоит добавить?

  Ответить  
 
 автор: час   (24.09.2008 в 19:15)   личное сообщение
 
 

А это вот коментировано не по нашему - я тут плохо понимаю, но функции хорошие - может пригодятся какие для класса


Вопрос: Работа с датами и временем

Совет: 
Option Compare Database   'Use database order for string comparisons
Option Explicit

Const MB_ICONEXCLAMATION = 48

'************************************************************************
'* Function ConDateTime (anyDate As Variant, anyTime As Integer) 
'* By John W.Locke   JoLocke@AOL.com 
'* 1/19/96
'* 
'* Some applications, such as DBase, store date and time values in sep- 
'* arate fields. This function will concatenate those into a single Date
'* and Time string that is usable by Access. The Date/Time value can
'* then be stored, or used in forms, queries or reports. 
'* 
'* This function requires the TimeValue function to convert time stored
'* as numeric data into an Access Time value. 
'************************************************************************
Function ConDateTime (anydate As Variant, anytime As Integer)
On Error GoTo Err_ConDateTime
    
    
    '/* A negative or Null value is unlikely, but we will trap for it anyway, */
    '/* because it could cause an "Illegal Function" error                    */
If (IsNull(anytime) Or (anytime < 0) Or (anytime >= 1440)) Then
     MsgBox "The value '" & anytime & "' is not a valid Time number.", MB_ICONEXCLAMATION, "ConDateTime Invalid Time"
  GoTo Exit_ConDateTime
    Else
End If
    
If IsDate(anydate) = False Then
    MsgBox "The value '" & anydate & "' is not a valid Date.", MB_ICONEXCLAMATION, "ConDateTime Invalid Date"
GoTo Exit_ConDateTime
    Else
End If

ConDateTime = DateValue(anydate) & " " & TimeValue(ConvTime(anytime))
      
Exit_ConDateTime:
    Exit Function
    
Err_ConDateTime:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION, "ConDateTime Error Message"
    Resume Exit_ConDateTime
End Function
'************************************************************************
'* Function ConvTime (anyNum)  
'* By John W.Locke   JoLocke@AOL.com 
'* 1/19/96 
'*       
'* This funtion will convert numeric time values, such as those stored 
'* by dBase, into an Access Time value. This can then be used by itself 
'* or concatenated with a date value via the ConDateTime function.  
'* 
'* This function assumes the time value is being stored as an integer
'* between 0(12:00:00 am)and 1439(11:59:00 pm), where 1 = 1 minute. 
'************************************************************************
Function ConvTime (anyNum)
On Error GoTo Err_ConvTime
   
   anyNum = IIf(IsNull(anyNum), 0, anyNum)
   '/* a negative value is unlikely, but we will trap for it anyway. */
   If ((anyNum < 0) Or (anyNum >= 1440)) Then
     MsgBox "The value '" & anyNum & "' is not a valid Time number.", MB_ICONEXCLAMATION, "ConvTime Invalid Time"
     GoTo Exit_ConvTime
   End If
   
   ConvTime = TimeValue(Trim$((Int(anyNum / 60))) & ":" & IIf((((anyNum / 60) - Int(anyNum / 60)) * 60) >= 10, Trim$((((anyNum / 60) - Int(anyNum / 60)) * 60)), "0" & Trim$((((anyNum / 60) - Int(anyNum / 60)) * 60))))
   


Exit_ConvTime:
    Exit Function
    
Err_ConvTime:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION, "ConvTime Error Message"
    Resume Exit_ConvTime
End Function
'************************************************************************
'* Function TimeElapsed (Date1, Date2) As Variant   
'* By John W.Locke   JoLocke@AOL.com   
'* 1/19/96  
'*  
'* This function computes the elapsed time between 2 dates, excluding   
'* weekends. It accepts dates as Date/Time strings or Access Date/Time  
'* values. It returns a Variant TimeValue that can be formatted in a 
'* query, form or report.
'*
'************************************************************************
Function TimeElapsed (Date1, Date2) As Variant
On Error GoTo Err_TimeElapsed
 
    Dim Time1, Time2, ElapsedTime, ElapsedDays, ElapsedPartialDay   '/* Variants */
    Dim vwknd As Integer

      Time1 = CVDate(Date1)
      Time2 = CVDate(Date2)
      vwknd = DatePart("ww", Time2) - DatePart("ww", Time1)
      If vwknd > 0 Then
vwknd = vwknd * 2
    Else
vwknd = vwknd
      End If
      
      ElapsedTime = Abs(Time1 - Time2)
      ElapsedDays = Int(ElapsedTime)
      ElapsedPartialDay = (ElapsedTime - ElapsedDays)
      TimeElapsed = ElapsedTime - vwknd
Exit_TimeElapsed:
    Exit Function
    
Err_TimeElapsed:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION, "TimeElapsed Error Message"
    Resume Exit_TimeElapsed
   
End Function

'************************************************************************
'* Function DateBeg (varDate, sPeriod As Integer) 
'* By John W.Locke   JoLocke@AOL.com 
'* 2/1/96 
'* Used to get Beginning Date from DateRanger Function. See comments in
'* DateRanger function. 
'************************************************************************
Function DateBeg (varDate, sPeriod As Integer)
On Error GoTo Err_DateBeg

    DateBeg = Left$(DateRanger(varDate, sPeriod), 8)
Exit_DateBeg:
    Exit Function
    
Err_DateBeg:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION , "DateBeg Error Message"
    Resume Exit_DateBeg
    
End Function
'************************************************************************
'* Function DateEnd (varDate, sPeriod As Integer) 
'* By John W.Locke   JoLocke@AOL.com 
'* 2/1/96
'*  
'* Used to get Ending Datefrom DateRanger Function. See comments in 
'* DateRanger function.
'************************************************************************
Function DateEnd (varDate, sPeriod As Integer)
On Error GoTo Err_DateEnd
    DateEnd = Right$(DateRanger(varDate, sPeriod), 8)
Exit_DateEnd:
    Exit Function
    
Err_DateEnd:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION , "DateEnd Error Message"
    Resume Exit_DateEnd
    
End Function
'************************************************************************
'* Function DateRanger (varDate As Variant, sPeriod As Integer) 
'* By John W.Locke   JoLocke@AOL.com 
'* 2/1/96
'*   
'* This function will return starting and ending dates for pre-defined  
'* date ranges. For example, if varDate = 1/15/96 and sPeriod = 1, 
'* DateRanger will return 12/1/95 as the starting date, and 12/31/95 as 
'* the ending date.
'*       
'* Date ranges currently supported are: 
'* Last Month -     sPeriod =1      Last Quarter -    sPeriod = 3  
'* Last Trimester - sPeriod = 4     Last SemiAnnual - sPeriod = 6 
'* Last Week -      sPeriod = 7     Last Year -       sPeriod = 12
'*  
'* DateRanger is called from it's 2 "front-end" functions, DateBeg and 
'* DateEnd. Usage example: 
'*      DateBeg(#2/12/96#,3) = 11/01/95 
'*      DateEnd(#2/12/96#,3) = 01/31/96  
'************************************************************************
Function DateRanger (varDate As Variant, sPeriod As Integer)
On Error GoTo Err_DateRanger

Dim BegDate, EndDate As Variant
Dim x, y, vDay As Integer
Select Case sPeriod
Case 1
    y = 365.25 / 12     'Last Month(1 month)
Case 3
    y = 365.25 / 4      'Last Quarter(3 months)
Case 4
    y = 365.25 / 3      'Last Trimester(4 months)
Case 6
    y = 365.25 / 2      'Last Semi-Annual(6 months)
Case 7
    GoTo Weeks          'Last Week(1 week)
Case 12
    y = 365.25          'Last Year(12 months)
Case Else
    MsgBox "Wrong Value Entered."
    Exit Function
End Select
    BegDate = DateSerial(Year(varDate - y), Month(DateAdd("m", -sPeriod, varDate)), 1)
    EndDate = DateAdd("m", sPeriod, (BegDate)) - 1
DateRanger = Format$(BegDate, "mm/dd/yy") & Format$(EndDate, "mm/dd/yy")
GoTo Exit_DateRanger
Weeks:
x = Weekday(varDate)
    Select Case x
        Case 1
            vDay = -7
        Case 2
            vDay = -8
        Case 3
            vDay = -9
        Case 4
            vDay = -10
        Case 5
            vDay = -11
        Case 6
            vDay = -12
        Case 7
            vDay = -13
        Case Else
            GoTo Err_DateRanger
    End Select
    BegDate = DateAdd("d", vDay, varDate)
    EndDate = DateAdd("d", vDay + 7, varDate)
    
DateRanger = Format$(BegDate, "mm/dd/yy") & Format$(EndDate, "mm/dd/yy")
GoTo Exit_DateRanger
Exit_DateRanger:
    Exit Function
    
Err_DateRanger:
If IsNull(varDate) Then
    MsgBox "This is a Null Date!"
    Resume Next
        ElseIf IsDate(varDate) = False Then
    Resume Next
End If
    
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION , "DateRanger Error Message"
    Resume Exit_DateRanger
End Function
'************************************************************************
'* Function EndOfMonth (vDate) 
'* By John W.Locke   JoLocke@AOL.com 
'* 2/1/96  
'*  
'* This function accepts any valid date and returns the last day of the 
'* month. Includes logic to compute "Leap Day". 
'* For example: 
'* EndOfMonth(#2/12/96#) = 29 
'************************************************************************
Function EndOfMonth (vDate)
On Error GoTo Err_EndOfMonth
Dim x, EOM As Integer
Select Case Month(vDate)
Case 1, 3, 5, 7, 10, 12
x = 31
Case 4, 6, 8, 9, 11
x = 30
Case 2
    If Year(vDate) Mod 4 = 0 Then
        x = 29
            Else
        x = 28
    End If
Case Else
MsgBox "Invalid Month in Date"
End Select
EOM = x
EndOfMonth = EOM
Exit_EndOfMonth:
    Exit Function
    
Err_EndOfMonth:
    MsgBox Err & " " & Error$, MB_ICONEXCLAMATION , "EndOfMonth Error Message"
    Resume Exit_EndOfMonth
End Function

  Ответить  
 
 автор: час   (24.09.2008 в 19:18)   личное сообщение
 
 

или вот махонький совет:

С датами в Access работают как с целыми числами. Например, если Вам надо определить последнее число месяца делается это так.
d = Date 'Текущая дата
m = Month(d) 'Определяем месяц
y = Year(d) 'Определяем год
DLast = DateSerial(y, m + 1, 1) - 1 'Последний день месяца

  Ответить  
 
 автор: час   (24.09.2008 в 19:20)   личное сообщение
 
 

Возможно и такие вот функции можно применить в этом классе тасазать до кучи.


Вопрос: Сколько выходных между двумя датами

Совет: 
Date/Time: How many Sundays between two dates
--------------------------------------------------------------------------------
  

    From an initial observation made by Lyle Fairfield, here a solution to getthe number of, let say, Wednesday, between two dates:

'************* Code Start *************
Public Function HowManyWD(FromDate As Date, _
                            ToDate As Date, _
                            WD As Long)
   ' No error handling actually supplied
    HowManyWD = DateDiff("ww", FromDate, ToDate, WD) _
                                 - Int(WD = WeekDay(FromDate))
End Function
'************* Code End *************
    In the same way, someone can easily get the number of weekdays (excluding weekends) by subtracting number of Sundays and Saturdays:

'************* Code Start *************
Public Function HowManyWeekDay(FromDate As Date, _
                            ToDate As Date, _
                            Optional ToDateIsIncluded As Boolean = True)
    
    HowManyWeekDay = DateDiff("d", FromDate, ToDate) - _
                    ToDateIsIncluded - _
                    HowManyWD(FromDate, ToDate, vbSunday) - _
                    HowManyWD(FromDate, ToDate, vbSaturday)
End Function
'************* Code End *************

код не мой автора не знаю, но возможно Евгений Серебряков

  Ответить  
 
 автор: час   (24.09.2008 в 19:23)   личное сообщение
 
 

Интересные наброски попались

Функция вычисления разницы между двумя датами

Function FormatInterval(ByVal Interval As Variant, Fmt As String)
'
' Formats the difference between 2 dates or sum of 2 times
' to show day as well as hours, minutes, and seconds.
'
' Supports the following formats:
' D H 5 Days 5 Hours
' D H:MM 5 Days 5:15
' D HH:MM 5 Days 05:15
' D H:MM:SS 5 Days 5:15:45
' D HH:MM:SS 5 Days 05:15:45
' H M 125 Hours 15 Minutes
' H:MM 125:15
' H:MM:SS 125:15:45
' M S 7515 Minutes 45 Seconds
'
Dim Days As Long, Hours As Long, Minutes As Long, Seconds As Long
'
' Check for Date or Double
'
If VarType(Interval) <> 7 And VarType(Interval) <> 5 Then Exit Function
'
' Parse Days
'
Days = Int(Interval)
Interval = Interval - Days
If Interval > #11:59:59 PM# Then
Days = Days + 1
Interval = 0#
End If
'
' Parse Hours
'
Interval = Interval * 24
Hours = Int(Interval)
Interval = Interval - Hours
If Interval > 3599# / 3600# Then
Hours = Hours + 1
Interval = 0#
End If
'
' Parse Minutes
'
Interval = Interval * 60
Minutes = Int(Interval)
Interval = Interval - Minutes
If Interval > 59# / 60# Then
Minutes = Minutes + 1
Interval = 0#
End If
'
' Parse Seconds
'
Seconds = Int(Interval * 60 + 0.5)
'
' Normalize
'
If Seconds = 60 Then
Minutes = Minutes + 1
Seconds = 0
End If
If Minutes > 59 Then
Hours = Hours + 1
Minutes = Minutes - 60
End If
If Hours > 23 Then
Days = Days + 1
Hours = Hours - 24
End If
'
' Create format
'
Select Case Fmt
Case "D H"
FormatInterval = Days & IIf(Days <> 1, " Days ", " Day ") & Hours &
IIf(Hours <> 1, " Hours", " Hour")
Case "D H:MM"
FormatInterval = Days & IIf(Days <> 1, " Days ", " Day ") & Hours &
":" & Format(Minutes, "00")
Case "D HH:MM"
FormatInterval = Days & IIf(Days <> 1, " Days ", " Day ") &
Format(Hours, "00") & ":" & Format(Minutes, "00")
Case "D H:MM:SS"
FormatInterval = Days & IIf(Days <> 1, " Days ", " Day ") & Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "D HH:MM:SS"
FormatInterval = Days & IIf(Days <> 1, " Days ", " Day ") & Format(Hours, "00") & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "H M"
Hours = Hours + Days * 24
FormatInterval = Hours & IIf(Hours <> 1, " Hours ", " Hour ") & Minutes & IIf(Minutes <> 1, " Minutes", " Minute")
Case "H:MM"
Hours = Hours + Days * 24
FormatInterval = Hours & ":" & Format(Minutes, "00")
Case "H:MM:SS"
Hours = Hours + Days * 24
FormatInterval = Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
Case "M S"
Minutes = Minutes + (Hours + Days * 24) * 60
FormatInterval = Minutes & IIf(Minutes <> 1, " Minutes ", " Minute ") & Seconds & IIf(Seconds <> 1, " Seconds", " Second")
Case Else
FormatInterval = Null
End Select
End Function



  Ответить  
 
 автор: Lukas   (24.09.2008 в 19:23)   личное сообщение
 
 

Такое ощущение, что час в модуль класса не заглядывал.
Там 90% этого уже есть.

  Ответить  
 
 автор: час   (24.09.2008 в 19:28)   личное сообщение
 
 

заглядывал, извините, просто может чё интересное в этом коде попадётся....
Я не нарочно.... я просто выложил, для обозрения - прости если чё не так
А не вырезал, что ба не ошибиться.

  Ответить  
 
 автор: Lukas   (24.09.2008 в 19:30)   личное сообщение
 
 

Да я без обид. Просто слишком много.

  Ответить  
 
 автор: час   (24.09.2008 в 19:31)   личное сообщение
 
 

Уважаемый Lukas ? а вы описалово дополните........???

  Ответить  
 
 автор: Lukas   (24.09.2008 в 19:37)   личное сообщение
 
 

Я думаю, нам пора на ты, уже не одну выпили вместе.
Описание clsDate попробую наваять.

  Ответить  
 
 автор: час   (24.09.2008 в 19:44)   личное сообщение
 
 

Извините - этикет блюдю.
Чё тока не прочитаешь про эти даты

универсальный формат даты
Универсальный формат даты имеет вид #yyyy-mm-dd hh:mm:ss#.  Однако оба компонента, даты (#yyyy-mm-dd#) и времени (#hh:mm:ss#), допускают независимое представление.



почему-то год вообще впереди.....

  Ответить  
 
 автор: Pasat   (24.09.2008 в 20:18)   личное сообщение
 
 

Ничего удивительного.
Такой формат удобен для сортировки дат, когда даты представлены в формате строки

  Ответить  
 
 автор: час   (25.09.2008 в 10:28)   личное сообщение
 
 

Ясненько - удобнее стало быть....

  Ответить  
 
 автор: Lukas   (24.09.2008 в 20:20)   личное сообщение
2 Кб.
 
 

Описание класса clsDate.

Описал как умел.

  Ответить  
 
 автор: час   (25.09.2008 в 10:31)   личное сообщение
 
 

Чудесно!!!

  Ответить  
 
 автор: час   (25.09.2008 в 10:38)   личное сообщение
 
 

А проясните пожалуйста ситуацию.
Про модули класса.
У меня вощем-то ужеимеются модули (не класса), которые кочуют из базы в базу
это такие модули, как : Модуль таблиц, модуль дат, модуль ссылок и т.д.
И я значит ипользую функции. расположеные в этих модулях.
А чем модуль класса лучше?
Обращение так же идёт к опред. функц. находящейся в этом классе, но ещё надо создавать экземпляр класса.
Я чёта никак свого счастья не пойму???

  Ответить  
 
 автор: FORMAT   (25.09.2008 в 15:59)   личное сообщение
 
 

Сенькс за функции.
Со временем можно и дополнить класс. Но до ноября не будет времени.
А по поводу того, нужен ли класс, если есть модули с функциями, то в аксе это не принципиально. Удобство заключается в том, что нет необходимости запоминать название всех ф-ций. Класс сам подсказывает название функций.
Не знаю поддерживает, ли VBA наследование и полиморфизм, но VB.Net это поддерживается, поэтому создание классов там имеет смысл. Собственно, именно в VB.Net я и пришел к удобству создания классов. В аксе я их не использовал.

  Ответить  
 
 автор: час   (25.09.2008 в 20:03)   личное сообщение
 
 

Будем ждать Вашего возвращения в наши ряды..... ...
Удачи на трудном задании.......

  Ответить  
 
 автор: час   (25.09.2008 в 20:11)   личное сообщение
 
 

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

  Ответить  
 
 автор: Lukas   (29.09.2008 в 14:53)   личное сообщение
28 Кб.
 
 

Вариант №3 класса дат.
Добавил функции даты (первого и последнего дня) предыдущего и следующего (квартала, месяца, недели).
Подправил функции дат начала и конца недели.(У меня был сдвиг на 1 день)

  Ответить  
 
 автор: Pasat   (29.09.2008 в 15:50)   личное сообщение
 
 

Протестировал в отладчике - все Ок
Спасибо Lukas-у

Один вопрос
почему Public Property Get, а не Public Function .
Это принципиально

  Ответить  
 
 автор: Lukas   (29.09.2008 в 16:33)   личное сообщение
 
 

Огромные черные дыры в познаниях не дают возможности ответить на этот вопрос.
Но, думаю в данном случае, это не принципиально. Можно переписать и через функции.

  Ответить  
 
 автор: Denis V.   (29.09.2008 в 17:57)   личное сообщение
 
 

Думается, что где есть Public Property Get, там может быть и Public Property Let (Set). Т.е. в отличие от Public Function, може получаем свойство объекта Read/Write.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList