|
|
|
| Почему не прокатывает условие отбора
Data1=("01,01," & Nz(Me!God))
Число содержит синтактическую ошибку в выражении
или так надо
("#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"))
| - не катит | |
|
| |
|
|
|
| а так?
"Date_First =" & Format$(Data1, "\#mm\/dd\/yyyy\#") | |
|
| |
|
|
|
| А так ошибка преобразования данных , извините
ДДДУУУРРРДДДОООМММ!!! | |
|
| |
|
|
|
| Точки вместо запятых при формировании Data1
А еще правильнее склеивать функцией DataSerial
(если не наврал) | |
|
| |
|
|
|
| Не наврал - дате сериал.
Я и точки и слэщи и запятые и решотки ставил и преобразовывал.
Вручную можно вписать по любому - а критерий отбора - поиск нужной сроки в таблице по значению (дата)
неверное число........... в условии отбора
Перевёл всё в тектовые поля - конечно всё нормально работает,
но сортировать текст и даты это разные результаты!!!! | |
|
| |
|
|
|
| А полный текст строки запроса покажите | |
|
| |
|
|
|
|
Call Zapis_v_Tablici("Free_Date_Film", "Region_Air", "Date_Last_Air", Nz(!Region_Air), Data1, "Date_First_Air = '" & Data1 & "'")
|
| |
|
| |
|
|
|
| ЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁЁ
Видимо ошибочка вот хде
If StrCritery = "" Then GoTo Bez_StrCritery ' Если критерий не задан - его и не проверяем
.FindFirst StrCritery 'поиск критерия
Bez_StrCritery:
|
при проверке критерия
видимо надо
| |
|
| |
|
|
|
| Поскольку StrCritery подразумевается как String то правильно так:
If Len(StrCritery)=0 Then
или
If StrCritery = "" Then
|
| |
|
| |
|
|
|
| Да точно - спасибо - это If Len(StrCritery)=0 Then универсально. | |
|
| |
|
|
|
| Не ну это точно не катит:
"Date_First_Air = '" & Data1 & "'"
|
Попробуйте так:
"Date_First_Air = " & "#" & Format(Me.ListFiltr.ItemData(varItem), "mm\/dd\/yy") & "# "
|
| |
|
| |
|
|
|
| это когда я всё переделал под текстовые поля... | |
|
| |
|
|
|
| Вот так точно работает :
& "#" & Format(DataStart, "mm\/dd\/yy") & "#, "
|
| |
|
| |
|
|
|
| Решил более не выёживаться.
Добавил поле счётчик - там и сортировка будет.
как там .....
orderby on | |
|
| |
|
|
|
| Два маленьких совета, если позволите:
1. Данные могут вводится не по порядку следования дат, следовательно сортировка по счетчику будет
работать некорректно.
2. Напишите один раз Pablic Function funFormatDate (datDate As Date) As String
и вызывайте ее каждый раз при необходимости преобразования значения даты в строку.
И голова не будет болеть и ошибок будет меньше, и таскать можно из базы в базу.
| |
|
| |
|
|
|
| Огромное спасибо!!!
Советам всегда рад
Данные заносятся по порядку - это все дни года
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
|
| |
|
| |
|
|
|
|
А где високосные года?
| |
|
| |
|
|
|
| Високосные можно конечно.........
if year/4 = int(year/4 ) then
364 | |
|
| |
|
|
|
|
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
|
| |
|
| |
|
|
|
| В високосном году добавляется 29 февраля, следовательно дней будет 365+1=366
| |
|
| |
|
|
|
|
|
|
|
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
|
Вот такая потянет? ] | |
|
| |
|
|
|
| 1.
Нет второго параметра функции
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# | |
|
| |
|
|
|
|
| Тогда из всего вышесказанного вытекает - вот что:
Public Function funFormatDate(datDate As Date) As String
On Error Resume Next
funFormatDate = "#" & Format(datDate, "mm\/dd\/yy") & "#"
End Function
|
| |
|
| |
|
|
|
| Лучше как предложил osmor:
=Format(datDate, "\#mm\/dd\/yyyy\#")
|
| |
|
| |
|
|
|
|
Public Function funFormatDate(datDate As Date) As String
On Error Resume Next
funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")
End Function
|
Она, что будет универсальной и для запросов и для кода VBA и для полей форм , отчётов ....?? | |
|
| |
|
|
|
| Супер!
Скопирую себе, пока никто не видит.
| |
|
| |
|
|
|
|
| Если сохраненный запрос ссылается на поле формы, то она не нужна.
Для полей форм и отчетов она не нужна.
Она нужна только для формирования 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];"
|
Конечно форма должна быть открыта во время выполнения запроса. | |
|
| |
|
|
|
| И для REcordset ов , видимо........ | |
|
| |
|
|
|
| Сранно, но работает вот такой варьянт
Public Function funFormatDate(datDate As Date) As Date
On Error Resume Next
funFormatDate = Format$(datDate, "dd/mm/yyyy")
End Function
|
| |
|
| |
|
|
|
| А у меня не работает! | |
|
| |
|
|
|
| Привет!!!
А уменя
Public Function funFormatDate(datDate As Date) As String
On Error Resume Next
funFormatDate = Format(datDate, "\#mm\/dd\/yyyy\#")
End Function
возврат 0,00,00, | |
|
| |
|
|
|
| А какое значение datDate ? | |
|
| |
|
|
|
| 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 | |
|
| |
|
|
|
| А если забить вот это?
Для проверки, в окне отладки:
?Date()
13.09.2008
?funFormatDate(Date())
#09/13/2008#
|
| |
|
| |
|
|
|
| в оене отладки
?funFormatDate1(Date())
#09/13/2008#
А запрос говорит - вот эт ты накрутил выражение - упрости его, а то оно слишеом сложно. | |
|
| |
|
|
|
|
| 1. Обычно такие функции применяют для подстановки значения переменной в сохраненный запрос.
Если строка SQL формируется в коде, то это не лучший вариант, мне кажется.
2. Может правильнее проверять значение контрола, чем сохранять ошибки для дальнейшего анализа?
Что вернет функция при возникновении ошибки?
Какой результат выдаст запрос при возникновении ошибки в функции?
Почему функция не вопит, что ее не тем кормят?
Тут есть над чем призадуматься, как считаете?
| |
|
| |
|
|
|
| Извиняюся - это целиком функция с универс обработчиком - вырвал из проги не почистив.
Сама функция в одну строку :
Data_Arhiva()
Data_Arhiva = Forms![FRM_V_ARHIV]![Data1]
end
|
Пока в контрол не попадёт требуемое значение , до функции дело не дойдёт.
И лишь при просьбе запроса предоставить параметр - его пошлём мордой в эту функцию - получите пожалуйста. | |
|
| |
|
|
|
| кстати вот попалася функция
Приведение национального формата даты к формату используемому в построении SQL запросов
Function DateSQL(strDate As Variant) As String
DateSQL = "#" & Month(strDate) & "/" & Day(strDate) & "/" & Year(strDate) & "#"
End Function
|
| |
|
| |
|
|
|
| Я примерно такую и пользую, непонятно только почему strDate As Variant,
тогда уж varDate. | |
|
| |
|
|
|
| Результаты тестирования:
Тестируемые:
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
|
| |
|
| |
|
|
|
| Понятно!
Спасибо - наглядно.!!!
- там ещё три функции задействованы (встроенные правда)....
Получается в три раза медленнее (быстрее). | |
|
| |
|
|
|
| продолжая тему можно добавить
(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)
|
| |
|
| |
|
|
|
| Ещё Сергей Гаврилов (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
|
| |
|
| |
|
|
|
| Или вот Андрей Митин (писал в своё время)
Андрей Митин
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
|
| |
|
| |