Приветствую уважаемых форумчан! Не могу в WHERE сравнить даты в запросе, выдает сообщение " Число содержит синтаксическую ошибку в выражении запроса 'Cdate(BegProekt>01.01.201)' ". Проверил содержание переменной DateBeg - все верно, тип Date, содержит значение 01.01.2018. Однако в сообщение дата обозвана числом и почему то обрезана справа до 01.01.201 - выглядит подозрительно. И почему ошибка именно синтаксическая - непонятно... Перебрал варианты которые знал - не помогло... Помогите разобраться, не могу понять где ошибся в строке:
Код
rs.Open "SELECT * FROM Itog WHERE CDate(BegProekt) >" & DateBeg & " ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
Сам текст, вроде ничего подозрительного
Код
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim DateBeg As String
DateBeg = UserForm.TextBox1
MsgBox TypeName(DateBeg)
MsgBox DateBeg
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Worksheets("Config").Cells(3, 2) & "Project.mdb; Jet OLEDB:Database;"
cn.Open ConnectionString
DateBeg = CDate(UserForm.TextBox1)
MsgBox TypeName(DateBeg)
MsgBox DateBeg
rs.Open "SELECT * FROM Itog WHERE CDate(BegProekt) >" & DateBeg & ", cn, adOpenDynamic, adLockBatchOptimistic
'rs.Open "SELECT * FROM Itog WHERE BegProekt >" & CDate(UserForm.TextBox1) & ", cn, adOpenDynamic, adLockBatchOptimistic'
End Sub
DateBeg - это текстовое значение из текстбокса. CDate делает его датой, поскольку его с датой и надо сравнивать. Про решетки - где их ставить, попробую. Формат даты пробовал разный - с точками и с слешем. Возможно собака порылась где то в этом районе...))
PS. Можно сделать резуме что с правой частью вроде нормально - надо разбираться с левой, где дата обрезана
Сделал так DateBeg = "01/09/2018" Ошибки нет, но и реакции никакой - рекордсет видимо пустой
Источник в первую очередь проверил. Это поле - дата и время, то есть тип данных дата. Хотя меня время смущает - может быть маленькое несоответствие. Может на пути из Акцесса в Ексель что то на лету происходит?
В запросе взял два поля с типом дата из источника - все нормально, между собой в запросе работают.
Да, в этой части CDate ставил - и справа и слева, и одновременно. И даже CDate(UserForm.TextBox1).... Стоп. С одним амперсендом??????? Ругается, если так
Код
rs.Open "SELECT * FROM Itog WHERE BegProekt<" & CDate(DateBeg)
Так у меня дебагер на эту проблемную строку и показывает. А как посмотреть дебагером, что с этой строкой не такк - опыта еще нет. Да и сомневаюсь что дебагер будет разбирать строку. Но будем пробовать...
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
Alexban65, ну если не знаете как посмотреть что даст ваша текстовая конструкция "SELECT * FROM Itog WHERE CDate(BegProekt) >" & DateBeg & " ORDER BY 1" то
Код
debug.print "SELECT * FROM Itog WHERE BegProekt >" & Cdate(DateBeg) & " ORDER BY 1"
Alexban65, то что это рекордсэт я понимаю, просто на маленьком экране не увидел параметров сперва и СN пропустил, но вот указывать его в дебаге не писал.
Alexban65, вам сначало нужно понять, в каком формате как данные дат хранятся в БД (Напр.2018-08-01 или 01/08/2018 или 01.08.18) потом нужно написать свою функцию которая дату будет преврящать в строку в нужном формате например
Код
with vba
DateBeg$=.day(.now) & "/" & .month(.now) & "/" & .year(.now)
end with
а в запросе не забудьте скобки одинарные.
Код
"SELECT * FROM Itog WHERE BegProekt >'" & Cdate(DateBeg) & "' ORDER BY 1"
Alexban65 написал: Это поле - дата и время, то есть тип данных дата.
допускаю, что это может быть и текст, но ТС пишет что дата Почему не просто Format(Date, "YYYY-MM-DD HH:MM:SS") или подобное? про одинарные "скобки" да, могут потребоваться, только это не скобки.
rs.Open "SELECT * FROM Itog WHERE BegProekt >" & DateBeg & " AND BegProekt is not null ", cn, adOpenDynamic, adLockBatchOptimistic
сообщение " Число содержит синтаксическую ошибку в выражении запроса 'Cdate(BegProekt>01.01.2018 AND BegProekt IS NOT NUL )' ". Опять откусил справа символ от NULL... Ох, неспроста это... Чудес не бывает, ошибка скорее всего перед глазами, на виду...))) Сходил в источник(ACCESS), открыл таблицу, поглядел формат - дата стоит в формате 25.09.2018, то есть штатно. Функция возвращает значение, сначала попробую подставить константу типа "01.08.2018"... Поставил
Код
& CDate("01.08.2018") &
- ругается, а как оформить правильно константу я не знаю пока...(( Хотя, если я правильно понимаю, одинарные кавычки это признак строковой переменной. Составил запрос в акцесе, выбрал все поля с типом дата, попробую собрать его в екселе, будем смотреть, пробовать...
Alexban65 написал: открыл таблицу, поглядел формат - дата стоит в формате 25.09.2018, то есть штатно.
Ваш SQL запрос - это текстовая строка. Дата в этой строке, как константа, должна быть в соответствующем формате, а не так как вам показывают в таблице (это зависит от региональных настроек).
Андрей VG написал: Доброе время сутокЦитата Alexban65 написал:открыл таблицу, поглядел формат - дата стоит в формате 25.09.2018, то есть штатно.Ваш SQL запрос - это текстовая строка. Дата в этой строке, как константа, должна быть в соответствующем формате , а не так как вам показывают в таблице (это зависит от региональных настроек).
Спасибо, ценная инфа для понимания
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
Андрей VG написал: Переключите локаль на штатовский английский будет 09/25/2018 - и что, в чём доказательство? Правильный формат даты в запросе.
Код
"#" & Format$(Date, "mm\/dd\/yyyy") & "#"
Такая конструкция в WHERE, в моем запросе, привела DateBeg к виду #08/01/2018#, отрабатывает без ошибок, recordcet создается и кладется на лист. Самостоятельно, новичку, такое отработать очень даже проблематично, если не сказать больше... Вот такой получился работоспособный вид: