IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Проблема при фильтрации данных, C++ Builder
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Добрый вечер! Столкнулся с такой проблмой: при фильтрации данных в таблице БД, если тип поля не строковый, т.е. числовой, дата и т.д., появляется ошибка:

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");

Заранее Спасибо за помощь.

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






А ведь я уже говорил про это smile.gif

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

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

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


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


исправил таким образом:

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()+"*'";


то появляется ошибка которую я написал выше...

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


попробуй убрать ToInt, используй просто текст едита
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Если тип данных в таблице строковый работает нормально, а
Цитата

если тип поля не строковый, т.е. числовой, дата и т.д., появляется ошибка
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Если тип данных в таблице - НЕ строковый, то о какой звездочке ты говоришь вообще? LIKE работает только со строками...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Прошу прощения не знал, а как быть с другими типами?

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

информация из таблиц не появляется, как быть в такой ситуации?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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

Что-то не так?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


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

if not Key in Mas then Key := #0


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

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


Существует ли какой-нибудь другой способ?

Сообщение отредактировано: ninja -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


мм... Удобная функция, Спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.10.2020 17:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name