Система формирования произвольной отчетности. Шаг 1-ый. Выделить столбец в DBGridEh.
08.12.2017Так уж сложилось в нашей компании, что головная контора периодически запрашивает различные отчеты по филиалам, предоставляя для них формы, которые создает неуправляемый «генератор идей» в умах вышестоящего руководства.
Зачастую формы повторяются, но с различными корректировками, причем создающими исполнителям не мало гемороя, не только из-за сути задания, но и из-за предоставления заказчиком отчета форм в виде файлов PDF, Excel или Word..
Далее эти файлы рассылаются по предприятиям, они заполняют, а управление сводит все в один файл и потом уже отправляет в головную контору. Уходит много времени на сбор и анализ данных, и к тому же хранение и поиск этой информации спустя пару месяцев или лет , — создает много неудобств.
Это может быть и экономические, и финансовые, и IT-шные, и другие отчеты.
Как правило процедура выполняется и все забывается до нового срабатывания «генератора»..
Устав от таких проявлений высокого интелекта, я решил создать систему, которая бы позволила создавать шаблон отчета одним из администраторов (по кругу знаний), при котором создавалась бы и база данных этих самых произвольных отчетов.
Решено было заложить возможность дублирования и корректировки уже созданных отчетных форм.
Соответственно здесь будет и база данных , и набор функций подсчета и анализа, которые должны закладываться в систему при созданиии отчетных форм..
Для исполнения этой задачи я использовал Delphi, а в качестве шаблонного средства — DBGridEh, поскольку его функционал впролне пригоден. Конечно у меня нет лицензии на свежий DBGridEh, поэтому использована старая версия с ее недочетами и неудобствами..
Первое что захотелось реализовать — управляемый грид, в котором можно было бы создать шаблон будующей отчетной таблицы, с возможностью создания, редактирования, объединения, перемещения и других операций с полями и строками, минимизируя действия пользователя.
По замыслу первый столбец таблицы будет заголовками для строк, таким образом получится двухмерная таблица.
Начнем….
1. Бросаем на форму компонент DBGridEh и настраиваем некоторые его свойства:
AutoFitColWidths = True UseMultiTitle = True Options = [ dgTitles = True dgRowSelect = True dgMultiSelect = True ]
Эти настройки позволят выполнять выделение столбцов и строк.
Если для строк все понятно, то со столбцами пришлось немного помучать мозг, чтобы найти механизм быстрого и легкого определения выделенных пользователем столбцов и их расположение. Оказалось все просто.
Изначально хотел использовать механизм DBGridEh для выделения столбцов и определения некоторых из параметров, но оказалось неудобно..
Кстати для примера, — вот код позволяющий выделить столбец и получить его значения, который я хотел использовать первоначально:
procedure TForm1.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh); begin with DBGridEh1.Selection do if SelectionType = gstColumns then begin DBGridEh1.Selection.Columns.Select(DBGridEh1.Columns[column.Index], true) ; for i := 0 to Pred(Columns.Count) do begin ShowMessage(Columns[i].Title.Caption); end; end; end;
Функционал не устроил тем, что неудобно отслеживать снятие выделения со столбца, поэтому пришел к выводу, что удобнее использовать другой вариант, а именно:
Полскольку поля DBGridEh по умочанию имеют значение Tag=0 , — решил использовать этот момент.
procedure TForm1.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh); begin if column.Index<>0 then begin // не использую первый столбец - он список строк. x:= DBGridEh1.Columns[column.Index].Tag ; if x=0 then begin // ВЫДЕЛЯЮ ПРИ НАЖАТИИ НА СТОЛБЕЦ, // DBGridEh1.Selection.Columns.Select(DBGridEh1.Columns[column.Index], true) ; DBGridEh1.Columns[column.Index].Tag:=1; DBGridEh1.Columns[column.Index].Color:=clYellow; end; if x=1 then begin // СНИМАЮ ВЫДЕЛЕНИЕ ПРИ НАЖАТИИ НА СТОЛБЕЦ, // DBGridEh1.Selection.Columns.Select(DBGridEh1.Columns[column.Index], false) ; DBGridEh1.Columns[column.Index].Tag:=0; DBGridEh1.Columns[column.Index].Color:=clWindow; end; end; // ОПРЕДЕЛЯЮ КАКИЕ СТОЛБЫ ВЫДЕЛЕНЫ with DBGridEh1 do for i := 0 to Pred(Columns.Count) do begin j:= Columns[i].Tag ; if j=1 then ShowMessage(Columns[i].Title.Caption+' '+inttostr(columns[i].Index)+' '+inttostr(columns[i].Tag)); end;
Осталось перечитать данные при перемешении столбцов относительно друг друга:
procedure TForm1.DBGridEh1ColumnMoved(Sender: TObject; FromIndex, ToIndex: Integer); begin with DBGridEh1 do for i := 0 to Pred(Columns.Count) do begin j:= Columns[i].Tag ; if j=1 then ShowMessage(Columns[i].Title.Caption+' '+inttostr(columns[i].Index)+' '+inttostr(columns[i].Tag)); end; end;
Таким образом происходит выделение и снятие выделения со столбца, а так же формируется список выделенных столбцов, который будет помещен в динамический массив для дальнейшей обработки..
На сегодня все 🙂 Продолжение следует..
где продолжение?