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

Тема в разделе "Остальные БД", создана пользователем trss, 22 май 2009.

  1. trss

    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. если я только что написал полную ересь - сильно не бейте
     
  2. BOPOHA

    BOPOHA Well-Known Member

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

    stWhere = "Between " & usDate(statdate1.Value) & " And " & usDate(statdate2.Value)
    Чтобы запрос работал для такой ситуации:
    Код (Text):
    Between statdate1() And statdate2()
    функциям лучше всего возвращать тип Data. Тогда движок сам все сделает.
    Код (Text):
    Public Function statdate1() As String
    statdate1 = [TempVars]![statdate1]
    End Function

    Public Function statdate2() As String
    statdate2 = [TempVars]![statdate2]
    End Function
    Но! Есть вариант еще лучше! Любая форма имеет свойства Filter и FilterOn. В результате нужно будет сделать так:
    Код (Text):
    dim stWhere as String

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

    With Me.SubFormCtl.Form
    .Filter = stWhere
    .FilterOn = true
    End With
    Лучше не использовать в запросах скрытые фильтры, зависящие от временных переменных. Потом сопровождать это не удобно.
     
Загрузка...

Поделиться этой страницей