Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
1

Как сравнить две таблицы dbe на предмет одинаковых записей по определенным полям

21.08.2014, 19:59. Показов 2952. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как сравнить две таблицы dbe на предмет одинаковых записей по определенным полям.

Конкретней: на форме два грида, каждый грид имеет свой dataset и в них разные базы подключены, но в каждой из баз есть одинаковые колонки с одинаковыми названиями. Как сделать полную проверку всех записей из первой базы на совпадения во второй и если таковые имеются совпадения то во второй таблице совпадающие значения окрашивались (строка окрашивалась в какой либо цвет). Я использую Девэкспрессовский обычный грид.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2014, 19:59
Ответы с готовыми решениями:

Как проверить есть ли в таблице две одинаковых строки с определенным условием
Условие: равенство одного из полей некоторому значению...

Как связать две таблицы по нескольким полям?
Нужно, что бы работала связь Master-Detail. Но связать таблицы можно только сразу по двум полям,...

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

Как сравнить две таблицы ?
Используется C# MySql Имеется Таблица 1 - редактируемая ...

12
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
22.08.2014, 01:03 2
делал на Lazarus + sqlite. структура таблиц: |id|name| + во вторую таблицу добавил поле для учета совпадающих с данными из первой таблицы (unik)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.Button1Click(Sender: TObject);
begin
  with DataModule1.ZQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('UPDATE t2 SET unik = null');
    ExecSQL;
    Close;
    SQL.Clear;
    SQL.Add(
      'UPDATE t2 SET unik = 1 WHERE name IN (SELECT DISTINCT t1.name FROM t1 INNER JOIN t2 ON (t1.name = t2.name))');
    ExecSQL;
    Close;
  end;
  DataModule1.ZTable2.Refresh;
end;
 
procedure TForm1.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: integer; Column: TColumn; State: TGridDrawState);
begin
  if DataModule1.ZTable2.FieldByName('unik').Value = 1 then
    begin
      TDBGrid(Sender).Canvas.Font.Color := clWhite;
      TDBGrid(Sender).Canvas.Brush.Color := clRed;
      TDBGrid(Sender).Canvas.FillRect(Rect);
    end;
  if gdSelected in State then
  begin
    TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
    TDBGrid(Sender).Canvas.Brush.Color := clHighlight;
    TDBGrid(Sender).Canvas.FillRect(Rect);
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
03.09.2014, 13:22  [ТС] 3
это то что нужно, только можете выложить исходник, для наглядности разобраться что к чему !
0
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
03.09.2014, 21:15 4
собран в lazarus 1.2.0/FPC 2.6.2 + ZEOSDBO-7.1.3a-stable. файл бд создан с помощью sqlitestudio-2.1.5
Вложения
Тип файла: zip sravnenie_bd.zip (459.6 Кб, 28 просмотров)
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
03.09.2014, 22:02  [ТС] 5
Я тут немного разобрался со своей проблемой, но не совсем.

Нашел решение как сравнивать выделенную строку из "Таблицы1" в "Таблица2", т.е. в первой таблице стою на строке, нажимаю на кнопку и методом перебора идет поиск одинакового значения, если значение находится одинковое, то в "Таблица2" ставится значение 1

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.ToolButton19Click(Sender: TObject);
begin
  if Table2.Locate('Naimenovanie;Countru;Series;Year',
     VarArrayOf([Table1.FieldByName('Naimenovanie').Value, Table1.FieldByName('Countru').Value,
     Table1.FieldByName('Series').Value,Table1.FieldByName('Year').Value]),[loCaseInsensitive, loPartialKey]) then
     begin
     Table2.Edit;
     Table2.FieldByName('Same').Value:=1;
     Table2.Post;
     end
    else
      ShowMessage('Данной записи нет')
end;
а окрашиваю строку с одинаковым значением так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.cxGridDBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  ARec: TRect;
  val: string;
begin
  ARec := AViewInfo.Bounds;
  val := VarAsType(AViewInfo.GridRecord.DisplayTexts[cxGridDBTableView1Same.index], varString);
  if val = '1' then
    begin
     ACanvas.Canvas.Brush.Color := $B9B9FF;
     ACanvas.Canvas.FillRect(ARec);
    end;
end;
Это все хорошо, но не вариант становится на каждую строку и тыкать на кнопку чтоб сравнить, нужно чтоб нажать на кнопку и этот процесс автоматизироватлся
0
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
03.09.2014, 22:45 6
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
 with DataModule1.ZQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('UPDATE t2 SET unik = null');
    ExecSQL;
    Close;
    SQL.Clear;
    SQL.Add(
      'UPDATE t2 SET unik = 1 WHERE name IN (SELECT DISTINCT t1.name FROM t1 INNER JOIN t2 ON (t1.name = t2.name))');
    ExecSQL;
    Close;
  end;
вот этот код сначала сбросит признак совпадения у всех записей второй таблицы (вдруг из первой удалили несколько записей для которых во второй таблице установлен признак совпадения) , а затем обновит все записи второй таблицы, совпадающие по полю name с записями в первой таблице.
но если надо с помощью locate и
чтоб нажать на кнопку и этот процесс автоматизироватлся
, то
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
table1.first;
while not table1.eof do
  begin
    if Table2.Locate('Naimenovanie;Countru;Series;Year',
     VarArrayOf([Table1.FieldByName('Naimenovanie').Value, Table1.FieldByName('Countru').Value,
     Table1.FieldByName('Series').Value,Table1.FieldByName('Year').Value]),[loCaseInsensitive, loPartialKey]) then
    begin
      Table2.Edit;
      Table2.FieldByName('Same').Value:=1;
      Table2.Post;
    end;
    table1.next;
  end;
1
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
03.09.2014, 22:58  [ТС] 7
сейчас попробую

