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