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

Тема в разделе "Delphi - Базы данных", создана пользователем @rtem, 24 апр 2007.

  1. @rtem

    @rtem Гость

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

    Код (Text):
    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
      Размер файла:
      119,6 КБ
      Просмотров:
      119
  2. LAW

    LAW Гость

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

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

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

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

    @rtem Гость

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

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

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

    @rtem Гость

    LAW
    При построении запроса на выборку с условием возникает таже ошибка, как выяснилось на эти поля есть индексы.
     
  5. LAW

    LAW Гость

    Я что-то не понял... При выполнении селекта то же происходит урезание? :)
     
  6. @rtem

    @rtem Гость

    Для: LAW
    Именно при написании запроса типа:
    Код (Text):
    select * from Books where (BName='......')
    Вылетает аналогичная ошибка, это происходит только на этих двух полях. Хотя в таблице есть другие текстовые поля. :)
     
  7. LAW

    LAW Гость

    А в квери куда ты считываешь поля случаем нет предопределённого набора полей?
    Что бы это посмотреть надо дважды кликнуть по Query.
    Если есть удали все поля и попробуй выполнить селект заново.
     
  8. @rtem

    @rtem Гость

    ;) , я догадывался об этом :p

    Нет там никаких полей, я даже новый квери закинул, и селект заново написал. НЕТ всеравно ошибка :(
     
  9. LAW

    LAW Гость

    А на какой точно строке происходит данная ошибка? на Query->Open?
     
  10. @rtem

    @rtem Гость

    Для: LAW

    неа, ошибка точно такая же как и при фильтрации.
     
  11. LAW

    LAW Гость

    Я не про то. На какои именно строчке кода из приведённыхтобой выше?
     
  12. @rtem

    @rtem Гость

    Для: LAW
    при ошибке никакая строчка не выделяется красным как ошибка, если ты об этом.
     
  13. LAW

    LAW Гость

    Измним вопрос. Когда ты трассируешь по F8, то на каккой строке вылетает ошибка, показанная тобой на приложенном скриншоте?
     
  14. MatlabX

    MatlabX Гость

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

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

    @rtem Гость

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

    MatlabX Гость

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

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

    @rtem Гость

    Для: LAW
    Код (Text):
     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
     
  18. Andromeda

    Andromeda Гость

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

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

    @rtem Гость

    Для: Andromeda Хм кодировка одна WIN 1251 :blink:
     
  20. MatlabX

    MatlabX Гость

    Код (Text):
    memSQL_Editor.Lines.Text
    если сможешь отошли текст
     
Загрузка...
Похожие Темы - Фильтрация данных
  1. vladis222
    Ответов:
    1
    Просмотров:
    2.124
  2. bobo
    Ответов:
    7
    Просмотров:
    3.747
  3. makaset
    Ответов:
    2
    Просмотров:
    2.547
  4. tatka95
    Ответов:
    0
    Просмотров:
    1.281
  5. akisawa
    Ответов:
    0
    Просмотров:
    1.335

Поделиться этой страницей