1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. @rtem

    @rtem Гость

    Репутация:
    0
    Здравствуйте, у меня такая проблема. Когда провожу фильтрацию по полям таблицы то 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
      Размер файла:
      119,6 КБ
      Просмотров:
      119
  2. LAW

    LAW Гость

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

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

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

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

    @rtem Гость

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

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

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

    @rtem Гость

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

    LAW Гость

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

    @rtem Гость

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

    LAW Гость

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

    @rtem Гость

    Репутация:
    0
    ;) , я догадывался об этом :P

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

    LAW Гость

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

    @rtem Гость

    Репутация:
    0
    Для: LAW

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

    LAW Гость

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

    @rtem Гость

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

    LAW Гость

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

    MatlabX Гость

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

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

    @rtem Гость

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

    MatlabX Гость

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

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

    @rtem Гость

    Репутация:
    0
    Для: LAW
    Код:
     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 Гость

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

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

    @rtem Гость

    Репутация:
    0
    Для: Andromeda Хм кодировка одна WIN 1251 :blink:
     
  20. MatlabX

    MatlabX Гость

    Репутация:
    0
    Код:
    memSQL_Editor.Lines.Text
    если сможешь отошли текст
     
Загрузка...
Похожие Темы - Фильтрация данных
  1. vladis222
    Ответов:
    1
    Просмотров:
    2.266
  2. bobo
    Ответов:
    7
    Просмотров:
    3.935
  3. makaset
    Ответов:
    2
    Просмотров:
    2.605
  4. cutoff
    Ответов:
    2
    Просмотров:
    478
  5. tatka95
    Ответов:
    0
    Просмотров:
    1.373

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