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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2016, 15:14
Moneo Moneo вне форума
Прохожий
 
Регистрация: 26.02.2016
Сообщения: 8
Версия Delphi: Delphi 10
Репутация: 10
Вопрос Массив, ADO, Access, Excel -при сравнении столбцов пропадают данные

Добрый день. Подключаюсь к базе Access через ADO и загружаю в stringgrid файл excel, задача сравнить по столбцу CATALOG наличие его значений в базе, для этого я сделал цикл с массивом в котором сравниваются значения через ADOQuery для каждой записи stringgrid, затем если значения такого нет в базе, то оно запоминается в массив. После цикла очищается стринггрид, сокращается количество строк в нем под строки массива и заносится всё обратно в стринггрид. Всё работает, но если записей очень много, то при возврате записей меньше в стринггриде - запуливал 12504, вернулось 12435. В чем причина догадаться пока не получилось. Есть 2 кнопки на этой форме перенос из стринггрида в базу и кнопка сравнения. Если я загружаю 12504 записей в базу, затем делаю сравнение, то он пишет 0 записей отсутствующих так и должно быть, но если я загружаю эти 12504 в стриггрид и сразу жму сравнение не внося их в базу он должен показать что 12504 нету в базе, но он показывает как 12435 записей. Может свежий ваш взгляд поможет. Спасибо за внимание! (Win 10, Delphi 10)

Код:
procedure Tform3.Button1Click(Sender: TObject);
var
j,I,checkrow,mrow:integer;
mas: array of array of variant;
begin
 checkrow:=0;
 mrow:=0;
 form2.short:=tstringlist.create;
 form2.short.Clear;
form2.adoconnection1.GetTableNames(form2.short);
 if (form2.short.IndexOf(edit1.text)<>-1) and (edit1.text<>'') then
 begin

  for I := 1 to stringgrid1.RowCount-1 do
begin
  form2.adoquery3.SQL.Clear;
 form2.adoquery3.SQL.Text:='select [CATALOG] from ['+edit1.text+'] where [CATALOG]=:cd';
 form2.adoquery3.Parameters.ParamByName('cd').value:=stringgrid1.cells[0,i];
form2.adoquery3.execsql;
form2.adoquery3.open;
if form2.ADOQuery3.IsEmpty=true then
begin
 checkrow:=checkrow+1;
end;
end;
   checkrow:=checkrow+1;

  SetLength(mas,stringgrid1.colcount,checkrow);
 for I := 1 to stringgrid1.RowCount-1 do
begin

  form2.adoquery3.SQL.Clear;
 form2.adoquery3.SQL.Text:='select [CATALOG] from ['+edit1.text+'] where [CATALOG]=:cd';
 form2.adoquery3.Parameters.ParamByName('cd').value:=stringgrid1.cells[0,i];
form2.adoquery3.execsql;
form2.adoquery3.open;
if form2.ADOQuery3.IsEmpty=true then
begin
inc(mrow);
for j := 0 to stringgrid1.colcount-1 do
 mas[j,mrow]:=stringgrid1.cells[j,i] ;

end;

end;

for j := 0 to stringgrid1.colcount do
  StringGrid1.Cols[j].Clear;

   stringgrid1.rowcount:=checkrow;
   mrow:=0;

   with stringgrid1 do
   begin
   for i := 1 to rowcount-1 do
   begin
     inc(mrow);
 for j := 0 to colcount-1 do
cells[j,i]:=mas[j,mrow];
 end;
   end;

end;


statusbar1.panels[0].text:='Файл: '+opendialog1.FileName+', количество записей: '+inttostr(stringgrid1.rowcount-1);
end;
Ответить с цитированием
  #2  
Старый 26.02.2016, 16:24
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вы удивитесь, но вы могли к Экселю подключится точно так-же через Адо. А еще в Акцес можно было импортировать файл Экселя и в нем работать.
Но при любом варианте проще и быстрее через sql сделать запрос на поиск отсутствующих значений, чем изобретать самокат.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 26.02.2016, 17:43
Moneo Moneo вне форума
Прохожий
 
Регистрация: 26.02.2016
Сообщения: 8
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Вы удивитесь, но вы могли к Экселю подключится точно так-же через Адо. А еще в Акцес можно было импортировать файл Экселя и в нем работать.
Но при любом варианте проще и быстрее через sql сделать запрос на поиск отсутствующих значений, чем изобретать самокат.
Вы предлагаете подключиться через Ado к Excel и там уже построить между ADO Sql запрос? Или придется во временную таблицу основной базы перегонять все из excel?
Ответить с цитированием
  #4  
Старый 26.02.2016, 20:08
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Именно так, есть такая штука - гетерогенный запрос, он предназначен для получения единой выборки данных из разных баз. Т.е можно подключится к екселю, фокспро, акцесу и т.д. в рамках одного запроса. И никаких промежуточных таблиц.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 26.02.2016, 21:13
Moneo Moneo вне форума
Прохожий
 
Регистрация: 26.02.2016
Сообщения: 8
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Именно так, есть такая штука - гетерогенный запрос, он предназначен для получения единой выборки данных из разных баз. Т.е можно подключится к екселю, фокспро, акцесу и т.д. в рамках одного запроса. И никаких промежуточных таблиц.
пример можно вас попросить привести. Нужно 2 соединения к базам ? К access и excel и по кваре к ним с датасорсами и как примерно запрос может с 2 базами работать ?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter