• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Access переменная в запросе

  • Автор темы trss
  • Дата начала
T

trss

Изначально была такая проблема:

Access 2007. Есть на форме кнопка и 2 поля куда вводятся даты. При нажатии кнопки данные из полей записываются во временные переменные
TempVars("statdate1").Value = usDate(statdate1.Value)
TempVars("statdate2").Value = usDate(statdate2.Value)
(usDate - функция, преобразует даты в американский стандарт)
Затем открывается форма, содержащая подчиненную. В основе подчиненной лежит запрос на выборку.
Нужно, чтобы запрос каждый раз при нажатии на кнопку выдавал инфу за период(2 введенные даты), поэтому в конструкторе запроса на поле Дата в условии отбора пишу:
Between [tempvars]![statdate1] And [tempvars]![statdate2]
Access сообщает мне, что "Выражение неверно введено и является слишком сложным для расчета..."
Как заставить выполняться этот запрос, используя заранее введенные переменные?


мне посоветовали использовать вместо переменных функции. которые возвращают те же значения, что и у переменных. Я попробовал написать(опыт плохой в прогании) и столкнулся с этим:

В общем ситуация следующая:
поразмыслив теми малыми знаниями в области программирования, что у меня есть, я пришел к выводу, что функции, возвращающие нужные мне переменные должны выглядеть как-то так:

Public Function statdate1() As String
statdate1 = [TempVars]![statdate1]
End Function

Public Function statdate2() As String
statdate2 = [TempVars]![statdate2]
End Function

В конструкторе запросов в условии отбора поля Дата пишу:
Between statdate1() And statdate2()

В результате Аксес мне пишет о несоответствии типов.
Перед присвоением в теле функции переменная [TempVars]![statdate1] имела значение #05/22/2009#
После присвоения
statdate1 = [TempVars]![statdate1] - вот здесь
Функция вернула мне 22.05.2009

Отсюда и несоответствие типов. Что-то я совсем завис... Возможно я делаю что-то фатально не правильно? Где тут подвох?

P.S. если я только что написал полную ересь - сильно не бейте
 
B

BOPOHA

Скорей всего дело в том, что где-то происходить автоматическое преобразование даты к национальному формату.
Какой тип возвращает функция usDate? Но это подойдет, только для следующего случая:
Код:
dim stWhere as String

stWhere = "Between " & usDate(statdate1.Value) & " And " & usDate(statdate2.Value)

Чтобы запрос работал для такой ситуации:
Код:
Between statdate1() And statdate2()

функциям лучше всего возвращать тип Data. Тогда движок сам все сделает.
Код:
Public Function statdate1() As String
statdate1 = [TempVars]![statdate1]
End Function

Public Function statdate2() As String
statdate2 = [TempVars]![statdate2]
End Function

Но! Есть вариант еще лучше! Любая форма имеет свойства Filter и FilterOn. В результате нужно будет сделать так:
Код:
dim stWhere as String

stWhere = "Between " & usDate(statdate1.Value) & " And " & usDate(statdate2.Value)

With Me.SubFormCtl.Form
.Filter = stWhere
.FilterOn = true
End With

Лучше не использовать в запросах скрытые фильтры, зависящие от временных переменных. Потом сопровождать это не удобно.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!