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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Даты даты
 
 автор: час   (10.09.2008 в 08:05)   личное сообщение
 
 

Почему не прокатывает условие отбора
Data1=("01,01," & Nz(Me!God))

,"Date_First= " & Data1

Число содержит синтактическую ошибку в выражении
или так надо
("#01,01," & Nz(Me!God)&"#") ?
"CDbl(Date_First) = CDbl(" & Data1 & ")")
"CStr(Date_First) = CStr(" & Data1 & ")")
нет не катит.......

 "Format$(Date_First, ""mm/dd/yy"") =" & Format$(Data1, "mm/dd/yy")) 
- не катит

  Ответить  
 
 автор: osmor   (10.09.2008 в 10:52)   личное сообщение
 
 

а так?
"Date_First =" & Format$(Data1, "\#mm\/dd\/yyyy\#")

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

А так ошибка преобразования данных , извините

ДДДУУУРРРДДДОООМММ!!!

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

Точки вместо запятых при формировании Data1
А еще правильнее склеивать функцией DataSerial
(если не наврал)

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

Не наврал - дате сериал.
Я и точки и слэщи и запятые и решотки ставил и преобразовывал.
Вручную можно вписать по любому - а критерий отбора - поиск нужной сроки в таблице по значению (дата)
неверное число........... в условии отбора

Перевёл всё в тектовые поля - конечно всё нормально работает,
но сортировать текст и даты это разные результаты!!!!

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

А полный текст строки запроса покажите

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


                  Call Zapis_v_Tablici("Free_Date_Film", "Region_Air", "Date_Last_Air", Nz(!Region_Air), Data1, "Date_First_Air = '" & Data1 & "'")

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

ЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁ
Видимо ошибочка вот хде


If StrCritery = "" Then GoTo Bez_StrCritery ' Если критерий не задан - его и не проверяем
    .FindFirst StrCritery 'поиск критерия
Bez_StrCritery:


при проверке критерия
видимо надо

If StrCritery = 0 Then 

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

Поскольку StrCritery подразумевается как String то правильно так:

If Len(StrCritery)=0 Then
или
If StrCritery = "" Then

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

Да точно - спасибо - это If Len(StrCritery)=0 Then универсально.

  Ответить  
 
 автор: Lukas   (10.09.2008 в 20:00)   личное сообщение
 
 

Не ну это точно не катит:

"Date_First_Air = '" & Data1 & "'"

Попробуйте так:

"Date_First_Air = " & "#" & Format(Me.ListFiltr.ItemData(varItem), "mm\/dd\/yy") & "# "

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

это когда я всё переделал под текстовые поля...

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

Вот так точно работает :

& "#" & Format(DataStart, "mm\/dd\/yy") & "#, "

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

Решил более не выёживаться.
Добавил поле счётчик - там и сортировка будет.
как там .....
orderby on

  Ответить  
 
 автор: Lukas   (10.09.2008 в 20:14)   личное сообщение
 
 

Два маленьких совета, если позволите:
1. Данные могут вводится не по порядку следования дат, следовательно сортировка по счетчику будет
работать некорректно.
2. Напишите один раз Pablic Function funFormatDate (datDate As Date) As String
и вызывайте ее каждый раз при необходимости преобразования значения даты в строку.
И голова не будет болеть и ошибок будет меньше, и таскать можно из базы в базу.

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

Огромное спасибо!!!
Советам всегда рад
Данные заносятся по порядку - это все дни года

Public Sub Zapolnit_Table(Name As String) '  Занесение дней в таблицу
Dim Data1 As Date
Dim S1 As dao.Recordset
Set S1 = CurrentDb.OpenRecordset(Name, dbOpenDynaset)

If S1.RecordCount > 0 Then S1.MoveFirst
Data1 = ("01,01," & Forms![Free_Film]![God])
For f = 1 To 365
S1.AddNew
S1!Film_Name = Forms![Free_Film]![Film_Name]
S1!Date_First_Air = Data1
S1.Update
Data1 = DateAdd("d", 1, Data1)
Next f

Set S1 = Nothing
End Sub

  Ответить  
 
 автор: Lukas   (10.09.2008 в 20:38)   личное сообщение
 
 


For f = 1 To 365

А где високосные года?

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

Високосные можно конечно.........
if year/4 = int(year/4 ) then
364

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


Public Sub Zapolnit_Table(Name As String) ''  Занесение дней в таблицу
Dim Data1 As Date
Dim f As Long
Dim f1 As Long
Dim S1 As dao.Recordset

If (Forms![Free_Film]![God] / 4) = Int((Forms![Free_Film]![God]) / 4) Then
f1 = 364
Else
f1 = 365
End If

Set S1 = CurrentDb.OpenRecordset(Name, dbOpenDynaset)
If S1.RecordCount > 0 Then S1.MoveFirst
Data1 = ("01,01," & Forms![Free_Film]![God])

