1 (edited by kodecs 2014-05-27 15:49:52)

Topic: SQL - поиск

Начал писать базу данных, сначала стандартными средствами, все супер!
Затем столкнулся с проблемой, а заключалась она в том что: Поиск стандартными средствами (Без SQL запроса) позволяет выбирать только ТОЧНЫЕ совпадения..

Прикинув что из за опечатки можно что то не найти, да и при достаточном объеме работы (и базы данных) точный поиск может стать "занозой", решил написать SQL запрос, долго шаманил - ничего не выходит.

SELECT FIRSTNAME FROM EmployeesTABLE WHERE LASTNAME LIKE '%'


Кажется работает как надо, выбирает имена отталкиваясь от совпадений в фамилиях (поскольку "%", то просто отображает все имена в базе)..

Как я ни пытался прицепить в этот код поле с содержащейся фамилией - ничего не выходило (обязательное условие что бы при вводе "ИВА" находило и "ИВАН" в т.ч. (проще говоря, как в код вписать правильно "%", что бы поиск не был "только точное значение"

PS поигравшись дома понял что фейлится именно поиск русских букв, на инглише поиск без привязки к полю работает нормально

SELECT FIRSTNAME FROM EmployeesTABLE WHERE LASTNAME LIKE 'mitr%'


Показывает Mitroshin

Re: SQL - поиск

И все-таки вопрос остается открытым, как сделать поиск на Русском и данные для поиска брались с нескольких полей? Сорри, если ответ очевиден, просто с SQL раньше не сталкивался.

Re: SQL - поиск

Приветствую,

Для поиска по вхождение, у компонента TextBox есть свойство Filter, выберите его значение %s%



Если все таки нужен SQL поиск используя несколько полей, то так


SELECT *

FROM person

WHERE
(case when '{edFirstName}'='' then 1=1 else person.firstname LIKE "%{edFirstName}%" end) AND
(case when '{edLastName}'='' then 1=1 else person.lastname LIKE "%{edLastName}%" end);

где edFirstName и edLastName это имена компонентов Textbox на текущей формы, с которых берется текст для поиска.

Dmitry.

Re: SQL - поиск

Спасибо большое за код, на скорую руку кинул в проект - заработало! Будем "играться" дальше! smile

Еще один глупый вопрос:
Вчера так же столкнулись с такой проблемой: Решили полезть в дебри SQL, в следствии чего и наткнулись на функцию SELECT и т.д. Возник вопрос: Какой лучше начинать читать мануал для хорошего понимания привязки SQL скриптов к проекту? MySQL, учебники по обычному SQL или какие либо еще.. т.к. читая разичные источники столкнулись с тем что даже функция SELECT описана по разному.
PS уровень знания синтаксиса SQL - ноль, сроки сжатые big_smile может что подскажете? smile

Спасибо, еще раз, за помощь !

Re: SQL - поиск

Могу это посоветовать
http://www.sql.ru/docs/sql/u_sql/


будут вопросы, пишите, помогу )

Dmitry.

Re: SQL - поиск

DriveSoft wrote:

Могу это посоветовать
http://www.sql.ru/docs/sql/u_sql/


будут вопросы, пишите, помогу )

Ну вот например в какую сторону нужно копать? Почитал я немного, сообразил как написать это:

INSERT into Sotrudniki (Fio, Familia, Ymia, Otchestvo, Kab, Otdel, Login, DataPriemaNA, Type)
VALUES ('{TextFio}', '{TextFamilia}', '{TextYmia}', '{TextOtchestvo}', '{TextKabinet}', '{TextOtdel}', '{TextLogin}', '{DateDataPriema}', "Сотрудник")


Сделано это потому как я хочу что бы при добавлении данных из формы "Добавить сотрудника" в базе сразу делалась отметка в колонке "Type" = "Сотрудник"
И у меня получилось через SQL код приведенный выше
Дальше - больше: Хотелось бы узнать как работать с несколькими значениями из полей для ввода

Например:
Мы имеем три поля '{TextFamilia}', '{TextYmia}', '{TextOtchestvo}' , хотим сделать "Фамилия И.О. ", для этого мне нужно объеденить значения трех полей в одну переменную, например командой CONCAT или CONCATWS.. Когда начал пытаться это вписать в код - (естественно?) это не дало мне результата (что больше меня смущает "CONCAT" даже не подсвечивается как команда)
Работает ли эта команда в прикрученной версии SQL?  Как создается переменная? (DECLARE @Fio as varchar(100)) не срабатывает//
вообще интересно как можно форматировать значения таблиц таким образом.. У меня все таки склад ума остался в экселе, там я делал подобную таблицу которая конвертирует Фамилию имя отчество в ФИО.. А тут в понимании SQL мне это мешает big_smile

Re: SQL - поиск

kodecs

я бы не рекомендовал увлекаться SQL кодом, иначе теряется все преимущество программы )


на счет  "Type" = "Сотрудник", у компонент Textbox есть свойство DefaultValue, которое позволяет задать значение по умолчанию, во время создания записи, возможно будет лучше туда списать значение Сотрудник.


но вообще это неверный подход, для того чтобы определять тип персоны, в вашем случае необходимо завести еще одну таблицу, которая будет использоваться как словарь, где и будут содержаться все варианты значения Type, посмотрите видео урок по созданию телефонного справочника, где абоненту присваивается группа.
https://www.youtube.com/watch?v=lN6_yeK84K8


