Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 20:45   #1
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию Выделить цветом в DBGrid таблицы1 строки, совпадающие со строками таблицы2

Форма:
TDataSource2, TADOQuery2, DBGrid2 - отображение таблицы HourData_2
TDataSource3, TADOQuery3, DBGrid3 - отображение таблицы HourData_3
Структура таблиц аналогичная: поля Data, TimeMs, TStreet, Tinside, DataEdit

Необходимо в случае совпадения 2-х и более полей (Data,TimeMs) при сравнении таблиц HourData_2 и HourData_3 выделить эти строки в HourData_2.
Ознакомился со многими статьями на форуме, но везде идут отсылки на одно и тоже. Нет ситуации с двумя таблицами.

Код:
procedure TImportForm.DBGrid2DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
  //это работа с одной таблицей и только по одному полю
  if StrToFloat(DBGrid2.Fields[3].Value)<23.0 then begin
	  with  DBGrid2.Canvas do
	  begin
	   	Brush.Color:=clYellow;
	   	Font.Color:=clWhite;
   		FillRect(Rect);
	   	TextOut(Rect.Left+2,Rect.Top+2,Field.Text);
	  end;
	end;
end;
Вопрос, как реализовать в случае сравнения записей 2-х таблиц

Последний раз редактировалось Stilet; 18.12.2014 в 10:54.
terexa вне форума Ответить с цитированием
Старый 18.12.2014, 10:07   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

для начала ответить на вопрос
С чем сравнивать одну конкретную запись первой таблицы (ту что мы рисуем)
- надо сравнить c одной определенной записью другой (и как мы ее можем определить);
- надо проверить наличие в другой таблице записи с идентичными значениями указанных полей.

после этого
1. перейти от Table к Query
2. использовать SQL
3. получить ОДНУ таблицу (Grid) с нужными данными из разных таблиц БД.
Тем самым придя к распространенному варианту раскраски таблицы исключительно по своим данным.
Цитата:
Ознакомился со многими статьями на форуме, но везде идут отсылки на одно и тоже. Нет ситуации с двумя таблицами.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.12.2014 в 10:20.
evg_m вне форума Ответить с цитированием
Старый 18.12.2014, 10:18   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И такое сравнение лучше не в DrawDataCell делать. Можно сделать вычисляемое SQL-поле и в запросе поместить в него результат сравнения, похуже, но тоже можно сделать вычисляемое поле в датасете и в OnCalcField провести сравнение. А в DrawDataCell просто на основании значения этого поля раскрашивать. Естественно это поле в гриде не отображать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.12.2014, 13:24   #4
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию О ходе решения

To evg_m.
Про сравнение я написал в начале вопроса, перефразирую: наличие в другой таблице записей с одинаковыми значениями указанных полей, например Data и TimeMs.
Table не использую. Если SQL, то перестанут отображаться записи с отличающимися строками, либо изменится порядок отображения...

To Avatar: спасибо, попробую...
terexa вне форума Ответить с цитированием
Старый 19.12.2014, 09:05   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Если SQL,
Цитата:
то перестанут отображаться записи с отличающимися строками,
Код:
from t1 
left join t2 on t2.xx =t1.xx
вместо
Код:
from t1, t2
where t1.xx =t2.xx
Цитата:
либо изменится порядок отображения...
Код:
order by ....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.12.2014, 20:58   #6
terexa
Пользователь
 
Регистрация: 05.12.2014
Сообщений: 11
По умолчанию небольшое пояснение

Суть задачи.
Данные импортируются из файла, другой БД, которые на форме предварительно выгружаются в таблицу 1.

Перед загрузкой в БД пользователь должен увидеть какие строки у него будут заменены,для чего и нужно выделение в таблице 1 строк, совпадающих по параметрам Data и TimeMs со строками в таблице 2.
Даже лучше, если будет выделение строк, а не закраска.

Аватар: загрузка может быть нескольких сотен строк...можно ли уйти от создания доп.столбца?

evg_m: не пойму Ваш совет,к сожалению. Мне не нужно получать новую выборку. Мне необходимо в действующем наборе данных выделить строки по условию.

Надеюсь на Ваше содействие
terexa вне форума Ответить с цитированием
Старый 20.12.2014, 21:22   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
загрузка может быть нескольких сотен строк...можно ли уйти от создания доп.столбца?
Тоже мне проблема. Сказал бы пару миллионов, но тогда и я чего-то плохого сказал бы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задать язык и выделить цветом caute Microsoft Office Word 19 30.05.2013 22:37
Выделить цветом СерегаЯ PHP 3 29.04.2013 16:34
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
выделить цветом в мемо iliili Общие вопросы Delphi 3 01.10.2010 16:57
выделить все строки цветом по заданому условию mars56 Microsoft Office Excel 2 15.02.2010 07:55