Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложная фильтрация, база данных 
:(
    Опции темы
Bes
Дата 26.1.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



"или у тебя Upper"
PM MAIL   Вверх
Akella
Дата 26.1.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Alex
Цитата(Alex @ 25.1.2005, 09:25)
И настоятельно советую попробывать выполнить вот такой запрос:

Код

SELECT * FROM MYTABLE
WHERE UPPER(MYFIELD COLLATE PXW_CYRL) = 'ВАСЯ'


вот, что получилось



Цитата

Dynamic SQL Error
SQL error code = -204
Data type unknown
COLLATION PXW_CYRL is not valid for specified CHARACTER SET
Statement: select remark from apartments where
UPPER(remark collate pxw_cyrl) like '%Я%'


обрати внимание "COLLATION PXW_CYRL is not valid for specified CHARACTER SET"
Добавлено @ 17:02
пробовал так
Код

select remark from apartments where
UPPER(remark) like '%СВОЯ%'


вроде нормально

Это сообщение отредактировал(а) dsergey - 26.1.2005, 16:59
PM MAIL   Вверх
Лиходей
Дата 5.6.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Здесь можно почитать как использовать событие OnFilterRecord, можно скачать простенький пример  http://delphibd.sk6.ru/
PM MAIL   Вверх
Magnetto
Дата 28.2.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Akella, с простой фильтрацией по одному столбику разобрался , код прекрасно работает
Код

s:=AnsiUpperCase(Dataset.FieldByName('NameID').AsString);
accept := POS(AnsiUpperCase(Form4.Edit1.Text), s) <> 0;


а как сделать с помощью события фильтр рекорд выборку по нескольким столбцам?
пробовал так
Код


procedure TDataModule1.Table1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
  var
  s:string;
begin
if (form4.CheckBox1.Checked = true) then
 Begin
  s:=AnsiUpperCase(Dataset.FieldByName('NameID').AsString);
  accept := POS(AnsiUpperCase(Form4.Edit1.Text), s) <> 0;
 End;
if (Form4.CheckBox3.Checked = true) then
 Begin
  s:=AnsiUpperCase(Dataset.FieldByName('GenreID').AsString);
  case (Form4.Radiogroup1.ItemIndex) of
   0 : accept := POS(AnsiUpperCase('Мужской'), s) <> 0;
   1 : accept := POS(AnsiUpperCase('Женский'), s) <> 0;
  end; 
 End;
end;


в этом варианте вообще неправильный фильтр происходит : эти две выбрки работают как бы независимо друг от друга =\

Это сообщение отредактировал(а) Magnetto - 28.2.2009, 12:54
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Magnetto @  28.2.2009,  12:48 Найти цитируемый пост)
события фильтр рекорд

это как?

Добавлено через 1 минуту и 28 секунд
Цитата(Magnetto @  28.2.2009,  12:48 Найти цитируемый пост)
по нескольким столбцам?

Чекбоксы не используй, нафиг они? Что, нельзя проверить Edit`ы пустые/непустые и фильтровать только по непустым?

Добавлено через 4 минуты и 33 секунды
вот по нескольким полям
Код

acept := ((edit1.text <> '') and (dataset.fieldbyname('pole1').asstring := edit1.text)) and
               ((edit2.text <> '') and (dataset.fieldbyname('pole2').asstring := edit2.text)) and
               ((edit3.text <> '') and (dataset.fieldbyname('pole3').asstring := edit3.text)) and


можно поставить только один чекбокс, где пользователь будет выбирать тип фильтрации: по условию И или по условию ИЛИ.
PM MAIL   Вверх
Magnetto
Дата 28.2.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Цитата(Akella @  28.2.2009,  13:05 Найти цитируемый пост)
это как?

OnFilterRecord , неясно выразился

Цитата(Akella @  28.2.2009,  13:05 Найти цитируемый пост)
Что, нельзя проверить Edit`ы пустые/непустые и фильтровать только по непустым? 

окей , допустим есть 4 edit'a, каждый относится в отдельному стоблику  , каким образом их слепить в один фильтр?

и еще один вопрос , в учебнике прочитал об фильтре по диапазону значений
Код

Datamodule1.Table1.SetRangeStart;
Datamodule1.Table1.FieldByName('AgeID').AsInteger := 5;
Datamodule1.Table1.SetRangeEnd;
datamodule1.Table1.FieldByName('AgeID').AsInteger := 20;
Datamodule1.Table1.ApplyRange;
Datamodule1.Table1.Filtered := true;