Добавлено через 6 минут
Все отлично работает, так как нужно ! Спасибо !

И так вопрос на засыпку, а как этот процесс привязать к прогресс бару ?
0
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
03.09.2014, 23:17 8
например так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 table1.first;
progressbar1.min:= 0;
progressbar1.Max:= table1.rowcount; 
progressbar1.position:= 0;
while not table1.eof do
  begin
    progressbar1.position:= progressbar1.position + 1;
    if Table2.Locate('Naimenovanie;Countru;Series;Year',
     VarArrayOf([Table1.FieldByName('Naimenovanie').Value, Table1.FieldByName('Countru').Value,
     Table1.FieldByName('Series').Value,Table1.FieldByName('Year').Value]),[loCaseInsensitive, loPartialKey]) then
    begin
      Table2.Edit;
      Table2.FieldByName('Same').Value:=1;
      Table2.Post;
    end;
    table1.next;
  end;
1
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
04.09.2014, 11:42  [ТС] 9
Все работает ! Ещё раз благодарю !

Добавлено через 9 часов 44 минуты
Задался вопросом, а как так же замутить что если запису удалена, чтоб при проверке на одинаковые во второй таблице тоже указывалось что совпадение отсутствует, вот так не прокатывает программа зависает

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.ToolButton20Click(Sender: TObject);
begin
Table1.first;
cxProgressBar1.Position:= 0;
cxProgressBar1.Properties.Min:=0;
cxProgressBar1.Properties.Max:=Table1.FieldCount;
while not Table1.eof do
  begin
    cxProgressBar1.position:=Table1.RecordCount + 1;
    if Table2.Locate('Naimenovanie;Countru;Series;Year',
     VarArrayOf([Table1.FieldByName('Naimenovanie').Value, Table1.FieldByName('Countru').Value,
     Table1.FieldByName('Series').Value,Table1.FieldByName('Year').Value]),[loCaseInsensitive, loPartialKey]) then
    begin
      Table2.Edit;
      Table2.FieldByName('Same').Value:=1;
      Table2.Post;
    end
    else
      Table2.Edit;
      Table2.FieldByName('Same').Value:=0;
      Table2.Post;
    end;
    table1.next;
end;
нужно как то чтоль очищать данные во второй таблице в поле "Same" ? или как это провернуть правильно ?

Да и кстати с прогресс баром, не идет счет во время сравнение, просто когда сравнение прошлось по всем записям, в прогресс баре сразу становится 100%, а не так что запись прошла появился процент..

Добавлено через 2 часа 31 минуту
с прогресс баром разобрался нужно было добавить в код
Delphi
1
Application.ProcessMessages;
0
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
04.09.2014, 23:14 10
как это провернуть правильно ?
перебирать записи не первой, а второй таблицы. тогда код строк 13..22 должен работать.
я пишу с планшета, синтаксиса дословно не помню, но почему в 6 строке используется количество столбцов, а не строк (если строк 10к, а столбцов 3, то прогрессбар будет от 0 до 3)?
в 9 строке для определения позиции прогрессбара используется количество строк датасета + 1??? к текущей позиции ПБ надо прибавлять эту единицу
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
05.09.2014, 08:01  [ТС] 11
Цитата Сообщение от andrey_k3 Посмотреть сообщение
но почему в 6 строке используется количество столбцов, а не строк (если строк 10к, а столбцов 3, то прогрессбар будет от 0 до 3)?
в 9 строке для определения позиции прогрессбара используется количество строк датасета + 1??? к текущей позиции ПБ надо прибавлять эту единицу
по ПБ решил вопрос так
Delphi
1
2
3
4
5
6
7
cxProgressBar1.Properties.Min:=0;
cxProgressBar1.Properties.Max:=Table1.RecordCount;
cxProgressBar1.Position:= 0;
while not VolgaTable1.eof do
  begin
    cxProgressBar1.position:= cxProgressBar1.position + 1;
    Application.ProcessMessages;
а вот как решить если запись удалилась и чтоб во второй таблице значение этой записи изменилось с 1 на пустое поле не понял
0
129 / 129 / 41
Регистрация: 17.10.2013
Сообщений: 335
05.09.2014, 14:05 12
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while not Table2.eof do
  begin    
    if Table1.Locate
      (
        'Naimenovanie;Countru;Series;Year',
        VarArrayOf(
          [Table2.FieldByName('Naimenovanie').Value,
          Table2.FieldByName('Countru').Value,
          Table2.FieldByName('Series').Value,
          Table2.FieldByName('Year').Value]),
        [loCaseInsensitive, loPartialKey]
      )
    then
      begin
        Table2.Edit;
        Table2.FieldByName('Same').Value:=1;
        Table2.Post;
      end
    else
      begin
        Table2.Edit;
        Table2.FieldByName('Same').Value:=0;
        Table2.Post;
      end;
    Table2.next;
  end;
1
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 19
05.09.2014, 15:32  [ТС] 13
Благодарствую !!!
0
05.09.2014, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2014, 15:32
Помогаю со студенческими работами здесь

Как сравнить две таблицы и вставить значение
Здравствуйте! Есть две таблицы. В одной около 12 тыс позиций (столбец А) и возле каждой позиции...

Как можно сравнить две таблицы sql-ля?
Спасибо, а как можно сравнить две таблицы sql-ля в C# пе? Например у меня есть справочники(норма),...

Объединить две таблицы по двум одинаковым полям. Не показываются данные со второй таблицы
set safety off select tbl1 Index ON pole1 TAG pole1 OF C:\tbl1.dbf.cdx select tbl1 Index...

Как сравнить две соседние ячейки таблицы php посредством js ?
Добрый день друзья. Подскажите пожалуйста как сравнить две ячейки таблицы. То есть если разница...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru