Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
all_lab.doc
Скачиваний:
47
Добавлен:
14.11.2019
Размер:
1.42 Mб
Скачать

5. Экспорт данных в Excel

Для этого нужно добавить на форму компоненты со вкладки Servers: ExcelApplication, ExcelWorkbook, ExcelWorksheet.

Далее приведен код процедуры экспорта, в которой отображается прогресс экспорта, для этого нужно дополнительно создать новую форму, включив е в список uses, на которой расположить ProgressBar и 4 компонента label:

Примерный вид прогресса:

procedure TForm1.ExportDBGrid(var dbgrid:TDBGrid);

const CellName: array [0..11] of char = ('a','b','c','d','e','f','g','h','i','j','k','l');

//размер этого массива должен быть >= количеству ячеек в DBGrid’е!

var index,Cl,V: OleVariant;

i,j,maxrec: integer;

begin

ExcelApplication1.Connect;

ExcelApplication1.Workbooks.Add(EmptyParam,0);

ExcelApplication1.Visible[0]:=false;//не показывает Excel пока экспортирует

ExcelWorkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook);

index:=1;

ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets.item[index] as _worksheet);

ExcelWorksheet1.Activate(0);

maxrec:=0;//количество записей в DBGrid’е

dbgrid.DataSource.DataSet.Open;

if dbgrid.DataSource.DataSet.FindFirst then maxrec:=1;

while dbgrid.DataSource.DataSet.FindNext do inc(maxrec);

form2.ProgressBar1.Max:=maxrec;

Form2.Label4.Caption:=inttostr(maxrec);

form2.Show; //показывает форму с прогрессом

try

for i:=1 to maxrec do

begin

dbgrid.DataSource.DataSet.RecNo:=i;

for j:=0 to pred(dbgrid.FieldCount)do

begin

Cl:=CellName[j]+IntToStr(i);

V:= dbgrid.Fields[j].DisplayText;

ExcelWorksheet1.Range[Cl,Cl].Value2:=V;

end;

Form2.ProgressBar1.Position:=i;//двигает полосу прогресса

Form2.Label2.Caption:=inttostr(i);//текущая позиция

form2.ProgressBar1.Repaint;

form2.Repaint;

end;

finally

form2.Close;//закрыть окно прогресса

ShowMessage('Данные экспортированы');

ExcelApplication1.Visible[0]:=true;

ExcelApplication1.Disconnect;//отключение от Excel

end;

end;

У этой процедуры есть два минуса – это низкая скорость экспорта и необходимость каждый раз закрывать программу Excel перед очередным экспортом, иначе будут ошибки.

6. Работа с внешними ключами

Допустим надо добавить в таблицу «классы» данные, среди которых есть поле «профиль», являющееся внешним ключом. Соответственно надо, чтобы пользователь вводил не ID номер, а просто выбрал из списка существующих вариантов нужный.

Для начала необходимо каким-то образом этот список заполнить. Создадим процедуру Init без параметров, которую будем вызывать каждый раз при добавлении, изменении, удалении любых данных из БД, и в которой как раз и будут инициализироваться все всплывающие списки. Можно добавить на форму компонент ADQuery и поменять его имя на InitQuery1 для удобства.

Будем заполнять Combobox1 названиями профилей

procedure TForm1.init;

begin

ComboBox1.Clear;//очищаем список

InitQuery1.SQL.Clear;

InitQuery1.SQL.Append(‘select profile_name from profiles’);//текст запроса

InitQuery1.Active:=true;

if InitQuery1.FindFirst then //если найдена 1-я запись то добавляем ее в список

ComboBox11.Items.Append(InitQuery1.Fields[0].DisplayText);

while InitQuery1.FindNext do //если найдена след. зпись то добавляем

ComboBox11.Items.Append(InitQuery1.Fields[0].DisplayText);

InitQuery1.Active:=false;

InitQuery1.SQL.Clear;

end;

После этой процедуры в ComboBox1 будут содержаться все названия профилей. Но это еще не все. Чтобы в поле class_profile_id добавлялся id номер профиля, необходимо написать такой запрос, в котором вместо значения внешнего ключа будет подзапрос, возвращающий ID:

insert into classes (class_num,class_char,class_profile_id)

values (:class_num,:class_char,(select profile_id from profiles where profile_name=:profile1))

Теперь при нажатии кнопки «Добавить» надо выполнить следующий код:

procedure TForm1.Button2Click(Sender: TObject);

begin

ADQuery1.Params.Items[0].AsInteger:=strtoint(edit1.Text);//номер класса

ADQuery1.Params.Items[1].AsString:=edit2.Text;//буква класса

ADQuery1.Params.Items[2].AsString:=ComboBox1.Text;

ADQuery1.ExecSQL;

ADTable1.Refresh;//чтобы данные сразу обновились

end;

Задание

Написать приложение к БД для собственого проекта с учетом добавления, изменения и удаления данных, сортировки, выборки и вычислимых запросов, реализовать генерацию отчетов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]