Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 463
от 23.01.2007, 22:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 237, Экспертов: 37
В номере:Вопросов: 2, Ответов: 5


Вопрос № 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
Отправлен: 18.01.2007, 22:09
Вопрос задала: Shizuku Tsukishima (статус: 3-ий класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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

.AddItem "BeginSpeaking", 2
Anims(2) = msoAnimationBeginSpeaking

.AddItem "CharacterSuccessMajor", 3
Anims(3) = msoAnimationCharacterSuccessMajor

.AddItem "CheckingSomething", 4
Anims(4) = msoAnimationCheckingSomething
'и т.д.
...

тогда Animation устанавливаем:
Assistant.Animation = Anims(Application.CommandBars("AssistantExt").FindControl(msoControlDropdown).ListIndex)

p/s
и обратите внимание, что Animation работает только у видимого Assistant, а он может быть скрыт, показывайте его при загрузке или по кнопке
Успехов

Приложение:

Ответ отправил: HookEst (статус: Студент)
Ответ отправлен: 19.01.2007, 07:09

Отвечает: Werewolf
Здравствуйте, Shizuku Tsukishima!
Все не работает если Assistant не установлен
это можно проверить так:

Приложение:

Ответ отправил: Werewolf (статус: Студент)
Ответ отправлен: 19.01.2007, 10:24


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.41 beta от 19.01.2007
Яндекс Rambler's Top100

В избранное