среда, 28 декабря 2011 г.

Экспорт базы данных в Excel


Просмотрим процесс выгрузки данных в MS Excel из базы данных.
Для этого создадим новый проект.
На форму помещаем следующие объекты управления:
- TabbedNotebook - является как бы соединением двух компонентов: пачки панелей (страниц) NoteBook и набора закладок TabSet. Эти два компонента могут использоваться и раздельно. Компонент TabSet во многом аналогичен рассмотренному ранее 32-разрядному компоненту TabControl. Это многопозиционный управляющий элемент, который сам по себе не имеет никакой панели. Его основное свойство — Tabs типа TStrings. Задавая строки этого свойства вы тем самым определяете число закладок и их надписи. Свойства StartMargin и EndMargin определяют поля — расстояния крайних закладок от краев компонента. Сами закладки всегда направлены вниз. Поэтому компонентTabSet надо располагать внизу управляемого им компонента. Свойство AutoScroll определяет появление кнопок при большом количестве закладок, которые позволяют пользователю прокручивать полосу закладок, как это делается в компонентах PageControl и TabControl при MultiLine = false. Индекс выбранной закладки определяется свойствомTabIndex, значение которого можно устанавливать и можно читать в обработчике события OnChange, происходящего при смене пользователем закладки и идентичного такому событию в компоненте TabbedNoteBook.
Компонент NoteBook является пачкой панелей, имена и количество которых определяются свойством Pages, как в компоненте TabbedNoteBook. Индекс выбранной страницы определяется свойством PageIndex. В этом компоненте отсутствует управляющий элемент — закладки. Так что страницы можно переключать какими-то кнопками, переключать их в зависимости от действий пользователя, в зависимости от отображаемых данных и т.п. Компоненты NoteBook и TabSet могут быть, конечно, объединены программно в компонент, аналогичный TabbedNoteBook. Для этого достаточно в обработчик события OnChange компонента TabSet вставить оператор
Notebook1.PageIndex := NewTab;
- на объект TabbedNotebook  помещаем объект DBGrid с вкладки Data Controls
- два объекта Button (кнопка) с вкладки Standard и присваиваем им новые имена, соответственно: Button1 – BtnDB с заголовком «Выбрать базу данных», Button2 – BtnExport с заголовком «Экспорт базы данных в Excel»;
- OpenDialog с вкладки Dialog;
- TableDB, являющийся объектом Table с вкладки BDE;
- DataSource с вкладки Data Access.



В объект DBGrid будет переноситься база выбранная база данных при нажатии кнопки BtnDB.
На кнопку BtnDB назначаем выполнение процедуры:

procedure TForm1.BtnDBClick(Sender: TObject);
begin
 if OpenDialog.Execute
 then
  begin
   TableDB.Active:=false;
   TableDB.TableName:=OpenDialog.FileName;
   TableDB.Active:=true;
  end;
end;

На открытие формы определяем выполнение следующей процедуры:

procedure TForm1.FormCreate(Sender: TObject);
begin
 OpenDialog.InitialDir:=ExtractFilePath(Application.ExeName);
end;

А на кнопку BtnExport:

procedure TForm1.BtnExportClick(Sender: TObject);
var
 XL, XArr: Variant;
 i: Integer;
 j: Integer;
begin
 {не забудьте включить ComObj в список используемых модулей}
 // Создаем массив элементов, полученных в результате запроса
 XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);
 XL:=CreateOLEObject('Excel.Application');     // Создание OLE объекта
 XL.WorkBooks.add;
 XL.visible:=true;

 j := 1;
 TableDB.First;
 while not TableDB.Eof do
  begin
   i:=1;
   while i<=TableDB.FieldCount do
    begin
     XArr[i] := TableDB.Fields[i-1].Value;
     i := i+1;
    end;
   XL.Range['A'+IntToStr(j),
   CHR(64+TableDB.FieldCount)+IntToStr(j)].Value := XArr;
   TableDB.Next;
   j:=j+1;
  end;
 XL.Range['A1',CHR(64+TableDB.FieldCount)+IntToStr(j)].select;
 // XL.cells.select;                     // Выбираем все
 XL.Selection.Font.Name:='Arial cur';
 XL.Selection.Font.Size:=10;
 XL.selection.Columns.AutoFit;
 XL.Range['A1','A1'].select;
