Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема при фильтрации данных
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
ninja
Добрый вечер! Столкнулся с такой проблмой: при фильтрации данных в таблице БД, если тип поля не строковый, т.е. числовой, дата и т.д., появляется ошибка:

could not convert variant of type OleStr into type Boolean

void filtration(TTable *Table,TEdit *Edit,AnsiString Str)
{
Table->FilterOptions << foCaseInsensitive;
if (Edit->Text == "")
{
Table->Filtered = false;
}
else
{
Table->Filtered = true;
}

Table->Filter = Str+"='"+Edit->Text+"*'";
}


Пробовал задавать фильтр таким образом:

Table->Filter = Str+"='"+Edit->Text.ToInt()+"'";


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

Вызов функции:

 filtration(mk_oborud,Edit3,"Year_vipusk");

Заранее Спасибо за помощь.
volvo
А ведь я уже говорил про это smile.gif

Вот тут: Ошибка при изменении условий поиска

Смотри, что происходит:
1) ты получил содержимое Edit-а для фильтрации по этому значению.
2) если содержимое пустое - отключил фильтрацию, если нет - то включил.
3) изменил фильтр

Это некорректный алгоритм. Фильтр не должен меняться при включенной фильтрации. Алгоритм должен быть такой:
1) отключить фильтрацию безоговорочно, как только вошел в функцию.
2) если поле не пустое - то сформировать строку фильтра и включить фильтрацию.
ninja
исправил таким образом:

void filtration(TTable *Table,TEdit *Edit,AnsiString Str)
{
Table->FilterOptions << foCaseInsensitive;
if (Edit->Text.Length() > 0)
{
Table->Filtered = false;
Table->Filter = Str+"='"+Edit->Text.ToInt()+"'";
Table->Filtered = true;
}
else
{
Table->Filtered = false;
}
}


сейчас ошибки нету, но при вводе цифр в поле Edit ничего не появляется, как-будто записи в таблице нету и если поставить "звездочку - *" в фильтре

Table->Filter = Str+"='"+Edit->Text.ToInt()+"*'";


то появляется ошибка которую я написал выше...
Client
попробуй убрать ToInt, используй просто текст едита
ninja
Если тип данных в таблице строковый работает нормально, а
Цитата

если тип поля не строковый, т.е. числовой, дата и т.д., появляется ошибка
volvo
Если тип данных в таблице - НЕ строковый, то о какой звездочке ты говоришь вообще? LIKE работает только со строками...
ninja
Прошу прощения не знал, а как быть с другими типами?

Например нужно вывести числовые значения, при таком описании
Table->Filter = Str+"='"+Edit->Text.ToInt()+"'";

информация из таблиц не появляется, как быть в такой ситуации?
volvo
Сделал вот так:
if (Edit->Text.Length() > 0)
{
Table->Filtered = false;
Table->Filter = Str + "=" + QuotedStr(Edit->Text);
Table->Filtered = true;
}
, вызываю - так:
filtration(DBGrid1->DataSource->DataSet, Edit2, "[num]");
, получаю:
Нажмите для просмотра прикрепленного файла

Что-то не так?
ninja
Работает smile.gif даже преобразовывать не нужно, если я правильно понял, функция QuotedStr() добавляет ковычки (') к Edit'y. Большое Вам спасибо, еще небольшой вопрос, можно ли как-нибудь проверить то, что вводится в поле Edit? Я имею ввиду, что при преобразовании в число функцией StrToInt() если вводится символы, то появляется ошибка, в Delphi, я делал следующим образом: объявлял массив содержащий цифры и проверял при вводе каждый введенный символ:

if not Key in Mas then Key := #0


В C++ борюсь с проблемой с помощью конструкции:

try
{
k = StrToInt(Edit1->Text);
}
catch(...)
{
}


Существует ли какой-нибудь другой способ?
volvo
Цитата
Я имею ввиду, что при преобразовании в число функцией StrToInt() если вводится символы, то появляется ошибка
Кроме StrToInt есть еще TryStrToInt, которая вернет false, если преобразование невозможно:

	int value;
if(TryStrToInt(Edit2->Text, value))
{
// Все в порядке, можно использовать value
}

ninja
мм... Удобная функция, Спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.