на счет Фамилия И.О., можно создать вычисляемое поля следующего вида:
person.lastname || ' ' || upper(substr(person.firstname, 1, 1)) || '.' || upper(substr(person.secondname, 1, 1)) || '.'
правда у SQLite есть особенность, функция upper, не умеет работать не с английскими буквами, т.е. получится Иванов и.и.


либо тоже самое можно сделать с помощью скрипта
Form1.Edit1.Text := Form1.edLastName.Text + ' ' + Form1.edFirstName.Text[1] + '.' + Form1.edSecondName.Text[1] + '.';

Dmitry.

Re: SQL - поиск

DriveSoft wrote:

kodecs
я бы не рекомендовал увлекаться SQL кодом, иначе теряется все преимущество программы )


на счет  "Type" = "Сотрудник", у компонент Textbox есть свойство DefaultValue, которое позволяет задать значение по умолчанию, во время создания записи, возможно будет лучше туда списать значение Сотрудник.

Да ну, что вы! программа крайне полезна при любых раскладах, она очень простая в освоении!

Просто такие задачи как автоматическое создание ФИО в ней и не требуется, ибо очень уж специфическая задача, а раз уж выход SQL прикручен, почему бы и не попробовать (Если честно напугали слова

на счет Фамилия И.О., можно создать вычисляемое поля следующего вида:
person.lastname || ' ' || upper(substr(person.firstname, 1, 1)) || '.' || upper(substr(person.secondname, 1, 1)) || '.'

smile
А про скрипт вообще не яясно куда его писать как оформлять и как триггерить, но за наводку спасибо, думаю расковыряю)))

PS Я до того как написать предыдущий пост пробовал делать DefaultValue, это значение отображалось только в окне редактирования формы (что кстати помогает запомнить имя каждой формы когда пишешь код в SQL, но когда активируешь окно в программе поле остается пустым и если все заполнить не трогая это поле - ничего не пишется... Короче говоря у меня не работало значение Default Value sad Я даже писал что то типа ="Сотрудник" и ="Sotrudnik" но нет.. sad На работе пока что версия программы 1.38

Re: SQL - поиск

kodecs
Default Value появится в компоненте, только если этот компонент размещен на форме, которая предназначена для добавления/редактирования записи, т.е. эта форма должна быть вызвана с помощью кнопки с действием Новая запись.


к сообщению я приложил пример, как автоматически сделать фамилию с инициалами с помощью скрипта.

Post's attachments

Attachment icon TestFio.zip 1.78 kb, 595 downloads since 2014-05-28 

Dmitry.

Re: SQL - поиск

DriveSoft wrote:

kodecs
Default Value появится в компоненте, только если этот компонент размещен на форме, которая предназначена для добавления/редактирования записи, т.е. эта форма должна быть вызвана с помощью кнопки с действием Новая запись.


к сообщению я приложил пример, как автоматически сделать фамилию с инициалами с помощью скрипта.

Спасибо за скрипт, только он у меня не сработал sad Не знаю почему.. Пытался еще переделать его на событие On click (Button) но тоже эффекта не было sad

Re: SQL - поиск

kodecs
Перепроверил, все ок, может у вас старая версия программы?

Dmitry.

12 (edited by alex842 2014-05-30 09:21:53)

Re: SQL - поиск

Подскажите, пжл., никак не могу наладить поиск по дочерней таблице с помощью стандартной функции ПОИСК.

Бросил на форму несколько компонентов: текстовое поле для поиска по ФИО, парочку комбобоксов для поиска по другим параметрам. Везде поставил инкрементный поиск. Все работает отлично, пока не начинаю искать по теме. Т.е. выбираю значение в комбобоксе, связанном с таблицей темы... Тут и вылезает ошибка, что такого поля нет...
Никак не могу понять, где моя ошибка.

Post's attachments

Attachment icon Проект.rar 288.56 kb, 547 downloads since 2014-05-30 

Re: SQL - поиск

alex842
Моя недоработка, чтобы поиск заработал, пришлось вывести в результат поиска поле TranslTheme.id_Themes, заодно и поле Themes.ThemesID


если наличие TranslTheme.id_Themes в результатах поиска недопустимо, придется делать поиск через SQL запрос.


исправленный проект приатачен к сообщению.

Post's attachments

Attachment icon Проект2.rar 9.72 kb, 562 downloads since 2014-05-30 

Dmitry.

Re: SQL - поиск

DriveSoft wrote:

alex842
Моя недоработка, чтобы поиск заработал, пришлось вывести в результат поиска поле TranslTheme.id_Themes, заодно и поле Themes.ThemesID


если наличие TranslTheme.id_Themes в результатах поиска недопустимо, придется делать поиск через SQL запрос.


исправленный проект приатачен к сообщению.

Спасибо! Буду разбираться. Наличие этих столбцов не критично.

Re: SQL - поиск

Добрый день. Помогите исправить код. Хочу в таблицу передать все поля по вхождению фрагмента из поля Edit.

// Поиск по вхождению
SQLQuery('SELECT *  FROM Nomenklatura WHERE  (case when '+Admin_BB.Edit2.Text+'='''' then 1=1 else Nomenklatura.name LIKE "%'+Admin_BB.Edit2.Text+'%" end)',  Admin_BB.TableGrid5);

Re: SQL - поиск

abgroup-artur
Функция SQLQuery не позволяет вывести результат запроса в TableGrid. Данная функция предназначена для работы с данными из БД исключительно с помощью скрипта.


Используйте кнопку с действием "SQL запрос"

Dmitry.