end;


воскресенье, 25 декабря 2011 г.

Фильтрация записей-Фильтрация данных


Фильтрация - задание ограничений для записей, которые должны войти в набор данных. Состав записей в наборе данных в определенный момент времени зависит от устанавливаемых ограничений, в том  числе и фильтрации. Delphi представляет возможность выполнения двух следующих вариантов фильтрации записей наборов данных:
- по выражению;
- по диапазону.

Фильтрация по выражению

При фильтрации по выражению набор данных ограничивается записями, удовлетворяющими фильтру, задающему условия отбора записей. Поскольку в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна пр небольшом количестве записей.
Для определения выражения фильтра используется свойство Filter типа String. выражение фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы:
- имена полей таблиц;
- литералы;
- операции сравнения;
- арифметические операции;
- логические операции;
- круглые и квадратные скобки.
Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки не нужны.
Литерал представляет собой значение, заданное явно (например, число, строка или символ).
Операции сравнения представляют собой  обычные для языка Pascal отношения <,>,=,<=,>= и <>.
Арифметическими являются операции +, -, * и / (сложение, вычитание, умножение, деление).
В качестве логических операций можно использовать AND, OR и NOT (логическое умножение, сложение и отрицание соответственно).
Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций.
Для активации и деактивации фильтра используется свойство Filtered типа Boolean. По умолчанию это свойство имеет значение False (фильтрация не подходит). При установке свойстве Filtered значения True фильтрация включается, и в набор данных отбираются те данные, которые удовлетворяют фильтру, записанному в свойстве Filter. Если выражение фильтра не задано, то в набор данных попадают все записи.
Параметры фильтрации можно задать с помощью свойств FilterOptions типа TFilterOptions. Это свойство принадлежит к множественному типу и может принимать комбинации двух значений:
- foCaseIntensitive - регистр букв не учитывается. Например, при наличии этого значения для выражения фильтра Avtor='Автомат' в поле Avtor, например, могут содержаться слова Автомат, АВТОМАТ или автомат, которые будут восприниматься как одинаковые.
- foNoPartialCompare - выполняется проверка на полное соответствие содержимого поля и значение, заданного для поиска. Обычно применяется для строк. Если известны только первые символы или символ строки, то нужно указать их в выражении фильтра, заменив остальные символы символом "*" и выключив значение FoNoPartialCompare.
По умолчанию все фильтры выключены и свойство FilterOptions имеет значение [].
Рассмотрим в качестве примера обработки событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы представлен на рисунке 1.

Для создания выражений фильтра используются редакторы Edit. Компонент Edit1 и Edit2 предназначены для задания выражения при фильтрации.
На форму помещаются две кнопки Button. При нажатии кнопки Button3 с заголовком "Фильтровать" фильтр активируется путем присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии на кнопку Button4 с заголовком "Отменить" показываются все записи, фильтр при этом отключается.
Ниже представлены программные коды (обработчики событий) модуля формы, предназначенные для фильтрации:

