• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Фильтрация данных

  • Автор темы Автор темы @rtem
  • Дата начала Дата начала
@

@rtem

Здравствуйте, у меня такая проблема. Когда провожу фильтрацию по полям таблицы то 2 поля никак не хотят фильтроваться (по всем остальным фильтрация работает) и возникает ошибка (одинаковая для обоих полей), это поле BNAME, BPUBLISH. они текстовые, а сама база сделанна в InterBase. Поле BAUTHOR тоже текстовое но по нему фильтрация проводится, и код точно такой же как и на тех полях. В чем проблема подскажите.

Код:
procedure TfrmSearchBooks.spbSearchClick(Sender: TObject);
begin

filtr := ' ';
// Поиск по названию товара
if (chbMName.Checked = true) then
//	filtr := 'BNAME = ''' + edtMName.Text + '''';
filtr := 'BNAME = ''' + ComboBox1.Text + '''';
// Поиск по производителю
if (chbMAuthor.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BAUTHOR = ''' + edtMAuthor.Text + '''';
if (chbMAuthor.Checked = true) and (filtr = ' ') then
filtr := 'BAUTHOR = ''' + edtMAuthor.Text + '''';
// Поиск по поставщику
if (chbMPost.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BPUBLISH = ''' + edtMPost.Text + '''';
if (chbMPost.Checked = true) and (filtr = ' ') then
filtr := 'BPUBLISH = ''' + edtMPost.Text + '''';
//Поиск по году выпуска
if (chbMYear.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BYEAR >= ''' + edtMYear1.Text + '''' + ' and BYEAR <= ''' + edtMYear2.Text + '''';
if (chbMYear.Checked = true) and (filtr = ' ') then
filtr := ' BYEAR >= ''' + edtMYear1.Text + '''' + ' and BYEAR <= ''' + edtMYear2.Text + '''';
//Поиск по стандарту упаковки
if (chbMStandart.Checked = true) and (filtr <> ' ' ) then
filtr := filtr + ' and ' + ' BSTAND >= ''' + edtMStandart1.Text + '''' + ' and BSTAND <= ''' + edtMStandart2.Text + '''';
if (chbMStandart.Checked = true) and (filtr = ' ' ) then
filtr := ' BSTAND >= ''' + edtMStandart1.Text + '''' + ' and BSTAND <= ''' + edtMStandart2.Text + '''';
//Поиск по остатку товара на складе
if (chbMQuan.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
if (chbMQuan.Checked = true) and (filtr = ' ') then
filtr := ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
//Поиск по цене закупки товара
if (chbMPrice.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BPRICE >= ''' + edtMPrice1.Text + '''' + ' and BPRICE <= ''' + edtMPrice2.Text + '''';
if (chbMPrice.Checked = true) and (filtr = ' ') then
filtr := ' BPRICE >= ''' + edtMPrice1.Text + '''' + ' and BPRICE <= ''' + edtMPrice2.Text + '''';
//Поиск по оптовой цене продажи товара
if (chbMOpt.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BOPT >= ''' + edtMOpt1.Text + '''' + ' and BOPT <= ''' + edtMOpt2.Text + '''';
if (chbMOpt.Checked = true) and (filtr = ' ') then
filtr := ' BOPT >= ''' + edtMOpt1.Text + '''' + ' and BOPT <= ''' + edtMOpt2.Text + '''';
//Поиск по розничной продажи товара
if (chbMRozn.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + ' BROZN >= ''' + edtMRozn1.Text + '''' + ' and BROZN <= ''' + edtMRozn2.Text + '''';
if (chbMRozn.Checked = true) and (filtr = ' ') then
filtr := ' BROZN >= ''' + edtMRozn1.Text + '''' + ' and BROZN <= ''' + edtMRozn2.Text + '''';

DM.Books.Filter := filtr;
DM.Books.Filtered := true;
frmSearchBooks.Close();

end;

Есть скрин ошибки.
 

Вложения

  • 1.JPG
    1.JPG
    105,5 КБ · Просмотры: 432
По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE), потому как филтер не умеет пользоваться индексами. То есть скорость выборки может быть убийстевенно долгая.

Но вернёмся к твоим баранам. :)
Какого размера поля? И есть ли зависимости на них?

Странно что ты не используешь else :blink:
например:

Код:
 if (chbMPost.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BPUBLISH = ''' + edtMPost.Text + '''';
else filtr := 'BPUBLISH = ''' + edtMPost.Text + '''';
 
поля 75 BNAME и 50 BPUBLISH типа CHAR, зависимостей нет.

поле BAUTHOR 50 тоже текстовое зависимостей нет, а вот фильтрация работает. :blink:

таблица эта типа справочника, где хранится список книг и данные по ним.
 
LAW
По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE),Для:

При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
 
При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
Я что-то не понял... При выполнении селекта то же происходит урезание? :)
 
Для: LAW
Я что-то не понял... При выполнении селекта то же происходит урезание? blink.gif

Именно при написании запроса типа:
Код:
select * from Books where (BName='......')

Вылетает аналогичная ошибка, это происходит только на этих двух полях. Хотя в таблице есть другие текстовые поля. :)
 
А в квери куда ты считываешь поля случаем нет предопределённого набора полей?
Что бы это посмотреть надо дважды кликнуть по Query.
Если есть удали все поля и попробуй выполнить селект заново.
 
Что бы это посмотреть надо дважды кликнуть по Query.
;) , я догадывался об этом :P

Нет там никаких полей, я даже новый квери закинул, и селект заново написал. НЕТ всеравно ошибка :(
 
А на какой точно строке происходит данная ошибка? на Query->Open?
 
Я не про то. На какои именно строчке кода из приведённыхтобой выше?
 
Для: LAW
при ошибке никакая строчка не выделяется красным как ошибка, если ты об этом.
 
Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?
 
BYEAR >= '''
BSTAND >= '''
BOPT >= '''