100% известно , что столбик AgeID типа Number и так же 100% известно , что в нем присутствуют записи в диапазоне 5-20 , но таблица становится пустой после приминения фильтра, данные в этот столбик добавлялись кодом
Код

Datamodule1.Table1.fields[1].AsInteger := strtoint(Edit2.Text);

может быть я неправильно добавил их , соответственно фильтр думает , что это не те значения\не того типа?

Это сообщение отредактировал(а) Magnetto - 28.2.2009, 13:20
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Я тебе советую, и многие тоже посоветуют бросить эту затею и заняться изучением SQL, я сейчас жалею, что с самого начала изучения баз данных НЕ начал с изучения SQL. Ttable - это вчерашний день.

Скачай и установи Firebird. Купи книгу Хеллен Борри и будет тебе счастье.
PM MAIL   Вверх
Akella
Дата 28.2.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код

Datamodule1.Table1.SetRangeStart;

//так
Datamodule1.Table1.KeyExlusive := true


Datamodule1.Table1.FieldByName('AgeID').AsInteger := 5;


SetRangeStart - устанавливает нижнюю границу диапазона
PM MAIL   Вверх
Magnetto
Дата 28.2.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



skip

Это сообщение отредактировал(а) Magnetto - 28.2.2009, 13:40
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а перед SetRangeStart разве не нужно IndexName указывать?

Добавлено через 44 секунды
Цитата(Magnetto @  28.2.2009,  13:10 Найти цитируемый пост)
Datamodule1.Table1.SetRangeStart;
Datamodule1.Table1.FieldByName('AgeID').AsInteger := 5;
Datamodule1.Table1.SetRangeEnd;
datamodule1.Table1.FieldByName('AgeID').AsInteger := 20;
Datamodule1.Table1.ApplyRange;
Datamodule1.Table1.Filtered := true;

а зачем тут последняя строка?
Datamodule1.Table1.Filtered := true;
закоментируй её

Добавлено через 3 минуты и 6 секунд
Ты или используй диапазоны, или фильтр, или OnFilterRecord
PM MAIL   Вверх
Magnetto
Дата 28.2.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Цитата(Akella @  28.2.2009,  13:40 Найти цитируемый пост)
а перед SetRangeStart разве не нужно IndexName указывать?

в этом и была вся моя ошибка , работает smile 
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Попробуй ещё
Код

Datamodule1.Table1.SetRange(['AgeID', 5], ['AgeID', 20])


Добавлено через 1 минуту и 38 секунд
Цитата(Magnetto @ 28.2.2009,  13:46)
Цитата(Akella @  28.2.2009,  13:40 Найти цитируемый пост)
а перед SetRangeStart разве не нужно IndexName указывать?

в этом и была вся моя ошибка , работает smile

А если указываешь диапазон по нескольким полям, то нужно создавать составной индекс. Кстати индекс можно на лету создавать. На форуме есть примеры.
PM MAIL   Вверх
Magnetto
Дата 28.2.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 1.2.2007
Где: Ukraine

Репутация: нет
Всего: нет



Цитата(Akella @  28.2.2009,  13:46 Найти цитируемый пост)
Кстати индекс можно на лету создавать. На форуме есть примеры. 

насчет динамического создания индексов проблем не возникло...а как понимать составной индекс? т.е динамическое создание понятно
Код

Form1.table1.IndexDefs.Add('НазваниеИндекса','Поле1;поле2',[ixCaseInsensitive]); 

а как работает составной индекс?...
отсортируется таблица по одной колонке , а по второй как она будет сортироваться?...абсурд  или я не понимаю





упд

при попытке использовать следующий код
Код

procedure TDataModule1.Table1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
  var
  s:string;
begin
accept := ((form4.edit1.text <> '') and (dataset.fieldbyname('NameID').asstring := form4.edit1.text)) and
               ((form4.edit2.text <> '') and (dataset.fieldbyname('AgeID').asstring := form4.edit2.text));
end;

получил следующую ошибку
Код

[Error] Unit1.pas(44): Operator not applicable to this operand type
[Error] Unit1.pas(45): Operator not applicable to this operand type
[Fatal Error] Unit1.pas(6): Could not compile used unit 'Unit1'


Это сообщение отредактировал(а) Magnetto - 28.2.2009, 14:12
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Никакого абсурда. Да сначала будут записи отсортированы по первому полю, а затем внутри этой сортировки по второму полю.


Это сообщение отредактировал(а) Akella - 7.1.2010, 14:54
PM MAIL   Вверх
ЧиоЧигас
Дата 6.1.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.10.2009

Репутация: нет
Всего: нет



Хорошая статья по теме - Фильтрация данных в Delphi
PM MAIL WWW ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1267 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.