Приветствую!
Такая задача:
необходимо при нажатии на печать из той или иной формы выводить данный не по дефолту, как все данные разбиты по колонкам, а например, есть данные повторяющиеся и чтобы они не повторялись в отдельной колонке 100 раз, надо вывести их в шапку печатной формы.
Нравится
Для этого нужно внести изменения в печатную форму. Перейдите в дизайнер отчета и над MasterData добавьте GroupHeader. В него добавьте поле, по которому вам нужна группировка - в данном случае это поле 'Комментарий'.
что-то не получается вывести в шапку, постоянно ругается, что некорректный GroupHeader., где именно необходимо название столбца пописывать?
Ругается, потому что нужно выбрать не только название датасета, но и поля, по которому нужно группировать (см. файл во вложении).
Чтобы выбрать название поля нужно связать датасет FastReport с датасетом в конфигурации Terrasoft.
Если вам удалось выбрать значение поля, тогда датасет FastReport связан с датасетом конфигурации.
На GroupHeader добавьте Memo, в котором также укажите датасет и название поля (см. прикрепленный файл).
Также можете посмотреть пример группировки на конкретном примере: http://www.community.terrasoft.ru/forum/topic/8512
А как при клике на кнопку принт сделать так, чтобы открывался именно определенный репорт, а не родительский?
О какой кнопке принт идет речь?
Если Вам нужно вызывать отчет из конфигурации Terrasoft, то на обработчик OnClick кнопки вызываете приблизительно такой код (где ReportID - это уникальный идентификатор вашего отчета FastReport, ID записи в разделе 'Отчеты'):
var ReportDataset = GetSingleItemByCode('ds_Report', 'SingleReport');
var Columns = ReportDataset.SelectQuery.Items(0).Columns;
DisableAllColumns(Columns);
var FieldNames = new Array('Code', 'FilteredDatasetCode', 'FilterFormCode');
EnableColumnsByArray(Columns, true, FieldNames);
ApplyDatasetIDFilter(ReportDataset, ReportID, true);
ReportDataset.Open();
if (IsDatasetEmpty(ReportDataset)) {
return;
}
var ReportUSICode = ReportDataset.Values('Code');
var FilteredDatasetCode = ReportDataset.Values('FilteredDatasetCode');
var FilterFormCode = ReportDataset.Values('FilterFormCode');
var Report = Services.GetNewItemByUSI(ReportUSICode);
if (FilterFormCode) {
var FilterForm = Services.GetNewItemByUSI(FilterFormCode);
}
ShowReport(Report, FilterForm);
По нажатию на кнопку 'Печать' отчеты формируются автоматически по записям реестра. Это является базовой функциональностью.
Если вы хотите отчет с группировкой, то для этого нужно разработать собственный отчет FastReport с группировкой, как было описано выше.
а где посмотреть Report ID, в админке это можно посмотреть?
(где ReportID - это уникальный идентификатор вашего отчета FastReport, ID записи в разделе 'Отчеты') - не могу найти...
В TSAdmin вы этой информации не увидите.
Для этого нужно написать sql-запрос вида:
select ID
from tbl_Report
where Name = 'Отчет1'
Отчет1 - это название Вашего отчета
и выполнить его на сервере базы данных.
Спасибо, это самое простое для меня)
а куда этот ID в вашем коде вставлять?
то есть я сейчас сделал следующее:
в нужном окне добавил кнопку OK и при нажатии на нее хочу вывести данные из окна в нужный fr_
в скрипте к данному окну пишу ваш экземпляр:
function btnOKOnClick(Control) { var ReportDataset = GetSingleItemByCode('ds_VisesInDetailPD', 'fr_FastReport'); var Columns = ReportDataset.SelectQuery.Items(0).Columns; DisableAllColumns(Columns); var FieldNames = new Array('Code', 'FilteredDatasetCode', 'FilterFormCode'); EnableColumnsByArray(Columns, true, FieldNames); ApplyDatasetIDFilter(ReportDataset, ReportID, true); ReportDataset.Open(); if (IsDatasetEmpty(ReportDataset)) { return; } var ReportUSICode = ReportDataset.Values('Code'); var FilteredDatasetCode = ReportDataset.Values('FilteredDatasetCode'); var FilterFormCode = ReportDataset.Values('FilterFormCode'); var Report = Services.GetNewItemByUSI(ReportUSICode); if (FilterFormCode) { var FilterForm = Services.GetNewItemByUSI(FilterFormCode); } ShowReport(Report, FilterForm); }
Вместо ReportID в эту строку:
ApplyDatasetIDFilter(ReportDataset, ReportID, true);
Также у вас ошибка в строке:
var ReportDataset = GetSingleItemByCode('ds_VisesInDetailPD', 'fr_FastReport');
Название датасета должно быть 'ds_Report'!
function btnOKOnClick(Control) { var ReportDataset = GetSingleItemByCode('ds_Report', 'fr_FastReport'); var Columns = ReportDataset.SelectQuery.Items(0).Columns; DisableAllColumns(Columns); var FieldNames = new Array('Code', 'FilteredDatasetCode', 'FilterFormCode'); EnableColumnsByArray(Columns, true, FieldNames); ApplyDatasetIDFilter(ReportDataset, '6D4B6990-859E-4A04-AE7B-F2B283FF6572', true); ReportDataset.Open(); if (IsDatasetEmpty(ReportDataset)) { return; } var ReportUSICode = ReportDataset.Values('Code'); var FilteredDatasetCode = ReportDataset.Values('FilteredDatasetCode'); var FilterFormCode = ReportDataset.Values('FilterFormCode'); var Report = Services.GetNewItemByUSI(ReportUSICode); if (FilterFormCode) { var FilterForm = Services.GetNewItemByUSI(FilterFormCode); } ShowReport(Report, FilterForm); }
бросил фаст репорт, пытаюсь выгрузить данные из окна в excel, как выгрузить именно данные из определенного окна?
делаю так:
function btnOKOnClick(Control) { var StartRow = 4; var sq = Services.GetNewItemByUSI('sq_VisesInDetailPD'); //var sq = Services.GetNewItemByUSI('wnd_VisesInDetailPDGridArea'); var ds = sq.Open(); var Excel = new ActiveXObject('Excel.Application'); var Excel_wb = Excel.Workbooks.Add(); while(Excel_wb.Sheets.Count > 1) { Excel.Sheets(1).Delete(); } var Sheet = Excel.Sheets(1); Sheet.Name = 'Лист согласования'; Sheet.Cells(StartRow,2).Value = 'Роль'; Sheet.Cells(StartRow,3).Value = 'Сотрудник'; Sheet.Cells(StartRow,4).Value = 'Дата'; Sheet.Cells(StartRow,5).Value = 'Виза'; Sheet.Cells(StartRow,6).Value = 'Комментарий'; Sheet.Cells(StartRow,7).Value = '123'; Sheet.Cells.VerticalAlignment = xlCenter; Sheet.Cells.HorizontalAlignment = xlCenter; Sheet.Cells.Font.Size = 10; Sheet.Columns(1).HorizontalAlignment = xlLeft Sheet.Cells(StartRow,1).ColumnWidth = 47.5; Sheet.Cells(StartRow,2).ColumnWidth = 17; Sheet.Cells(StartRow,3).ColumnWidth = 17; Sheet.Cells(StartRow,4).ColumnWidth = 17; Sheet.Cells(StartRow,5).ColumnWidth = 17; Sheet.Cells(StartRow,6).ColumnWidth = 17; Sheet.Cells(StartRow,7).ColumnWidth = 17; Sheet.Cells(StartRow,1).RowHeight = 38.25; Sheet.Range(Sheet.Cells(StartRow,1),Sheet.Cells(StartRow,7)).Font.Bold = true; Sheet.Range(Sheet.Cells(StartRow,1),Sheet.Cells(StartRow,7)).WrapText = true; Sheet.Range(Sheet.Cells(StartRow,2),Sheet.Cells(StartRow,7)).Interior.Color = 13949932; var Line = StartRow+1; Sheet.Cells(Line,2).Font.Bold = true; Sheet.Cells(Line,2).HorizontalAlignment = xlCenter; Sheet.Cells(Line,2).Interior.Color = 13949932; Sheet.Cells(Line,1).Value = ds('RoleName'); -- тут он мне выгружает данные из sq а не из wnd.. как выгрузить из wnd? Sheet.Cells(Line,2).Value = ''; Sheet.Cells(Line,4).Value = ''; Sheet.Cells(Line,5).Value = ''; ds.Close(); Excel.Visible = true; }
Здравствуйте!
По вашему последнему вопросу по Fast Report. Ошибка возникает потому, что в ваш скрипт нужно подключить скрипт, в котором реализована одна из используемых функций в вашем обработчике. Предполагаю, что это функция ShowReport(Report, FilterForm) она реализована scr_ReportUtils. Попробуйте подключить его в ваш скрипт.
С примером реализации выгрузки данных в Excel можете ознакомиться по этой ссылке.
Спасибо! FastReport стал открываться, но не так, как хотелось бы, поколдую..
Алла, о мой Бог, выручайте:)
ну никак не хочет отображать данные именно того окна, где кнопку сделал, фастрепорт открывается, но выводит мне все данные из этого раздела, а не именно из этого окна.
Проверьте, чтобы в FastReport использовался нужный вам датасет с корректной фильтрацией.
Более подробно, что-то порекоммендовать смогу, когда увижу вашу реализацию.
Проблема, как я и писала выше, заключается в том, что в отчете Fast Report вы используете датасет без фильтрации.
Если вам нужно в отчет выводить фильтуемые данные, тогда вместо функции ShowReport используйте ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode, GridDatasetIDs), где
FilteredDatasetCode - это название вашего датасета ('ds_VisesInDetailPD')
GridDatasetIDs - это массив ID записей, которые должны отображаться в отчете.
а ReportCode что такое, сейчас ругается, что он не определен?
ReportCode - это код сервиса Вашего отчета (fr_FastReport1)
GridDatasetIDs - вставил для теста 1 ID из базы
var ReportDataset = GetSingleItemByCode('ds_Report', 'fr_FastReport1'); var Columns = ReportDataset.SelectQuery.Items(0).Columns; DisableAllColumns(Columns); var FieldNames = new Array('Code', 'FilteredDatasetCode', 'FilterFormCode'); EnableColumnsByArray(Columns, true, FieldNames); ApplyDatasetIDFilter(ReportDataset,'DEA4D1B1-6161-451B-8A32-FBB1248CD256', true); ReportDataset.Open(); if (IsDatasetEmpty(ReportDataset)) { return; } var ReportUSICode = ReportDataset.Values('Code'); var FilteredDatasetCode = ReportDataset.Values('FilteredDatasetCode'); var FilterFormCode = ReportDataset.Values('FilterFormCode'); var Report = Services.GetNewItemByUSI(ReportUSICode); if (FilterFormCode) { var FilterForm = Services.GetNewItemByUSI(FilterFormCode); } ShowSelectedRecordsReport('fr_FastReport1', 'ds_VisesInDetailPD', '60E6526D-89EA-463C-869C-9016A20A767D'); }
Вместе всего вышеописанного кода нужно написать:
ShowSelectedRecordsReport('fr_FastReport1', 'ds_VisesInDetailPD', ['60E6526D-89EA-463C-869C-9016A20A767D']);
последний рывок, о простите меня далекого...
как мне теперь нужный массив ID задать из открытого окна?
var GridDatasetIDs = GetArrayByCollection(DataGrid.SelectedIDs);
DataGrid - это название DataGrid'а в вашей карточке для грида [Согласование].
вы просто фея кодинга%)
Спасибище!
последний вопрос, сейчас открывает только 1 строчку данных, что отоброжается в окне , а не все, что есть в окне.
Надо цикл написать на проход колличества записей?
можно пример, если не трудно!
или как-то по другому?
все, СПАСИБО!!!!!ОГРОМНОЕ!!!!!!!!!!
Осталось только group header сделать, но это надеюсь разберусь уже!
Все получилось!
И это только благодаря вам, нет слов, СпасибО!
Отличная новость.
Спасибо за положительный фидбек! :smile: