Система формирования произвольной отчетности. Шаг 1-ый. Выделить столбец в DBGridEh.

08.12.2017

gridselrctТак уж сложилось в нашей компании, что головная контора периодически запрашивает различные отчеты по филиалам, предоставляя для них формы, которые создает неуправляемый «генератор идей» в умах вышестоящего руководства.
Зачастую формы повторяются, но с различными корректировками, причем создающими исполнителям не мало гемороя, не только из-за сути задания, но и из-за предоставления заказчиком отчета форм в виде файлов 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;

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

На сегодня все 🙂 Продолжение следует..

Комментарии

1 комментарий к записи “Система формирования произвольной отчетности. Шаг 1-ый. Выделить столбец в DBGridEh.”
  1. МК:

    где продолжение?

Оставить комментарий