procedure TForm3.Button3Click(Sender: TObject);
begin
if RadioButton1.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Naim='''+Edit1.Text+'*''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Uhet_zena='''+Edit2.Text+'''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
DataModule2.TTovar.Filtered:=false;
end;

Фильтрация по диапазону

При фильтрации по диапазону в набор данных данных будут включены те записи, значение полей которых соответствуют заданному диапазону. Таким образом, условием фильтрации является выражение вида:
значение > нижней границы AND значение < верхней границы

в которой вместо операций сравнения <и> могут указываться операции <= и >=. Такая фильтрация применяется к набору данных Table.
Достоинством фильтрации по диапазону является высокая скорость обработки записей. В отличи от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведется индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексных полей. Индекс поля, диапазон которого задан в качестве критерия для отбора записей, должен быть установлен как текущий с помощью свойства IndexName или IndexFieldNames.

Рассмотрим в качестве примера обработчики событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы приведён на рисунке 2.

Для задания выражений фильтра используются редакторы Edit. Компонент Edit2 предназначен для задания выражения при фильтрации по подгруппе станка, компоненты Edit3 и Edit4 задают соответственно минимальную и максимальную границу значения поля D_max.
На форму помещаются две кнопки Button. При нажатии кнопки Button11 с заголовком “Фильтровать” фильтр активизируется путём присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии кнопки Button12 с заголовком “Отменить” показываются все записи, фильтр при этом отключается.
Ниже приведены программные коды (обработчики событий) модуля формы Form3, предназначенные для фильтрации:
Procedure TForm3.Button11Click(Sender:TObject);
begin
if RadioButton1.Checked then
begin
Table1.FilterOptions:=[foCaseInsensitive];
Table1.Filter:=’Podgrup=’”+edit2.text+’*’”;
Table1.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
Table1.Filter:=’max_d>=’+edit3.text+’AND max_d<=’+edit4.text;
Table1.Filtered:=True;
beep;
end;
            end;

Кнопки для управление данными на форме

При реализации системы в Delphi, необходимо предусмотреть управление данными в форме, то есть осуществление добавление, удаление и редактирование данных, так же перемещение по записям.
при создании формы с помощью Мастер формы баз данных вверху формы автоматически размещается навигатор, который представляет собой небольшую группу кнопок, связанных с одним набором данных. Навигатор DBNavigator является визуальным компонентом, расположенным на странице Data Controls. Каждая кнопка навигатора выполняет определенную функцию базы данных.
Состав видимых кнопок определяет свойство VisibleButtons. Устанавливая для каждой из кнопок значение True или False в свойстве VisibleButtons, программист может формировать внешний вид навигатора.
Подсказку для каждой из кнопок можно установить с помощью свойства Hint типа TString. Для отображения подсказок необходимо установить значение True для свойства ShowHint. Вызвав строковый редактор String List Editor (нажав на кнопку ... в свойстве Hint), можно вести русские названия соответствующих кнопок.
Для связи навигатора с набором данных для свойства DataSource указывается соответствующие значение компонента DataSource.
реализация функции, выполняемых кнопками навигатора, возможна с помощью кнопок Button. В качестве примера рассмотрим создание групп кнопок на форме представленной ниже.
Для этого поместим на форму восемь компонентов Button (кнопка), находящаяся на странице Standard. Поскольку нажатие на каждую из кнопок должно приводить к стандартным процедурам навигатора базы данных, то в программном коде необходимо вызвать процедуры, присвоенные каждой кнопке формы. программные коды для кнопок управления имеют следующий вид:
Кнопка "Добавить":

procedure TForm5.Button1Click(Sender: TObject);
begin
DataModule2.TKlient.Insert;
end;
Кнопка "Сохранить":
procedure TForm5.Button2Click(Sender: TObject);
begin
DataModule2.TKlient.Post;
end;
Кнопка "Удалить":
procedure TForm5.Button3Click(Sender: TObject);
begin
DataModule2.TKlient.Delete;
end;
Кнопка "Обновить":
procedure TForm5.Button4Click(Sender: TObject);
begin
DataModule2.TKlient.Refresh;
end;
Кнопки, осуществляющие перемещение по записям формы:
Кнопка "Первая":
procedure TForm5.Button5Click(Sender: TObject);
begin
DataModule2.TKlient.First;
end;
Кнопка "Следующая":
procedure TForm5.Button6Click(Sender: TObject);
begin
DataModule2.TKlient.Next;
end;
Кнопка "Предыдущая":
procedure TForm5.Button7Click(Sender: TObject);
begin
DataModule2.TKlient.Prior;
end;
Кнопка "Последняя":
procedure TForm5.Button8Click(Sender: TObject);
begin
DataModule2.TKlient.Last;
end;
Так же на форме определим кнопку, осуществляющую переход на  указанный номер строки, для этого справа от кнопки "Перейти на" необходимо поместить визуальный компонент Edit (однострочный редактор), взяты со страницы DataControls. Этот компонент используется для ввода и отображения текста. В Инструкторе свойства объекта задать значение по умолчанию "1" свойству Text. И назначаем на нее выполнение следующей процедуры:
procedure TForm5.Button9Click(Sender: TObject);
begin
DataModule2.TKlient.RecNo=StrToInt(Edit1.Text);
end;
Для каждого компонента Button необходимо задать соответствующие значения в свойстве Caption.