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

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

@rtem

#1
Здравствуйте, у меня такая проблема. Когда провожу фильтрацию по полям таблицы то 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;
Есть скрин ошибки.
 

Вложения

  • 119.6 КБ Просмотры: 119
L
#2
По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE), потому как филтер не умеет пользоваться индексами. То есть скорость выборки может быть убийстевенно долгая.

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

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

Код:
 if (chbMPost.Checked = true) and (filtr <> ' ') then
filtr := filtr + ' and ' + 'BPUBLISH = ''' + edtMPost.Text + '''';
else filtr := 'BPUBLISH = ''' + edtMPost.Text + '''';
 
@

@rtem

#3
поля 75 BNAME и 50 BPUBLISH типа CHAR, зависимостей нет.

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

таблица эта типа справочника, где хранится список книг и данные по ним.
 
@

@rtem

#4
LAW
По моему в этом случае было бы более правильно использовать SQL (SELECT FROM WHERE),Для:
При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
 
L
#5
При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
Я что-то не понял... При выполнении селекта то же происходит урезание? :)
 
@

@rtem

#6
Для: LAW
Я что-то не понял... При выполнении селекта то же происходит урезание? blink.gif
Именно при написании запроса типа:
Код:
select * from Books where (BName='......')
Вылетает аналогичная ошибка, это происходит только на этих двух полях. Хотя в таблице есть другие текстовые поля. :)
 
L
#7
А в квери куда ты считываешь поля случаем нет предопределённого набора полей?
Что бы это посмотреть надо дважды кликнуть по Query.
Если есть удали все поля и попробуй выполнить селект заново.
 
@

@rtem

#8
Что бы это посмотреть надо дважды кликнуть по Query.
;) , я догадывался об этом :p

Нет там никаких полей, я даже новый квери закинул, и селект заново написал. НЕТ всеравно ошибка :(
 
L
#9
А на какой точно строке происходит данная ошибка? на Query->Open?
 
L
#11
Я не про то. На какои именно строчке кода из приведённыхтобой выше?
 
@

@rtem

#12
Для: LAW
при ошибке никакая строчка не выделяется красным как ошибка, если ты об этом.
 
L
#13
Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?
 
M

MatlabX

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

Пример:
место этого filtr := ' BQUAN >= ''' + edtMQuan1.Text + '''' + ' and BQUAN <= ''' + edtMQuan2.Text + '''';
надо вот так filtr := ' BQUAN >= ' + edtMQuan1.Text + ' and BQUAN <= ' + edtMQuan2.Text;
 
@

@rtem

#15
Для: MatlabX
спасибо я попробую, но дело в том, что с этими полями и так все работает, а вот поля BNAME, BPUBLISH в них проблема. Но я гляну ответ напишу.
 
M

MatlabX

#16
[/quote]а вот поля BNAME, BPUBLISH в них проблема[/quote]

По тоей ошибки ты место integer а отправляешь string. Попробуй как я написал, и пожалуюстя
напиши ответ.
 
@

@rtem

#17
Для: 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
 
A

Andromeda

#18
Судя по скрину ошибки, при попытке преобразования кодировки строки происходит ошибка.
Тут надо уточнить, в какой кодировке хранятся поля BNAME и BPUBLISH в базе (я пользуюсь бесплатной оболочкой IBExpert для таких вещей) и какой порядок сортировки установлен для этих полей.

Второй вариант - это отсутствие языковых библиотек INTL - сервер не может получить информацию по правилам сортировки в разных кодовых страницах....