Добрый день! Скажите пожалуйста, можно ли каким-то образом задать фильтры на отображаемые в отчете поля (столбцы)?
Запрос возвращает все поля, а мне нужно дать возможность отображать только отмеченные на форме фильтров отчета.
Спасибо!
Подобный функционал придётся прописывать в коде сервиса FastReport, регулируя вручную расположение колонок, их видимость и размер.
Например, создаём окно фильтрации, в котором галочками будут отмечаться колонки для отображения. В обработчике события OnPrepare отчёта считываем эти значения и записываем их в атрибуты отчёта. Дальше допустим, что у нас есть MasterData с полями Memo1, Memo2, Memo3. Тогда создаём обработчик события OnBeforePrint для MasterData, в котором проверяем: если атрибут, соответствующий полю Memo1, равен false, выполняем:
Аналогично поступаем и для остальных случаев. Важно учесть все возможные варианты отображения.
Вариант попроще: если есть несколько (два, три) самых распространённых вариантов отображения полей, можно создать в отчёте три страницы, которые будут отличаться только набором полей. Дальше в окне фильтрации предлагать выбрать один из вариантов отображения, а в обработчике события OnStartReport объекта Report определять вариант отображения, и в зависимости от него делать видимой ту или иную страницу:
if(<Attribute2>=true) then
begin
Page1.Visible:=false;
Page2.Visible:=true;
Page3.Visible:=false;
end
else
...
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
Можно даже не использовать скрипт отчёта, а установить атрибуты напрямую из окна фильтрации. Например, так:
В обработчике btnOKOnClick Вашего окна фильтрации получаем отчёт и устанавливаем ему атрибуты:
function btnOKOnClick(Control){
var Report = Self.Attributes('ReportPreviewer').Report;
Report.Attributes('AttributeName1')= edtControl1.Value;
Report.Attributes('AttributeName2')= edtControl2.Value;
...
SendNotify(Self, MSG_OK);}
После этого в коде отчёта Вы сможете обращаться к этим атрибутам так:
if(<AttributeName1>=1) then ...
"McCoy" написал:Скажите пожалуйста, есть ли в отчетах механизм сортировки по определенному столбцу?
По определённому столбцу можно отсортировать запрос отчёта - непосредственно в сервисе запроса установить тип и порядковый номер сортировки. Другой вариант - установить сортировку по полю датасета в скрипте перед формированием отчёта:
var Dataset = ReportPreviewer.DatasetByUSI('ds_ReportDataset');
Dataset.DataFields('FieldName').OrderType= otAsc;
Dataset.DataFields('FieldName').OrderPosition=1;
Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.
А как бы оптимизировать данную ситуацию...
К примеру у нас через фастрепорт формируются заявки-анкеты двух типов для физ лиц и для юр.лиц.
В первом случае анкеты выводятся с данными физического лица - серия и номер паспорта
Во втором случае анкеты выводятся данные юр.лица - едрпоу, р/с, мфо и т.д.
Как выводить в отчет только те поля которые заполнены...
Например если заполнены поля паспорт - выводить отчёт с данными для физ лиц, а если заполнен ЄДРПОУ то выводить отчёт с данными для юр лиц.
Александр, попробуйте в коде отчета на OnBeforePrint прописать проверку примерно следующего вида:
if<Table1."Field1">= Null then...
Пример:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
if(<TSDataset1."SignedQuantity">= Null) then
MasterData1.Visible:=falseelse
MasterData1.Visible:=true;
end;
По аналогии можете скрывать или делать видимыми компоненты отчета (скрывать страницы или печатать выбранные).
Татьяна,
действительно так работает.
Просто насколько мне известно в ObjectPascal не обязательно указывать скобки в случае когда есть всего одно условие, в отличии от JScript.
Но даже если и указать, то отладчик в самом ObjectPascal не ругается,
а вот в FastReport ему почему то не нравятся "()"
Спасибо за помощь...