Привет! По моему ты не надо было использовать ''' - кавичек, и ты при это м отправляешь стрингивую полю, а тан в запросе (в фильтре) проверяешь как числовую.
По этому просто напиши место ''' - ' и все твои проблемы решутся ....

Пример:
место этого filtr := ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
надо вот так filtr := ' BQUAN >= ' + edtMQuan1.Text + ' and BQUAN <= ' + edtMQuan2.Text;
 
Для: MatlabX
спасибо я попробую, но дело в том, что с этими полями и так все работает, а вот поля BNAME, BPUBLISH в них проблема. Но я гляну ответ напишу.
 
[/quote]а вот поля BNAME, BPUBLISH в них проблема[/quote]

По тоей ошибки ты место integer а отправляешь string. Попробуй как я написал, и пожалуюстя
напиши ответ.
 
Для: LAW
Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?

Код:
 DM.AllQuery.Close();
DM.AllQuery.SQL.Text := memSQL_Editor.Lines.Text;
DM.AllQuery.Open(); <------- на этой строчке вылетает ошибка
Я не могу понять запрос составлен правильно, а ошибка вылетает. причем если делать полную выборку то все запрос работает, а если по условию и по этим полям то ошибка.

Для: MatlabX
пробывал возникает другая ошибка
Dinamyc SQL Error SQL Error code=-104, Token unknow -line2, char 17
 
Судя по скрину ошибки, при попытке преобразования кодировки строки происходит ошибка.
Тут надо уточнить, в какой кодировке хранятся поля BNAME и BPUBLISH в базе (я пользуюсь бесплатной оболочкой IBExpert для таких вещей) и какой порядок сортировки установлен для этих полей.

Второй вариант - это отсутствие языковых библиотек INTL - сервер не может получить информацию по правилам сортировки в разных кодовых страницах....
 
Для: Andromeda Хм кодировка одна WIN 1251 :blink:
 
Код:
memSQL_Editor.Lines.Text

если сможешь отошли текст
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab