|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Массив, 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
|
||||
|
||||
Вы удивитесь, но вы могли к Экселю подключится точно так-же через Адо. А еще в Акцес можно было импортировать файл Экселя и в нем работать.
Но при любом варианте проще и быстрее через sql сделать запрос на поиск отсутствующих значений, чем изобретать самокат. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Цитата:
|
#4
|
||||
|
||||
Именно так, есть такая штука - гетерогенный запрос, он предназначен для получения единой выборки данных из разных баз. Т.е можно подключится к екселю, фокспро, акцесу и т.д. в рамках одного запроса. И никаких промежуточных таблиц.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Цитата:
|