Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.03.2013, 12:31
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию Проблемы с фильтрацией ADOtable

Пытаюсь отфильтровать по двум значениям в разный столбцах. Собственно вот код:
Код:
  ADOCardClient.Filtered:=false;
  ADOCardClient.Filter:=
      'Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND №_Накладной >= '+DBEditEh1.Text+
  ' OR Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND Сумма >= '+DBEditEh1.Text+
  ' OR Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND Должен >= '+DBEditEh1.Text+
  ' OR Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND Оплатил >= '+DBEditEh1.Text;
  ADOCardClient.Filtered:=true;
так сказать тут четыре связки. Код_клиента далее КК
КК и №_Накладной
или КК и Сумма
или КК и Должен
или КК и Оплатил
Дело в том что по отдельности эти связки работаю а вместе не хотят. Даже 2 подряд. Не могу сообразить в чем дело Вылетает ошибка - Аргументы имеют не верный тип или вступаю в конфликт с друг другом.
Проверка на число ли введено имеется. Может оператор OR? Или может есть способ проще реализовать это? Спасибо за внимание
Ответить с цитированием
  #2  
Старый 29.03.2013, 12:46
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Я вот не уверен, но связи у тебя такие:

Код:
а and b or a and c or ...
а логику реализовать надо, как я понял такую:
Код:
(a and b) or (a and c) or ... 
Я бы сделал вот как:
Код:
a and (b or c or d or ...)

И ещё мне не нравится что имена полей без обратных кавычек, т.е. так:
Код:
ADOCardClient.Filter:=
    '`Код_клиента` LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND `№_Накладной` >= '+DBEditEh1.Text+
Ответить с цитированием
Этот пользователь сказал Спасибо Uniq! за это полезное сообщение:
listerine (29.03.2013)
  #3  
Старый 29.03.2013, 12:50
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

и like нафиг тут
скобки поставь (а=б) or (a=c)
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")

Последний раз редактировалось Mrak, 29.03.2013 в 12:52.
Ответить с цитированием
Этот пользователь сказал Спасибо Mrak за это полезное сообщение:
listerine (29.03.2013)
  #4  
Старый 29.03.2013, 12:53
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Судя по логике, OR можно вынести за скобки (т.е. не использовать) и написать для начала:
(код LIKE a) AND nomer >= b AND summa >= c...
Ответить с цитированием
Этот пользователь сказал Спасибо AlexSku за это полезное сообщение:
listerine (29.03.2013)
  #5  
Старый 29.03.2013, 14:31
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Код:
ADOCardClient.Filtered:=false;
ADOCardClient.Filter:=
    '(Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND №_Накладной >= '+DBEditEh1.Text+
') OR (Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND Сумма >= '+DBEditEh1.Text+
') OR (Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+'  AND Должен >= '+DBEditEh1.Text+
') OR (Код_клиента LIKE '+inttostr(ADOClient.FieldValues['Код_клиента'])+' AND Оплатил >= '+DBEditEh1.Text + ')';
ADOCardClient.Filtered:=true;
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
Этот пользователь сказал Спасибо Mrak за это полезное сообщение:
listerine (29.03.2013)
  #6  
Старый 29.03.2013, 14:41
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Посмотрев ваши примеры и немного подраскинув мозгами написал вот такой код в событии onFilterRecord компонента ADOTable:
Код:
Accept:=
(DataSet['Сумма'] or DataSet['Оплатил'] or DataSet['Должен'] >= strtofloat(DBEditEh1.Text));
Работает как надо. Спасибо ребят за помощь очень помогли!
Есть еще вопрос!
Допустим я использую код для фильтрации:
Код:
Filter:='Имя_столбца LIKE '+#39+'%'+Edit.text+'%'+#39;
То есть выдираю из столбца набранное сочетание символов.
Как его(найденное сочетание символов) можно подсветить или может как то выделить? В инете чет ничего не нашел. Тыкните может в какую статью! я б почитал! Очень хочу реализовать! Спасибо еще раз за помощь!
Ответить с цитированием
  #7  
Старый 29.03.2013, 16:07
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Код:
procedure TForm14.DBGrid16DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
// Красим нечетные строки
	IF TDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 1
	Then TDBGrid(Sender).Canvas.Brush.Color:=RGB(220,220,220);
	// Восстанавливаем выделение текущей позиции курсора
	IF  gdSelected   IN State
	Then Begin
		TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
		TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
	End;
 	// Просим GRID перерисоваться самому
	TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
вот это делает полосатый grid (событие DrawColumnCell), в этом направлении копай)

з.ы. LIKE '%МОСКВА%' отфильтрует такие, например, значения: "1москва", "там москва", "здесь москва1" , "[пробел]москва2"
но не найдет: "москва"
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #8  
Старый 29.03.2013, 17:43
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Mrak
з.ы. LIKE '%МОСКВА%' отфильтрует такие, например, значения: "1москва", "там москва", "здесь москва1" , "[пробел]москва2"
но не найдет: "москва"
Так мне это и нужно. Мне не нужно точное совпадение, а скорей любое.
Как красить строки в DBgrid я знаю. Но ума не приложу как подсветить найденное слово там или набор букв. Хотя бы узнать как просто допустим несколько символов в ячейке подсветить. Дальше думаю разберемся.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025