For f = 1 To f1
S1.AddNew
S1!Film_Name = Forms![Free_Film]![Film_Name]
S1!Date_First_Air = Data1
S1.Update
Data1 = DateAdd("d", 1, Data1)
Next f

Set S1 = Nothing
End Sub

  Ответить  
 
 автор: Lukas   (10.09.2008 в 20:59)   личное сообщение
 
 

В високосном году добавляется 29 февраля, следовательно дней будет 365+1=366

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



Извиняюся
Бошка совсем не варит - надо отдохнуть. 21ч-00м
Спасибо за беседу, за науку.
Развеяли засранку - скуку.
Но за день столько всего бывает
Что к вечеру бошка "не варит"!!!

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

*************************************************************************************************
*И голова не будет болеть и ошибок будет меньше, и таскать можно из базы в базу.*
************************************************************************************************
....................... .......................

..............................ЭТО МНЕ НРАВИТЬСЯ

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

Спасибо за помощь.!!!!!

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


Public Function funFormatDate(datDate As Date) As String
If Len(Nz(datDate)) = 0 Then Exit Function
If IsDate(datDate) = False Then Exit Function
funFormatDate = CStr(datDate)
End Function


Вот такая потянет? ]

  Ответить  
 
 автор: Lukas   (10.09.2008 в 20:48)   личное сообщение
 
 

1.

Nz(datDate)

Нет второго параметра функции
2.

If Len(Nz(datDate)) = 0 Then Exit Function
If IsDate(datDate) = False Then Exit Function 

Не нужны, так как ...(datDate As Date)...
Ничего кроме типа Date функция не заглотит.
3.

funFormatDate = CStr(datDate)

Она конечно станет строкой, только в запрос ее нет смысла подсовывать, так как ему нужен
американский формат даты: #mm/dd/yy#.
Например для 01 февраля 2008 года: #02/01/08#

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

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

Тогда из всего вышесказанного вытекает - вот что:


Public Function funFormatDate(datDate As Date) As String
On Error Resume Next
funFormatDate = "#" & Format(datDate, "mm\/dd\/yy") & "#"
End Function

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

Лучше как предложил osmor:

=Format(datDate, "\#mm\/dd\/yyyy\#")

  Ответить  
 
 автор: час   (10.09.2008 в 21:09)   личное сообщение
 
 


Public Function funFormatDate(datDate As Date) As String 
On Error Resume Next 
funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")
End Function


Она, что будет универсальной и для запросов и для кода VBA и для полей форм , отчётов ....??

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

Супер!
Скопирую себе, пока никто не видит.

  Ответить  
 
 автор: час   (10.09.2008 в 21:17)   личное сообщение
 
 

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

Если сохраненный запрос ссылается на поле формы, то она не нужна.
Для полей форм и отчетов она не нужна.
Она нужна только для формирования SQL строки в коде, например:
strSQL="Select ID From tblItem WHERE dateItem=" & funFormatDate(Me.fldDate) & ";"
или
strSQL="Select ID From tblItem WHERE dateItem=" & funFormatDate(ИмяПеременнойТипаDate) & ";"
А в таком синтаксисе она не нужна:

strSQL="SELECT tblItem.ItemText FROM tblItem WHERE tblItem.ItemShortDate=[Forms]![frmItem]![ItemShortDate];"

Конечно форма должна быть открыта во время выполнения запроса.

  Ответить  
 
 автор: час   (11.09.2008 в 09:08)   личное сообщение
 
 

И для REcordset ов , видимо........

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

Сранно, но работает вот такой варьянт


 Public Function funFormatDate(datDate As Date) As Date
On Error Resume Next
funFormatDate = Format$(datDate, "dd/mm/yyyy")
End Function

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

А у меня не работает!

  Ответить  
 
 автор: час   (13.09.2008 в 17:09)   личное сообщение
 
 

Привет!!!

А уменя
Public Function funFormatDate(datDate As Date) As String
On Error Resume Next
funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")
End Function

возврат 0,00,00,

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

А какое значение datDate ?

  Ответить  
 
 автор: час   (13.09.2008 в 17:27)   личное сообщение
 
 

11,13,2008
11.13.2008
11/11/08

Кстати

funFormatDate = Format(datDate, "\#dd\/mm\/yyyy\#")
funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")

funFormatDate = Format$ (datDate, "\#dd\/mm\/yyyy\#")
funFormatDate = Format$ (datDate, "\#mm\/dd\/yyyy\#")
результат 0,00,00

  Ответить  
 
 автор: Lukas   (13.09.2008 в 17:31)   личное сообщение
 
 

А если забить вот это?

On Error Resume Next 


Для проверки, в окне отладки:


?Date()
13.09.2008 

?funFormatDate(Date())
#09/13/2008#

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

в оене отладки
?funFormatDate1(Date())
#09/13/2008#

А запрос говорит - вот эт ты накрутил выражение - упрости его, а то оно слишеом сложно.

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

Я выкручиваюся вот так
Пишу функциии для запросов, которые будут рекордсетами
и они меня понимают... ....


