Работа с DBGrid
Загружаю в DBGrid таблицу excel, нужно провести с этой таблицей некоторую обработку, а именно:
таблица слишком большая, в ней заполнены некоторые строки и столбцы, но не все. Каждый месяц содержание таблицы меняется, то есть одна и та же строка может быть в данном месяце пустой, в след - заполненной.
Не могу сделать универсальный обработчик таблицы, по скрытию незаполненных колонок и строк. Не могли бы вы помочь мне с этим?
Каким образом загружаете Вы экселевский файл в ДБГрид? Используйте подключение к файлу как к БД, и делайте выборку с помощью SQL запроса, отсеивая в нем ненужные строки (в частности пустые).
загрузка таблицы стоит на кнопку, и после появления таблицы хотелось бы сразу получить ее отфильтрованный вариант. Дело в том, что насколько я помню, в sql запросе идет привязка к названиям колонок, а таблица с колонками может меняться каждый месяц, то есть нужен какой-то универсальный оработчик. Пыталась сделать по колонкам, но не сработало, видимо перемудрила.)) Могу показать код)
var i,k:integer;
begin
i:=1;
while i<dbgrid1.Columns.Count do begin
adoquery1.First;
k:=1;
while not adoquery1.Eof do begin
if dbgrid1.Fields.Value='' then begin
k:=k+1;
adoquery1.Next;
end else adoquery1.Next;
end;
if k=adoquery1.RecordCount then
dbgrid1.Columns.Visible:=false;
i:=i+1;
end;
Впрочем, это не важно. Имена полей всё равно знать придётся.
Код:
procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);
var
L: TList;
I: Integer;
begin
DataSet.DisableControls;
try
L := TList.Create;
try
DataSet.GetFieldList(L);
while not DataSet.EOF do
begin
for I := L.Count - 1 downto 0 do
if not TField(L).IsNull then
L.Delete(I);
if L.Count = 0 then
Break;
DataSet.Next;
end;
for I := 0 to L.Count - 1 do
TField(L).Visible := False;
finally
L.Free;
end;
finally
DataSet.First;
DataSet.EnableControls;
end;
end;
var
L: TList;
I: Integer;
begin
DataSet.DisableControls;
try
L := TList.Create;
try
DataSet.GetFieldList(L);
while not DataSet.EOF do
begin
for I := L.Count - 1 downto 0 do
if not TField(L).IsNull then
L.Delete(I);
if L.Count = 0 then
Break;
DataSet.Next;
end;
for I := 0 to L.Count - 1 do
TField(L).Visible := False;
finally
L.Free;
end;
finally
DataSet.First;
DataSet.EnableControls;
end;
end;
Не тестировал.
Спасибо! Но хотелось бы уточнить, у GetFieldList какие должны быть параметры?