Вопрос № 71532: Добрый день.
Есть таблица stat.mdb (access97). В ней есть поле DATED типа дата (краткий формат даты 00.00.0000), помогите сделать запрос, чтоб выбрать строки с условием промежутка даты. Среда VB6, использую обычный контрол Data.
Делаю:
Se...Вопрос № 71587: Попробовала написать программку, которая позволяет выбрать и просмотреть любую из анимаций офисного ассистента. Как альтернативу стандартной фукции "Мотор!" у персонажа, которая очень ограничена и не даёт никакой свободы выбора.
Мн...
Вопрос № 71.532
Добрый день.
Есть таблица stat.mdb (access97). В ней есть поле DATED типа дата (краткий формат даты 00.00.0000), помогите сделать запрос, чтоб выбрать строки с условием промежутка даты. Среда VB6, использую обычный контрол Data.
Делаю:
Select * from stat where dated between #02.01.2001# and #17.01.2004#
Пишет Syntax error in date in query expression.
Как правильно сделать запрос? И нужно ли вообще поле dated в таблице делать типа Дата, может оставить Строковой? И каким образом подготавливать дату при поиске и при добавлении в таблицу, чтоб на это не влияли региональные установки винды?
Отправлен: 18.01.2007, 14:49
Вопрос задал: PsySex (статус: Студент)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, PsySex!
Примерный вид запроса:
Form9.Data1.RecordSource = "Select * from stat where dated>=cdate ( '02.01.2001' ) and dated<=cdate ( '17.01.2004' ) "
Form9.Data1.Refresh
Сам текст запроса берется в двойные кавычки, а внутри запроса строковые выражения в одинарные.
Отказываться от применения полей типа ДАТА не стоит - занимает меньше места по сравнению со строковой записью и лучше работает сортировка, группировка и т.п. К тому же в запросе можно воспользоваться такими функциями работы с датами, как DAY ( ) , MONTH ( ) , YEAR ( ) и т.п.
Готовить данные тоже просто:
dim dat as data
dat=cdate ( '12.08.2003' )
dbf.execute " insert into stat ( dated ) values ( cdate ( ' " & dat & " ' ) "
Только из текста запроса убрать лишние пробелы.
А перед добавлением в таблицы проверять введенное пользователем значение даты функцией:
if isdate ( form5.text1 ) then
dat = cdate ( form5.text1 )
...
else
msgbox ( "Введеное значение не дата!" )
endif
Пользователь должен вводить дату в том формате, какой настроен в региональных настройках.
С уважением.
Ответ отправил: Филатов Евгений Геннадьевич (статус: 6-ой класс)
Ответ отправлен: 18.01.2007, 15:43 Оценка за ответ: 5 Комментарий оценки: Полный ответ на все мои вопросы. Спасибо.
Отвечает: HookEst
Здравствуйте, PsySex!
Можно написать:
Select * from stat where dated between #01/02/2001# and #01/17/2004#
Дело в том, что стандартная литерная запись дат требует разделителем "/" или "-" и порядок записи:
месяц/день/год. С разделителем "." можно записывать время. И в Вашем запросе #02.01.2001# - воспринимается как время, но 2001 секунда - это слишком много, отсюда и ошибка.
Попробуйте например код:
Private Sub Command1_Click()
Data1.RecordSource = "Select #01.02.03#,#01-02-03#,#01/17/2004# from stat"
Data1.Refresh
MsgBox Data1.Recordset.Fields(0) & "," & Data1.Recordset.Fields(1) & "," & Data1.Recordset.Fields(2)
End Sub
чтоб посмотреть, как принимаются разные форматы.
Удачи.
Ответ отправил: HookEst (статус: Студент)
Ответ отправлен: 19.01.2007, 08:27 Оценка за ответ: 4 Комментарий оценки: Спасибо за разъяснение, но ответ не полный.
Отвечает: Vvvv
Здравствуйте, PsySex!
Ну в предложеном запросе необходимо заменить точки на / в качестве разделителя даты и тогда все ОК, далее желательно дату задавать в формате YMD, для чего, например дату начала в вашем примере можно прочитать как 2 января или 1 февраля 2001 года и такие косяки будут... Третье дата должна быть датой, а не текстом, когда будешь сортировать поля при разных типах, результат будет разный, например Sring сортируется как 1, 11, 12, ..,19,2,20,21, в то время как число сортируется по порядку 1,2,3,4,..,10,11; Ну и удобства
вдруг потребуется конструкция типа where Year (dated) = 2005, со стрингом такое не прокатит. Ну и на последок две функции перводят Дату в стринг для SQL запросов под ACCESS, работала в связке VB6+ADO+ACCESS, думаю и в других случаях тоже будет работать...
Приложение:
Ответ отправил: Vvvv (статус: 1-ый класс)
Ответ отправлен: 19.01.2007, 14:50 Оценка за ответ: 4 Комментарий оценки: Особо ничего нового после предыдущих 2-х ответов, да и функция в приложении для моей задачи как собаке 5 нога ;-)
Вопрос № 71.587
Попробовала написать программку, которая позволяет выбрать и просмотреть любую из анимаций офисного ассистента. Как альтернативу стандартной фукции "Мотор!" у персонажа, которая очень ограничена и не даёт никакой свободы выбора.
Мне кажется, что программа работает не совсем так, как задумано.
Пожалуйста, оцените этот труд и помогите исправить ошибки:
http://www.sharing.ru/dl/017558/UserToolBar.xls.html
Отвечает: HookEst
Здравствуйте, Shizuku Tsukishima!
Все вроде работает, только возможные значения Animation (константы MsoAnimationType) отличаются от индексов ListItems(см приложение)
Можно или использовать Switch..Case.. или например создать массив связывающий ListIndex и MsoAnimationType:
в начало Module1:
Option Base 1
Public Anims(37) As MsoAnimationType
...
в Workbook_WindowActivate:
...
With .Add(Type:=msoControlDropdown)
AddItem "Appear", 1
Anims(1) = msoAnimationAppear