Public Function Data_Arhiva() As Date
On Error GoTo Data_Arhiva_Error
'-------------------------------------------------------------------------------
Data_Arhiva = Forms![FRM_V_ARHIV]![Data1]
'-------------------------------------------------------------------------------
On Error GoTo 0
Exit Function
Data_Arhiva_Error:
Call Zapis_ERR("ARhiv_MOD" & "процедура->" & "Data_Arhiva", Err.Number, Err.Description)

End Function

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

1. Обычно такие функции применяют для подстановки значения переменной в сохраненный запрос.
Если строка SQL формируется в коде, то это не лучший вариант, мне кажется.
2. Может правильнее проверять значение контрола, чем сохранять ошибки для дальнейшего анализа?
Что вернет функция при возникновении ошибки?
Какой результат выдаст запрос при возникновении ошибки в функции?
Почему функция не вопит, что ее не тем кормят?
Тут есть над чем призадуматься, как считаете?

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

Извиняюся - это целиком функция с универс обработчиком - вырвал из проги не почистив.

Сама функция в одну строку :

Data_Arhiva()
Data_Arhiva = Forms![FRM_V_ARHIV]![Data1]
end


Пока в контрол не попадёт требуемое значение , до функции дело не дойдёт.
И лишь при просьбе запроса предоставить параметр - его пошлём мордой в эту функцию - получите пожалуйста.

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

кстати вот попалася функция
Приведение национального формата даты к формату используемому в построении SQL запросов



Function DateSQL(strDate As Variant) As String 
DateSQL = "#" & Month(strDate) & "/" & Day(strDate) & "/" & Year(strDate) & "#" 
End Function

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

Я примерно такую и пользую, непонятно только почему strDate As Variant,
тогда уж varDate.

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

Результаты тестирования:
Тестируемые:

Public Function DateSQL(varDate As Variant) As String
    DateSQL = "#" & Month(varDate) & "/" & Day(varDate) & "/" & Year(varDate) & "#"
End Function

Public Function funFormatDate(datDate As Date) As String
    funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")
End Function

Public Function Test()
    Dim datTest As Date
    Dim i As Long
    Dim strResponse As String
    
    datTest = Date
    Debug.Print "Start DateSQL", Time()
    For i = 1 To 5000000
        strResponse = DateSQL(datTest)
    Next i
    Debug.Print "End DateSQL", Time()
    Debug.Print
    Debug.Print "Start funFormatDate", Time()
    For i = 1 To 5000000
        strResponse = funFormatDate(datTest)
    Next i
    Debug.Print "End funFormatDate", Time()
    Debug.Print
End Function


А вот результат:

Start DateSQL               15:44:48 
End DateSQL                 15:45:18 

Start funFormatDate         15:45:18 
End funFormatDate           15:45:30 

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

Понятно!
Спасибо - наглядно.!!!
- там ещё три функции задействованы (встроенные правда)....
Получается в три раза медленнее (быстрее).

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

продолжая тему можно добавить
(A) VBA assumes automatically that any dates being used follow US Settings, ie #mm/dd/yyyy#. Use the Format function to return the correct date.

принимать автоматам любую подсунутую дату можно используя функции:

'Code Courtesy of
'Joe Foster
'
Global Const JetDateTimeFmt = "\#mm\/dd\/yyyy hh\:nn\:ss\#;;;\N\u\l\l"
Global Const JetDateFmt = "\#mm\/dd\/yyyy\#;;;\N\u\l\l"
Global Const JetTimeFmt = "\#hh\:nn\:ss\#;;;\N\u\l\l"

and then

SQL = SQL & "When >= " & Format$(Now, JetDateTimeFmt)

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

Ещё Сергей Гаврилов (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

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

Или вот Андрей Митин (писал в своё время)

Андрей Митин
http://am.rusimport.ru/MsAccess/topic.asp?id=134 
 
Часто возникают вопросы типа "Почему у меня не работает выражение "select * from [Tbl] where [Date]=#" & me.Дата & "#" (или что то в этом роде).
Чтобы корректно поставить условие по полю типа Date/Time необходимо всего лишь корректно отформатить значение - для Access формат даты должен быть следующим: #mm/dd/yy#. Для SQL-Server это выглядит чуть по-другому: yyyy-mm-dd (такой формат понимается при любых локальных настройках сервера).
Для облегчения можно применять приведенную ниже функцию, например так: "select * from [Tbl] where [Date]=" & FormatSpDate(me.Дата)

 
Public Function FormatSpDate(ByVal parDate As Date, Optional bSQL As Boolean = False) As String
If bSQL Then
   FormatSpDate = Format$(parDate, "'mm\.dd\.yyyy'")
'или можно так
'FormatSpDate = Format$(parDate, "'yyyy\-mm\-dd'")
Else
   FormatSpDate = Format$(parDate, "\#mm\/dd\/yy\#")
End If
End Function
 

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