Sources.RU Magazine Поиск по журналу
 

TopList

Менеджер отчётов

Автор: Савельев Андрей

Существует коммерческий проект «АРМ Торговля и склад», предназначение которого состоит в автоматизации работы на складе и на кассе в торговом зале. Проект содержит модуль «Склад», подразумевающий формирование и хранение группы документов: приходные и расходные документы, списание и возврат товара, продажи по кассе и т.д. Каждой группе документов соответствуют свои отчеты. Например, к приходным и расходным документам относятся такие отчёты как «Приходная и расходная накладная» и «Печать ценников на оприходованный товар». К списанию товара или передаче его в другой отдел относятся «Акт на списание» и «Накладная на списание», а к документам продажи по кассе относятся «Список чеков на дату» и «Справка-отчёт кассира-операциониста». Отчетов множество, и выполнение того или иного из них для определённого документа представляет трудность, преодолеть которую позволит менеджер отчетов.

Первоначально необходимо определить состав таблицы, в которой будут храниться физические названия и описание отчётов. Пусть таблица называется RPT_LIST и имеет следующую структуру:

- ID_RPT // нумерация позиций отчётов
- NAME_RPT //название отчёта
- COMMENT_RPT // комментарий для отчёта
- VALUE_RPT // значение, которому будет соответствовать тип операции
- NAME_RPT_SHOT // физическое название отчёта

DDL таблицы
CREATE TABLE RPT_LIST (
    ID_RPT          INTEGER NOT NULL,
    NAME_RPT        VARCHAR(50) NOT NULL,
    COMMENT_RPT     VARCHAR(255) NOT NULL,
    VALUE_RPT       INTEGER NOT NULL,
    NAME_RPT_SHORT  VARCHAR(50) NOT NULL
);

Для работы с таблицей создается проект Delphi. На форму бросим Panel, на панели разместим DBGrid и DBMemo, а также три кнопки, которые назовём btnPreview, btnPrint, btnExit. Выставим Align у компонентов так, как это показано на рис. 1.
Кроме того, создадим DataMoule и поместим туда IBDataBase, IBTransaction, IBQuery, DataSources, и свяжем их обычным способом (подробнее рассмотрено в примере).

Менеджер отчётов
Рис. 1 – Окно проекта

Алгоритм действий прост: при открытии формы в DBGrid’е формируется список отчётов в зависимости от выбранного типа операции. За тип операции отвечают RatioButton’ы, по умолчанию выбран тип «Приход». При выборе в DBGrid’е необходимого отчёта в DBMemo отображается его краткое описание. Выбранный отчёт можно предварительно просмотреть или сразу вывести на печать.
Ниже представлен полный код проекта.

Код модуля DataModule (назван в примере dm)

procedure Tdm.DataModuleCreate(Sender: TObject);
begin
// вызывается процедура подключения БД
  frmMain.OpenBD;
// Открывается DataSet для первичного формирования группы отчётов
// для определённого типа операции
  IRep.Open;
end;

Код главной формы frmMain

//процедура, которая отвечает за динамическое подключение БД
procedure TfrmMain.OpenBD;
begin
  //путь до БД
  dm.IBDatabase.DatabaseName := ExtractFilePath(Application.ExeName)+'\base.fdb';;

  with dm do
    begin
      try
        IBDatabase.Connected := True;
        IBTransaction.Active := True;
      except
        on E:Exception do
        begin
          Application.MessageBox(PChar('Не удалось подключиться к серверу!' +
            #10#13+#10#13 + e.Message),'Пример',MB_OK + MB_ICONERROR);
            Close;
        end;
      end;
    end;
end;

procedure TfrmMain.RadioButton1Click(Sender: TObject);
begin
  with dm.IRep do
    begin
      close;
      sql.Clear;
      sql.Text := 'select * from rpt_list where value_rpt = ' + QuotedStr(IntToStr((Sender as TRadioButton).Tag));
      Open;
    end;
end;

//кнопка просмотра
procedure TfrmMain.btnPreviewClick(Sender: TObject);
begin
  //Создание объекта
  Rep := TfrxReport.Create(self);
  //загрузка отчёта
  Rep.LoadFromFile(ExtractFilePath(Application.ExeName)+dm.IRep.FieldByName('name_rpt_short').AsString);
  //просмотр отчёта
  if rep.PrepareReport then
    rep.ShowPreparedReport;
  //освобождение памяти
  rep.Free;
end;

procedure TfrmMain.btnExitClick(Sender: TObject);
begin
 Close;
end;

// кнопка печати
procedure TfrmMain.btnPrintClick(Sender: TObject);
begin
  //Создание объекта
  Rep := TfrxReport.Create(self);
  //загрузка отчёта
Rep.LoadFromFile(ExtractFilePath(Application.ExeName)+dm.IRep.FieldByName('name_rpt_short').AsString);
  //печать отчёта
  if Rep.PrepareReport then
    Rep.Print;
  //освобождение памяти
  Rep.Free;
end;

Работа менеджера показана на рис. 2.

Менеджер отчётов
Рис. 2 – Работа приложения

Рассмотренные примеры прилагаются в архиве. Следует помнить, что база данных создавалась на СУБД FireBird 1.5.4 и для работы примера необходимо, чтобы данная СУБД была установлена.

Савельев Андрей



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru