Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на выборку с вводом значения из формы 
:(
    Опции темы
BearEvg
Дата 12.9.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Начал делать поисковую форму, в которую вводяться данные, а потом они передаються в запрос на выборку. Помня совет bopoha не ссылаться напрямую на поля формы, сбрасываю все поля во временные переменные, а уже их использую как аргументы в запросе SQL. Для сравнения значений в основном использую оператор Like [TempVars]![Name]. Однако при работе поисковика некоторые поля формы могут оставаться пустыми, и подразумеваеться, что при поиске принимаються любые значения этих полей. Сначала я попробовал при задании временных переменных делать проверку поля, и если оно Is Null - то задавать в соответствующую временную переменную символ "*". Всё работало хорошо, но потом я обнаружил, что если значение поля в таблице было пустым, то такая запись не выводиться - поскольку эта зараза Access при выполнении оператора Like попросту отбрасывает все пустые строки, даже если строку он сравнивает с: "*".
Сначала я решил поставить в строках значение по умолчанию через свойства таблицы - но невразумительные символы в незаполненных строках при выборке смотрелись, мягко говоря, непрезентабельно.
Тогда я решил подкорректировать сам запрос и получилось вот что:
Цитата

SELECT *
FROM T1
WHERE (((Name1) Like [TempVars]![f2])) OR ((([TempVars]![f2]) Is Null));

Теперь всё работает как надо, но меня глужут смутные сомнения на предмет того, не слишком ли я всё усложнил?

Кроме того, учитывая, что полей в поисковой форме около 20, я поиск организовываю через серию подчинённых запросов, где каждый новый работает с результатами предидущего. Возникает вопрос, не замедляю ли я этим выборку, может лучше указывать все условия через AND? smile 
PM MAIL   Вверх
Akina
Дата 12.9.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Я вот не понимаю - почему ты не хочешь изменять саму строку запроса? не задано условие отбора? ну и не включай его в текст.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
BearEvg
Дата 12.9.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Нечто вроде того, что обсуждалось в этой теме?
Создание запроса на основе инфы, вводимой юзером
PM MAIL   Вверх
bopoha
Дата 12.9.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



AND или OR - зависит от необходимого результата.

Я в свое время написал гибкую функцию, которая брала настройку поиска (соответствие "имя эл. на форме" к "имя в таблице" и тип данных). Дальше она пробегала по форме собирала данные из элементов управления в строку "имя_поля = значение AND ...". Если значение не задано, то пропускается. Очень гибко и удобно. Дальше эта строка приклеивалась к запросу "SELECT ... FROM ... WHERE " & stSwhere. Или использовалась в качестве фильтра.
PM MAIL WWW ICQ Skype GTalk   Вверх
BearEvg
Дата 13.9.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



С учётом ваших советов у меня вышло вот что:

Код

Private Sub Key_2_Click()
Dim stLink As String
Dim counter As Byte
If Me![Pol1] <> 0 Then
    stLink = "([Name_1]Like " & "'" & Me![Pol1] & "')"
    counter = 1
End If
If Me![Pol2] <> 0 Then
    If counter = 1 Then stLink = stLink & " AND "
    stLink = stLink & "([Name_2]Like " & "'" & Me![Pol2] & "')"
    counter = 1
End If
'-- И так по всем условиям
If stLink <> "" Then
    DoCmd.OpenForm "Search", acNormal, , stLink '-- открываю форму с фильтром
Else
    DoCmd.OpenForm "Search_Err" '-- открываю модальную форму с сообщением, что поиск не может осуществляться по пустым значениям
End If
End Sub


Всё работает нормально, спасибо большое за совет smile 

P.S. Как я понимаю, если мне будет нужна будет не форма с фильтром, а именно запрос, то это:
Код

DoCmd.RunSQL stLink '-- с предварительным добавлением конструкции "SELECT ... FROM ... WHERE "
?
PM MAIL   Вверх
bopoha
Дата 15.9.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(BearEvg @  13.9.2008,  20:17 Найти цитируемый пост)
P.S. Как я понимаю, если мне будет нужна будет не форма с фильтром, а именно запрос, то это:
Выделить всёкод Visual Basic
1:
    
DoCmd.RunSQL stLink '-- с предварительным добавлением конструкции "SELECT ... FROM ... WHERE "
? 


DoCmd.RunSQL - только для запросов на выполнение, типа INSERT, UPDTAE или DELETE
PM MAIL WWW ICQ Skype GTalk   Вверх
Akina
Дата 15.9.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(bopoha @  15.9.2008,  15:07 Найти цитируемый пост)
DoCmd.RunSQL - только для запросов на выполнение, типа INSERT, UPDATE или DELETE 

Не обязательно. Порой и Select вызывается - но когда требуется не конечная выборка, а, скажем, срабатывание триггера.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
BearEvg
Дата 15.9.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Новый сюрприз от 2007 версии.

Мне понадобилось осуществить поиск по дате. Реализовал как:
Код

     stLink = stLink & "((Дата_1) = #" & Format(Me![Поле2], "dd/mm/yyyy") & "#)"

В итоге выдало ошибку в строке, которая формирует фильтр.
Изучение состояния переменных показало, что вместо перевода данных в вид 01/01/2008 команда Format переводит их в вид 01.01.2008, против чего начинает категорически возражать SQL-конструкция в поле фильтра.

Я пока вышел из положения следующим образом:
Код

     date_1 = Me![Поле11] & "/" & Me![Поле9] & "/" & Me![Поле13]
     stLink = stLink & "((Дата_1) = #" & date_1 & "#)"

Т.е. сделал в форме три последовательных поля dd, mm, yyyy и беру из них данные. Но вот чего надо сделать, чтоб заставить команду Format нормально работать?

И ещё один вопрос. SQL-конструкция в фильтре интерпритирует запись, например, 01/03/2008 как 03.01.2008, т.е. первые две цифры - месяц, вторые две цифры - день месяца, третьи четыре цифры - год. Это стандартная интерпритация, или я какую-то настройку упустил из виду?
PM MAIL   Вверх
bopoha
Дата 16.9.2008, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(BearEvg @  15.9.2008,  19:12 Найти цитируемый пост)
Изучение состояния переменных показало, что вместо перевода данных в вид 01/01/2008 команда Format переводит их в вид 01.01.2008, против чего начинает категорически возражать SQL-конструкция в поле фильтра.


На самом деле это не глюк (да и вообще прекращайте так думать, это портит карму и иногда вгоняет в краску)! Чтобы не происходило преобразования пишите, так: "dd\/mm\/yyyy"

Цитата(BearEvg @  15.9.2008,  19:12 Найти цитируемый пост)
Это стандартная интерпритация, или я какую-то настройку упустил из виду?

Акссесс по умолчанию преобразовывает дату и числа при преобразовании к строке в соответствии с реогиноальными настройками.

Это сообщение отредактировал(а) bopoha - 16.9.2008, 01:31
PM MAIL WWW ICQ Skype GTalk   Вверх
BearEvg
Дата 16.9.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Цитата(bopoha @ 16.9.2008,  01:30)
Чтобы не происходило преобразования пишите, так: "dd\/mm\/yyyy"

Сделал, работает правильно. Спасибо большое, но возник ещё один вопрос - а почему оно работает? В справке по команде Format конструкции с двумя слэшами нет. Это нюансы Вижуал Бейсика, или просто недокументированный режим команды?
PM MAIL   Вверх
Akina
Дата 16.9.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(BearEvg @  16.9.2008,  12:56 Найти цитируемый пост)
В справке по команде Format конструкции с двумя слэшами нет. Это нюансы Вижуал Бейсика, или просто недокументированный режим команды? 

Нет, это просто квотирование служебных символов... типа как квотится двойная кавычка в строковой переменной.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
BearEvg
Дата 16.9.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.6.2008

Репутация: нет
Всего: нет



Цитата(Akina @ 16.9.2008,  12:38)
Цитата(BearEvg @  16.9.2008,  12:56 Найти цитируемый пост)
В справке по команде Format конструкции с двумя слэшами нет. Это нюансы Вижуал Бейсика, или просто недокументированный режим команды? 

Нет, это просто квотирование служебных символов... типа как квотится двойная кавычка в строковой переменной.

Мда smile Называется - внимательней читайте справку. Прошу прощения за глупый вопрос.
PM MAIL   Вверх
bopoha
Дата 16.9.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Цитата(BearEvg @  16.9.2008,  13:34 Найти цитируемый пост)
внимательней читайте справку.

Это в разделе про форматы в общем.
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.