Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Требуется создать фильтрацию, способную работать по результатам предыдущей фильтрации. Поясню зачем:
В базе, содержащей ответы респондентов, есть поля: Дата; Подразделение; Должность; ФИО; пол; возраст и др...
Выбрал я, например, ответы всех респондентов с одного отдела предприятия (т.е. применил фильтр к полю "Подразделение"), а затем решил посмотреть как ответили мне именно инженеры этого отдела (т.е. теперь нужно, в имеющихся результатах фильтрации применить новую фильтрацию, но уже по полю "Должность". И так далее...
Т.е. нужно, чтобы поиск далее осуществлялся уже не по всей базе, а только по уже отобранным записям (результатам предыдущего запроса).
Я подумал, что если после запроса (выполненного командой dbpQuery) запоминать ID (или номера) найденных записей, а при следующем запросе искать только в тех записях, которые соответствуют этим ID/номерам, то получится как раз то, что нужно - поиск в результатах поиска.
Но как получить номера (или ID) записей, которые отразились в таблице после запроса (фильтра)?
Или можно как-то сформировать подходящий SQL-запрос?
Или нужно вообще как-то иначе организовывать поиск в результатах поиска?
Вадим, тебе не простительно дублировать посты. По SQL-запросу ищи в интернете. Сдесь врядли кто сможет дать ответ. А почему именно SQL? Не хочешь читать хелп?
Вот, кто то все же есть. Вадим, хотя боюсь ты Юру после достанешь. Будет тянуть одно за другим. И хочешь не хочешь, придется изучать этот язык.
Если честно, то не вижу смысла в мускуле. Зачем усложнять простую задачу, когда можно без предварительного поиска найти то что тебе нужно. И по времени врядли будет какое различие. Хотя тебе виднее.
SQL очень многое умеет, поэтому было бы здорово его начинать осваивать, особенно учитывая, что NB (лапочка!) еще и его поддерживает (через плагин NeoBookDBPro, по крайней мере)! Чего я буду огород городить, когда есть отработанные средства по работе с базами... А материалы в сети я, конечно, успел полистать. Там с наскоку не разобраться. Буду расти вместе с проектом...
Добавлено (09 Апрель 2011, 18:45) --------------------------------------------- Юра, что-то у меня под спойлером, в коде, переменные не влазят (видимо не срабатывает перенос на следующую строку). Нужно ли там что-то исправить или имена переменных не нужны?
Увидел таблицу, отдельное спасибо за перевод в SQL - так действительно удобнее мне
Вадим, таблица ведь одна. Почему сразу не делать выборку по нескольким полям с условием, что подразделение и должность будут такие-то?
То есть
Code
dbpExecSQL "Kultura" "SELECT [FIO] FROM Result WHERE [podrazdelenie] = 'Название подразделения' AND [dolzhnost] = 'Название должности'" ""
Код составил, опираясь на твой. И после SELECT, через запятую, можно выбрать нужные поля. Здесь для примера я выбрал ФИО всех людей с нужного подразделения и указанной должности. То есть, в секции WHERE можешь написать условия выборки.
Правильно ли я тебя понял...
Как организована структура БД, мне, конечно, не нравится Но не буду умничать, ты ведь начинающий человек в этом. Просто нужно разбить всё по таблицам. Людей отдельно, организации, отделы и так далее. Это будет правильнее, проще и нагляднее. Потом делать выборку данных из таблиц, связывая нужные поля по ID (первичный, внешний ключ), чтобы получить требуемый результат. Но ты к этом придёшь чуть позже, когда начнёшь понимать логику Управления Базами Данных.
Почему сразу не делать выборку по нескольким полям с условием, что подразделение и должность будут такие-то?
В реальности заранее не известно по каким полям придется сделать выборку. К примеру, мы имеем базу ответов по тесту и теперь анализируем результаты. Отобрали всех по одному отделу, потом решили сравнить их по должности, потом по стажу, а может быть сначала по стажу, а потом по отделу и должности, и т.д. Я как раз и хочу сделать так, чтобы пользователь мог сначала по одному столбцу отобрать, потом по другому и в любом порядке... И чтобы поиск не велся все время по всей базе, а по результатам предыдущего запроса (если, конечно, это вообще имеет значение, для скорости работы).
Quote (YURIY)
Правильно ли я тебя понял...
Не могу знать, поскольку я сам себя в этой теме не понимаю :). Ведь я не пока знаю, как принято такие задачи решать.
Quote (YURIY)
Просто нужно разбить всё по таблицам. Людей отдельно, организации, отделы и так далее.
Да, это мне пока действительно не понятно, но потом разберусь. Сейчас уже в глазах "песок", трудная неделя, мозги не варят. Завтра займусь. Тогда, возможно, и вопросы задам более осмысленные.
YURIY я вот не знаю пинцип SQL. Но судя по коду, все это можно сделать плагином без SQL. Есть команда dbpQuery. И с помощью нее можно задать поиск сразу по всем полям.
Code
dbpQuery "База данных" "Таблица" "podrazdelenie = Название подразделения AND dolzhnost = Название должности AND ..... далее все поля в каких надо произвести поиск"
Такж же можно использовать OR. Плюс можно искать по полному соответствию, по бюукве, по части слова, и т.д.
Я не пойму лично зачем Вадиму надо найти сначало одно, а после уже искать что то другое. Когда можно сразу запрос сделать того что именно надо.
dbpQuery "База данных" "Таблица" "один отдел= один отдел" потом решили сравнить их по должности, dbpQuery "База данных" "Таблица" "один отдел= один отдел AND должность = должность"
Quote (Вадим)
а может быть сначала по стажу,
Ни кто ж не отменял If , Else, EndIf.
Quote
если, конечно, это вообще имеет значение, для скорости работы
Ну это все зависит от размера базы. Но думаю что не сильно будет заметно
Добавлено (10 Апрель 2011, 01:13) --------------------------------------------- Вообще, как я когда то понял SQL удобно использовать по сети. И при работе с одной базой на одном компьютере он ни к чему. Хотя я могу и ошибаться. Давно инфу читал, и вполне возможно что что то путаю.
Вообще, как я когда то понял SQL удобно использовать по сети
сол, это язык обращений к бд, если быть точнее, то язык структурированных запросов. Т.е. применяется для обращения к БД(создание/удаление/изменения/поиск и т.д.). Без разницы один юзер или много запрашивают данные, с ним удобней, т.к. он для этого и создан Давно читал, что его создавали для простых юзеров, но потом его напичкали разным и он стал подвластен только програмерам
Есть, и подстановочные знаки можно использовать, даже в dbpQuery, не говоря уже о dbpExecSQL; в описании последней говорится:
Выполнение команды продвинутого языка структурированных запросов (SQL). Используя эту команду, Вы можете выполнить много типов команд SQL. Однако, имейте в виду, что часто есть различия в особенностях и синтаксисе между различными базами данных. Лучше всего обратиться к документации базы данных, чтобы гарантировать полную поддержку, используемых Вами команды SQL.
Quote (mishem)
Я не пойму лично зачем Вадиму надо найти сначало одно, а после уже искать что то другое. Когда можно сразу запрос сделать того что именно надо.
Это обусловлено самим процессом анализа объемной и разнородной информации - цель следующего шага поиска часто появляется только после прохождения предыдущего шага фильтрации информации.
У меня сейчас по кнопке "Фильтр" выводится диалоговое окно, в котором предлагаются листбокс и поле ввода. В листбоксе можно выбрать поле для поиска (столбец), а в поле ввода ввести любые символы для поиска (они автоматом окружаются подстановочными знаками и в результатах запроса отобразятся все записи их включающие, в данном столбце). Но вот как сделать так, чтобы следующий вызов окна "Фильтр" позволяя снова выбрать столбец и ввести символы для поиска уже задавал поиск в результатах предыдушего запроса, а не снова по всей базе?
Попробую объяснить зачем. Вот, пожелали мы увидеть как ответили инженеры, отфильтровали все результаты по должности и вдруг обнаружился большой разброс их ответов на конкретный вопрос (отвечали они на каждый вопрос проставляя цифру от 1 до 7). - Ого! - думаем мы. - Оказывается по этому вопросу люди ставили и самые низкие баллы! Тэкс, кто это интересно поставил единичку? (Т.е. мы заранее не знаем, что нас может заинтересовать). Теперь выбираем для поиска поле с ответами по данному вопросу и вводим для поиска цифру "1". В результате получаем список тех инженеров, кто ответил по данному вопросу цифрой "1". Если же поиск в этот раз будет вестись снова по всем полям всей базы, то единичку я получу и в поле "время", и в поле "дата", не говоря уже о единичках в качестве ответов на другие вопросы, чего мне совсем не надо.
Покажу еще на другом примере. Предположим (просто для примера), у нас база данных товаров автомагазина, есть поля "наименование", "в наличии (шт)", "ожидается поступление (шт)", "ближайшее поступление (дата)", "поставщик", "брак" и др. И наименований море. Решаем мы проверить как обстоят дела с летними шинами (вроде как сезон народу менять, надо обеспечить наличие, проверить заключение договоров на поставку, заодно проверить работу менеджеров...). Фильтруем по "наименованию" (выбрали через диалоговое окно столбец "наименование" и ввели в поле поиска три буквы "шин") - получили список доступных, окинули взглядом, оказалось все в порядке - и в наличии есть и ожидаемое поступление и дата его вполне годятся. Сбрасываем фильтр и удовлетворенно пьем кофе. А если наименований окажется очень много и несколько дат поступления? "Одним взглядом" тут вывод не сделать. Тогда надо поиск организовать так, чтобы увидеть "пробелы" или "двойную поставку" от одного и того же поставщика (допустим менеджеры разных отделов между собой не согласовали и в результате фирма оплатит полупустую доставку дважды, а могли бы все разом скомплектовать и привезти). Еще есть время исправить ошибку. Поэтому сортируем (просто щелкаем по заголовку столбца "поставщик") и смотрим на даты, и видим, что у одного и того же поставщика встречаются разные даты доставки. Тогда снова нажимаем "Фильтр", в качестве поля для поиска выбираем "поставщик", в поле поиска (теперь зная какая дата нас интересует) набираем дату, чтобы в результатах поиска увидеть те наименования и число штук, которые заказаны у данного поставщика (чтобы оценить загруженность машины). И нам в этом поиске совсем не надо, чтобы вылезли и другие записи из базы, в которых есть данная дата.
Т.е. всякий раз нужно искать дальше, но в результатах предыдущего поиска и всякий раз по одному единственному столбцу. Если бы мы знали заранее, что нас может заинтересовать, то проблем бы не было, а поскольку нам и требуется инструмент для анализа, то и нужен такой ступенчатый поиск по результатам поиска.
Я понимаю, что сделать это просто, а как сделать не понимаю
У меня появилась версия как обойтись для такой простой задачи без SQL - в первом посте я обозначил предположение, что можно запоминать строки (номера найденных записей), чтобы потом направлять поиск только по ним, но как это сделать? А если в SQL уже есть стандартное решение для "поиска в результатах поиска" (а такого решения не может не быть, ведь если база большая, то всякий раз искать по всей базе - бессмысленная трата ресурсов), то зачем выдумывать запоминание номеров найденных строк?
Есть у кого ссылка на хороший мануал по синтаксису SQL?
В реальности заранее не известно по каким полям придется сделать выборку.
Да и не проблема! Запрос, который ты подставишь - это строковая переменная. Сколько дополнительный полей будет для сортировки, столько ' AND field = value' ты присоедини в конец к ней! Потом отдаёшь на запрос.
Quote (Вадим)
И чтобы поиск не велся все время по всей базе, а по результатам предыдущего запроса (если, конечно, это вообще имеет значение, для скорости работы).
Я тебя умоляю... Выборка тысяч до 10 записей будет очень быстрой. Сомневаюсь, что ты и столько записей заведёшь. Да и не стоит забывать, что в sql тоже есть свои внутренние механизмы кеширования.
Quote (Вадим)
Не могу знать, поскольку я сам себя в этой теме не понимаю :)
Ээ, ну ты мой код вставь к себе в проект. Судя по твоему описанию в начале темы, я тебе ответил на вопрос правильно.
Quote (mishem)
YURIY я вот не знаю пинцип SQL. Но судя по коду, все это можно сделать плагином без SQL. Есть команда dbpQuery. И с помощью нее можно задать поиск сразу по всем полям.
Фактически тоже самое, что написал я Плагин это всё преобразует в тот же код, что и у меня, после выполнит запрос к БД.
Quote (mishem)
Ни кто ж не отменял If , Else, EndIf.
Стоп... Какие ифы могут быть в запросе sql? Отделите NB от SQL. Не смешивайте их. Всё делается с помощью SQL! А результат выборки отобразите пользователю средствами NB.
Quote (mishem)
И при работе с одной базой на одном компьютере он ни к чему. Хотя я могу и ошибаться.
База данных - это место для хранения и быстрого отбора/модификации данных. Нельзя сказать, что одному человеку на одном компьютере это не нужно. Ещё как нужно! Сам понимаешь, что звучит глупо.
Quote (Сергей)
а есть аргумент LIKE в нем?
У вас есть SQL-плагин, соответственно, можете использовать в запросах всю мощь языка!
В общем, Вадим, воспользуйся моим советом, попробуй хоть для начала и всё получится.
Сколько дополнительный полей будет для сортировки, столько ' AND field = value' ты присоедини в конец к ней!
А, понятно теперь. Просто в примере кода выше ты использовал в качестве названий полей имена переменных для содержимого полей, это меня и сбило с понталыку. Сейчас буду пробовать! Синтаксис SQL не знаю, от сюда и трудности, оказывается поля можно перечислить вместе с их значениями... Спасибо! Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
Просто в примере кода выше ты использовал в качестве названий полей имена переменных для содержимого полей, это меня и сбило с понталыку.
Блин, я ж забыл, что у вас переменные в квадратных скобках Пардон! Как вы не заметили мой косяк Но я больше визуально хотел отразить суть примера. Конечно там вместо переменных сразу указывай названия нужных полей!
Quote (Вадим)
Есть у кого ссылка на хороший мануал по синтаксису SQL?
Я еще больше упростил жизнь и себе, и людям добавив префикс "f" к имени поля (в пятом посте есть об этом; по префиксу всегда понятно, что речь идет об имени поля). Кроме того, решил имена полей записывать всегда прописными буквами, так префикс не теряется и всё наглядно. Надеюсь, я этим не нарушаю эффективных традиций программирования...
Вадим, есть еще импорт и экспорт. Ты можешь экспортировать те записи которые были найдкены, после их загрузить в овый файл базы и в нем уже продолжить поиск. И так до бесконечности. Это как вариант.
Quote (YURIY)
Фактически тоже самое, что написал я
Так и я ж об этом. Просто тяжело расуждать о том чего не знаешь. Я имею ввиду SQL.
Quote (YURIY)
Какие ифы могут быть в запросе sql?
Я имел ввиду не SQL. Работа со SQL это одна из команд того же плагина по БД. Хотя ладно, проехали. Я просто скорей всего что то не допонимаю. Не хочешь читать хелп?
Ты можешь экспортировать те записи которые были найдены, после их загрузить в новый файл базы и в нем уже продолжить поиск. И так до бесконечности.
Обана! Класс! Еще одно решение ! mishem, спасибо за идею!! Я обязательно запомню этот вариант! Только, раз уж взялся, то попробую сначала еще SQL поюзать... Юра дал ссылку на шикарный источник - синтаксис SQL там описан очень подробно и с примерами. Бесплатный онлайн курс программирования в VisualNEO Win (NeoBook)
Вадим, есть еще импорт и экспорт. Ты можешь экспортировать те записи которые были найдкены, после их загрузить в овый файл базы и в нем уже продолжить поиск.
Друзья мои, вы прикалываетесь что ли Вы ушли из файлов в базу данных, чтобы не пользоваться медленным и неудобным хранилищем данных. И хотите вернуться назад?
Quote (mishem)
Это как вариант.
Очень плохой вариант. Ещё раз говорю - "уточнить запрос" (дописать дополнительные условия в секцию WHERE) и сделать новую выборку. Всё!
Не занимайтесь тем, чем вы не должны заниматься! Для работы с SQL алгоритмы очень тщательно проработаны, чтобы всё было максимально быстро и удобно! И, уж поверьте, - это работает быстрее, чем с файлами + потом парсить в них данные с помощью NB, чтобы вытащить поля и вывести их, как надо!
Юра, а в секции WHERE допустимо использовать подстановочные знаки (чтобы можно было искать по нескольким символам). Например:
dbpExecSQL "Kultura" "SELECT * FROM Result WHERE [Zapros]" ""
где [Zapros]: [переменная с именем поля запроса1] = '[%[переменная поля ввода запроса1]%]' AND [переменная с именем поля запроса2] = '[%[переменная поля ввода запроса2]%]' AND [переменная с именем поля запроса3] = '[%[переменная поля ввода запроса3]%]' "" И при каждом новом запросе мы просто добавляем AND с указанием по какому полю и какие символы искать. Так?
Смотри. Если тебе нужен поиск по начальным, к примеру, символам, то это делается вот так:
... WHERE имя_поля LIKE нач_значение%
То есть, используется ключевое слово LIKE. После ты пишешь шаблон. Знак процента позволяет пропустить группу символов (для %ква найдётся Москва, например). Подставишь точку - 1 символ может быть любым (для .осква снова найдётся наша столица).
Можно совмещать всё это. Например, найти все значения, в которых присутствует группа символов в любой части поля:
%группа_символов%
И так далее.
Quote (Вадим)
чтобы можно было искать по нескольким символам
Вот этой информации тебе и будет достаточно. И всё это можно связать также логическими операторами AND, OR и так далее.
Для работы с SQL алгоритмы очень тщательно проработаны,
Это понятно. Когда знаешь что делать. Я дал как вариант если не использовать SQL.
Quote (YURIY)
чем с файлами + потом парсить в них данные с помощью NB,
Парсить не надо. В плагине есть функция экспорта заданных строк. К примеру. провели поиск по базе. Выводятся только те строки, которые мы запросили для поиска. Эти строки экспортируем в переменную. Создаем новую временную базу и заносим туда из переменной найденные строки. И в них уже ищем следующее. На все про все и секунды не потратится. Но опять же, это как вариант если не знаешь SQL. А я его не знаю. Не хочешь читать хелп?
Я там просто решил не в строку записать, а столбиком, чтобы читалось легче.
Я понял, да. Просто ты немного некорректно оформил запрос. Так нельзя. Без LIKE.
Quote (Вадим)
А, так LIKE может идти после WHERE?!
Внутри Это оператор в секции WHERE. Есть ещё BETWEEN, например. Для отбора значений между двумя заданными.
А про нашу задачу выше всё выглядит примерно так:
SELECT * FROM table WHERE field1 LIKE %value AND field2 LIKE %value%
Quote (mishem)
Но опять же, это как вариант если не знаешь SQL.
Ясно Ну ничего, я Вадиму корочки рассказываю, он быстро войдёт в тему Наблюдая за нашей беседой, вы поймёте и сами, что сложного ничего нет. Не сложнее, чем код, который вы пишете в NB. Но это, конечно, только самая малая доля SQL. Там просто море крутых возможностей есть, но это вам не нужно. Даже сам многое не применяю.
Quote (YURIY)
Подставишь точку - 1 символ может быть любым
Замечание хочу добавить. Где-то ставится точка, а где-то - символ подчёркивания. Зависит от формата базы данных. Как у тебя - на практике это поймёшь, если понадобится применить.
А про нашу задачу выше всё выглядит примерно так: SELECT * FROM table WHERE field1 LIKE %value AND field2 LIKE %value%
Вот, это мне уже понятнее!
УРА, ЗАРАБОТАЛА!!! Спасибо!!! Поиск в результатах поиска пашет!
Вот работающий код:
Листбокс позволяет выбрать столбец для поиска, помещает имя поля в переменную [listbox_field]. Поле ввода используется для получения искомых символов (переменная [TextEntry]).
IfEx "[listbox_field] <> [#34][#34] AND [TextEntry] <> [#34][#34]" If "[Zapros]" "<>" "" SetVar "[ZaprosNew]" "[listbox_field] LIKE [#34]%[TextEntry]%[#34]" SetVar "[Zapros]" "[Zapros] AND [ZaprosNew]" dbpExecSQL "Kultura" "SELECT * FROM Result WHERE [Zapros]" "" Else dbpQuery "Kultura" "Result" "[listbox_field] LIKE [#34]%[TextEntry]%[#34]" SetVar "[Zapros]" "[listbox_field] LIKE [#34]%[TextEntry]%[#34]" EndIf Else EndIF