Изменение формы вывода при выводе на печать.

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

Нравится

35 комментариев

Для этого нужно внести изменения в печатную форму. Перейдите в дизайнер отчета и над MasterData добавьте GroupHeader. В него добавьте поле, по которому вам нужна группировка - в данном случае это поле 'Комментарий'.

вы имеете в виду здесь:

Да, абсолютно верно.

что-то не получается вывести в шапку, постоянно ругается, что некорректный GroupHeader., где именно необходимо название столбца пописывать?

Ругается, потому что нужно выбрать не только название датасета, но и поля, по которому нужно группировать (см. файл во вложении).
Чтобы выбрать название поля нужно связать датасет FastReport с датасетом в конфигурации Terrasoft.


эта ошибка из-за этого - "Чтобы выбрать название поля нужно связать датасет 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);


Просто, если я нажимаю принт, то открывается родительская форма(1 пост мой), и если я нажимаю "Дизайн" то я начинаю изменять родительскую форму, которая является для всех одной при нажатии на кнопку принт.

По нажатию на кнопку 'Печать' отчеты формируются автоматически по записям реестра. Это является базовой функциональностью.

Если вы хотите отчет с группировкой, то для этого нужно разработать собственный отчет 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 использовался нужный вам датасет с корректной фильтрацией.
Более подробно, что-то порекоммендовать смогу, когда увижу вашу реализацию.

при нажатии на это:

открывается сразу fr_FastReport1 с десятками страниц данных, а должно быть только по 3 строкам соответственно, которые отображаются в окне над кнопкой.
вот по всей видимости неправильный fr_:

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:

Показать все комментарии