Нужна помощь по Microsoft VB
1788
6
Срочно нужен хелп. Вопрос состоит в том чтобы правильно написать следующее выражение:
D3.Open "select * from [R] where [Podrazd]='" + CStr(Pod) + "' and [Date]>=#10/06/03# and [Date]"+cstr(x1)+" and [Date]
NoWhere Man
x1, x2 - в каком формате? И в какой формат переводит их cstr()? Не раз натыкался на проблему строкового форматата даты: dd/mm/yy, mm/dd/yy, dd.mm.yy, mm-dd-yy...
Cactus
x1и х2 в кратком формате даты, в таблице они записаны как 12.03.2003, в строковые значения пытался перевести по разному и "12.03.2003" и #12.03.2003# и #12/03/03# и "12/03/03" не понимает, в принципе строковый формат можно сделать любой это не проблема но просто у меня уже фантазии не хватает выдумывать в каком виде еще можно представить дату. В принципе VB частенько проглатывает написание, т.е. не выдает ошибки но и не выполняет это условие.
Кстати забыл добавить для пущей ясности что D3 позиционируется как
Private D3 As New ADODB.Recordset
NoWhere Man
x1и х2 в кратком формате даты, в таблице они записаны как 12.03.2003, в строковые значения пытался перевести по разному и "12.03.2003" и #12.03.2003# и #12/03/03# и "12/03/03" не понимает
Даты в SQL запросах должны быть в американском формате: mm/dd/yyyy, т.е. 12.03.2003 будет 03/12/2003
Well
Так тоже было, я просто не стал перечислять все испробованные варианты. Дело в том что SQl запрос в Акцессе воспринимает даты в формате
#01/01/2003#, а VB в таком формате даты не воспринимает - не понимает он "#"
to Well
Если вы предложили это исходя из имеющейся работоспособной БД, с подобным требованием, то можно ли ее бросить мне на почту - может я просто что-то не так понимаю.
ferrarium@yandex.ru
NoWhere Man
VB в таком формате даты не воспринимает - не понимает он "#"
Причем тут VB? Запросы воспринимает Jet, и ему все равно, на чем написан клиент - VBA,VB или Delphi, например. Так что # будет работать везде, если вы работаете с базой Access.

Следующий код на VB.Net выбрает даты между 1.12.2003 и 31.12.2003. Запрос также проверен на Delphi, работает.


Dim con As New ADODB.Connection()
Dim rst As New ADODB.Recordset()

con.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\...\test.mdb;Persist Security Info=False", "Admin")
' Таблица: create table a(id int not null primary key, d date not null)
rst.Open("select * from a where d between #12/01/2003# and #12/31/2003#", con)

If Not rst.EOF Then rst.MoveFirst()
While Not rst.EOF
' ....
rst.MoveNext()
End While


Если даты периода требуется подставлять самому, то надо в запрос их вставлять в формате #mm/dd/yyyy#. Естественно, что CStr тут не подходит, надо написать свою функцию что-то типа(схематично):

Function DateToSQL(ByVal d As Date) As String
Dim mm As Long, dd As Long, yyyy As Long

mm = Month(d)
dd = Day(d)
yyyy = Year(d)

DateToSQL = "#" & mm & "/" & dd & "/" & yyyy & "#"
End Function
Well
Спасибо за помощь!