Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Вот я и не мог понять что ты там мутишь? И зачем нужно было городить огород из SQL. Разве только что
Quote (Вадим)
Но зато в SQL начал понемногу вникать.
но мне кажется что слова "понемногу вникать" громко сказано. Почитал я тему что Юра дал, легче с плагином разобраться чем со SQL. Хотя конечно не так страшен черт как его малюют. Нужна практика. Так что давай, дерзай, после расскажешь. Не хочешь читать хелп?
У меня та же задача, но как можно это реализовать средствами NeoBook DB работая с базами данных .DBF ? Одиночный поиск и поиск по нескольким критериям работает отлично, но если один из критериев не находит значение в базе, то выводит сразу всю таблицу со всеми значениями, как бороться? Башка кипит)) Или как сделать так, чтобы уже найденное не скидывалось при новом поисковом запросе dbfQuery
но если один из критериев не находит значение в базе
Все зависит от того, какое условие ставится.
Цитатаalex_loc ()
У меня та же задача
Та же, это какая? Показывайте, что вы пытаетесь делать.
Цитатаalex_loc ()
но как можно это реализовать средствами NeoBook DB
Все примерно точно так же как и в про, только в про возможностей чуть больше и работать с ним удобней. Нужно просто правильный запрос составить.
Цитатаalex_loc ()
и поиск по нескольким критериям работает отлично
Ну? А что нужно то?
Цитатаalex_loc ()
но если один из критериев не находит значение в базе, то выводит сразу всю таблицу со всеми значениями
В принципе логично. По идее должно выводить или всю таблицу, или пустую таблицу, так как ничего не найдено.
Не пойму, что именно не устраивает? Может быть это?
Из справки: Чтобы выяснить, найдено ли вообще хоть что-нибудь в результате запроса, можно воспользоваться глобальной переменной [dbfQueryResult]. [dbfQueryResult] содержит число записей, найденных в результате последнего запроса. Например:
Код
dbfQuery "sample.dbf" "City=Pittsburgh AND LastName=Jones"
If "[dbfQueryResult]" ">" "0"
AlertBox "Hello" "I found [dbfQueryResult] records."
Else
AlertBox "Hello" "I didn't find any records."
EndIf
Добавлено (04 Марта 2020, 22:18) ---------------------------------------------
Цитатаalex_loc ()
Или как сделать так, чтобы уже найденное не скидывалось при новом поисковом запросе dbfQuery
Ну в принципе на этот вопрос дал ответ из справки. Только вместо AlertBox, использовать команду dbfShowTable, или еще раз выполнить последний удачный поисковый запрос. Не хочешь читать хелп?
mishem, Я вывожу полную таблицу через dbfShowTable. Под таблицей для фильтрации есть несколько листбоксов, например цвет, размер и инпут поле для поиска по названию. Ввожу инпут, выводит значения соответствующие введенным символам, выбираю в листбоксе цвет- фильтр с введенным текстом сбрасывается и выводятся только значения с цветом... вывожу цвет, после клика по размеру выводит только записи с размером, игнорируя цвет Если ставить в условии AND, не выдаст ничего если хоть по одному критерию не будет ничего найдено. В общем нужно как то фильтровать последовательно, без сброса предыдущего критерия найденных значений, либо игнорировать безрезультатные значения
Так есть еще OR. AND = И, OR = ИЛИ. Есть еще скобки, с помощью которых можно создавать сложные выражения.
Я не совсем понимаю что тебе надо. Ты хочешь найти названия не зависимо от того какой у этих названий цвет. После в найденном хочешь найти цвет. После в найденном хочешь найти размер. Т.е. должны отображаться записи у которых соотвествуют названия, цвет и размер? Или соответствуют названия и соответствует или не соответствует цвет и размер?
Цитатаalex_loc ()
без сброса предыдущего критерия найденных значений, либо игнорировать безрезультатные значения
Вот это меня сбивает с толку. Не пойму, что именно нужно?
Цитатаalex_loc ()
без сброса предыдущего критерия найденных значений
Если не получается составить правильный поисковый запрос, можешь пойти другим путем. Например как ты пишешь вывести сначала все нужные значения и с помощью команды dbfExportAll сохранить все записи в файл. После во временный файл базы импортировать с помощью команды dbfImport сохраненные записи и уже искать в этой базе нужный цвет. Так же найденные записи можешь сохранить хоть в тот же файл и открыть опять в этом же файле базы. И наконец искать размер.
Или же можно не изощряться так и составить правильный поисковый запрос используя операторы AND, OR, скобки и т.д. Правда здесь нужно понять, что именно тебе нужно.
Добавлено (05 Марта 2020, 01:42) ---------------------------------------------
Цитатаalex_loc ()
либо игнорировать безрезультатные значения
Например тебе нужно название Петя, цвет Красный, размер 10. Есть названия Петя, цвет Красный, но нет ни в одной записи размера 10. Естественно это будет ложный поиск и не будет найдена ни одна запись, точно так же, если есть название Петя, размер 10, но нет цвета Красный.
Если тебе нужны все три значения, запрос будет выглядеть примерно так (смотри справку, я по памяти пишу, могу ошибаться): Название == Петя AND Цвет == Красный AND Размер == 10 Если все эти три значения соответствуют, то будут выведены все записи.
Если одно из значений не важно, то запрос можно составить примерно так (вот только не уверен, правильно это или нет. Пробовать нужно): (Название == Петя AND (Цвет == Красный OR Цвет <> Красный) AND (Размер == 10 OR Размер <> 10))
Т.е теоретически... Сначала ищет Название Петя. Если есть такое, ищет дальше цвет Красный. Если такого цвета нет, то соответственно следующий запрос Цвет <> Красный буде True. То же самое будет происходить и с размером.
В принципе этот запрос соответствует заросу Название == Петя Так как он найдет все записи с названием Петя, не зависимо от того, есть ли другие значения. По этому нужно составлять что то в духе этого: (Название == Петя AND Цвет == Красный AND Размер == 10) OR (Название == Петя AND Цвет <> Красный AND Размер == 10) OR (Название == Петя AND Цвет == Красный AND Размер <> 10)
Так по идее, будут найдены все записи где есть название Петя, и где есть хоть одно значение цвета или размера. Но это не точно, нужно проверять. Возможно нужно создавать более сложный запрос предвидя все возможные ситуации. Ну и естественно исходя из того, что именно тебе нужно. Не хочешь читать хелп?
Александр, наибыстрейший способ получить ответ на такой вопрос - скиньте сюда демо-проект (.pub) проблемы. Чтобы в нем не было ничего лишнего, а только то, что вы хотите, чтобы работало, а оно не работает. Чтобы была предельно ясна конкретная, стоящая перед Вами, задача.
Это важно, поскольку вариантов поиска в результатах поиска - море. Например, выше у меня был вариант, который я использовал в своём проекте (правда, для плагина NeoBookDBpro):
Листбокс позволяет выбрать столбец для поиска, помещает имя поля в переменную [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 EndIF
Добавлено (05 Марта 2020, 12:19) --------------------------------------------- Другой вариант поиска "в найденном" я использовал в проекте NeoCommands. Одна из версий программы доступна как .pub на форуме здесь.
Вот эта подпрограмма:
Код
:SostFiltr If "[CheckBoxVnaidennom]" "=" "" dbpQuery "NB" "Commands" "fSOURCE LIKE [#34]%[sourceX]%[#34] AND fTEAM LIKE [#34]%[teamX]%[#34] AND fDESCRIPTION LIKE [#34]%[descriptionX]%[#34]" Else If "[VnaidennomX]" "=" "" dbpQuery "NB" "Commands" "fSOURCE LIKE [#34]%[sourceX]%[#34] AND fTEAM LIKE [#34]%[teamX]%[#34] AND fDESCRIPTION LIKE [#34]%[descriptionX]%[#34]" SetVar "[VnaidennomX]" "fSOURCE LIKE [#34]%[sourceX]%[#34] AND fTEAM LIKE [#34]%[teamX]%[#34] AND fDESCRIPTION LIKE [#34]%[descriptionX]%[#34]" Else dbpQuery "NB" "Commands" "[VnaidennomX] AND fSOURCE LIKE [#34]%[sourceX]%[#34] AND fTEAM LIKE [#34]%[teamX]%[#34] AND fDESCRIPTION LIKE [#34]%[descriptionX]%[#34]" SetVar "[VnaidennomX]" "[VnaidennomX] AND fSOURCE LIKE [#34]%[sourceX]%[#34] AND fTEAM LIKE [#34]%[teamX]%[#34] AND fDESCRIPTION LIKE [#34]%[descriptionX]%[#34]" EndIf EndIf Return
Здесь я тоже юзаю NeoBookDBPro, но возможно, что общая логика применима и для NeoBookDB, я просто не проверял.
Смотрю сейчас справку, этот плагин похоже не поддерживает поиск с круглыми скобками.
Добавлено (05 Марта 2020, 23:58) --------------------------------------------- Без скобок можно использовать примерно такую комбинацию:
Код
dbfQuery "[PubDir]Base.dbf" "Name=[ComboBox1] And Color=[ComboBox2] And Size=[ComboBox3]" If "[dbfQueryResult]" ">" "0" Return Else dbfQuery "[PubDir]Base.dbf" "Name=[ComboBox1] And Color=[ComboBox2]" EndIf
If "[dbfQueryResult]" ">" "0" Return Else dbfQuery "[PubDir]Base.dbf" "Name=[ComboBox1] And Size=[ComboBox3]" EndIf
If "[dbfQueryResult]" ">" "0" Return Else dbfQuery "[PubDir]Base.dbf" "Name=[ComboBox1]" EndIf
Сначала будет искать по всем трем полям точное совпадение. Если такие записи есть, они будут отображены. Если их нет, то будет искать точное совпадение по имени и цвету. Если есть, отобразит их, если нет, будет искать по имени и размеру. И наконец если и таких нет, то отобразит все записи с искомым именем, или если и таких нет, выведет все записи.
Добавлено (06 Марта 2020, 00:09) --------------------------------------------- А вообще советую использовать NeoBookDBPro. Тем более что у него сейчас цена сравнительно приемлемая. 39 евро - это примерно 2 500 рублей. Налетай пока не подорожало. Я серьезно. Плагины DBPro и FM-FTP действительно стоят этих денег.