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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2016, 13:28   #1
Moneo
Пользователь
 
Регистрация: 21.01.2010
Сообщений: 37
Вопрос Массив, 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;

Последний раз редактировалось Moneo; 26.02.2016 в 14:51.
Moneo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как взять из Excel данные, начиная с первого столбца, средствами ADO? Скрипт Microsoft Office Excel 14 26.05.2014 12:19
Как взять из Excel данные, начиная с первого столбца, средствами ADO? Скрипт Microsoft Office Excel 0 21.05.2014 12:21
Экспорт-импорт Excel <-> ADO + DBGrid <-> Access aL_foks БД в Delphi 3 17.02.2013 13:26
Как добавлять данные в таблицу выведенную из ACCESS в DBGrid (Delphi ADO) Ce4kok БД в Delphi 26 26.01.2009 20:35