Добрый день!
Скажите пожалуйста, можно ли каким-то образом задать фильтры на отображаемые в отчете поля (столбцы)?
Запрос возвращает все поля, а мне нужно дать возможность отображать только отмеченные на форме фильтров отчета.
Спасибо!
Нравится
Подобный функционал придётся прописывать в коде сервиса FastReport, регулируя вручную расположение колонок, их видимость и размер.
Например, создаём окно фильтрации, в котором галочками будут отмечаться колонки для отображения. В обработчике события OnPrepare отчёта считываем эти значения и записываем их в атрибуты отчёта. Дальше допустим, что у нас есть MasterData с полями Memo1, Memo2, Memo3. Тогда создаём обработчик события OnBeforePrint для MasterData, в котором проверяем: если атрибут, соответствующий полю Memo1, равен false, выполняем:
Memo1.Visible := false; Memo2.Left := Memo1.Left; Memo2.Width := ...; Memo3.Left := Memo2.Left + Memo2.Width; Memo3.Width := ...;
Аналогично поступаем и для остальных случаев. Важно учесть все возможные варианты отображения.
Вариант попроще: если есть несколько (два, три) самых распространённых вариантов отображения полей, можно создать в отчёте три страницы, которые будут отличаться только набором полей. Дальше в окне фильтрации предлагать выбрать один из вариантов отображения, а в обработчике события 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 := false else MasterData1.Visible := true; end;
По аналогии можете скрывать или делать видимыми компоненты отчета (скрывать страницы или печатать выбранные).
Page1.Visible := true;
Page2.Visible := true;
Page3.Visible := false;
Спасибо Татьяна,
но не правильно отрабатывает проверка логики:
(<ds_ReportContractCard."EDRPOU"> = Null)
даже если поле пустое, всё равно срабатывает
MasterData1.Visible := true;
По-моему на Null в скрипте к отчету сравнивать не получится, попробуйте сравнить с пустой строкой:
(<ds_ReportContractCard."EDRPOU"> = '')
Пробовал и одинарные и двойные скобки.
Ругается на синтаксис, просит ")"
Александр, вот так работает:
if <ds_ReportOfferingsInInvoice."Offering"> = '' then
Возможно, проблема с "()" в которые заключено выражение.
Татьяна,
действительно так работает.
Просто насколько мне известно в ObjectPascal не обязательно указывать скобки в случае когда есть всего одно условие, в отличии от JScript.
Но даже если и указать, то отладчик в самом ObjectPascal не ругается,
а вот в FastReport ему почему то не нравятся "()"
Спасибо за помощь...