Из отфильтрованного датасета получить отчет аналогичный кнопке Печать в реестре записей

Что-то "потух" я и не могу сообразить:
Как из отфильтрованного датасета получить отчет аналогичный кнопке Печать в реестре записей (то есть fr_DataGrid).
Типа функцию BasePrintDataset(Dataset){}

сделал простейшим образом:

        var Report = Services.GetNewItemByUSI('fr_DataGrid');
        SetAttribute(Report, 'Dataset', dlData.Dataset);
        ShowReport(Report);

получил (дебаггер не помог отловить проблему :sad: ):

Нравится

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

Пытаюсь передать параметры в функцию:

function ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, WorkspaceName)

таким образом (вызываю из wnd_TasksGridArea):

	var ActionMenuItem = new Object();
	ActionMenuItem.Tag = '{5BEA8949-1F2F-4550-9FA4-4BB6140ECD1D}';
	ActionMenuItem.ParentWindow = Self.ParentWindow;
	var GridDataset = dlData.Dataset;
	var DataGrid = Self.ParentWindow.ComponentsByName('grdData'); 
	var WorkspaceName = 'wnd_TasksWorkspace';
	ReportMenuItemExecute(ActionMenuItem, GridDataset, DataGrid, WorkspaceName);	

но та же ошибка

Image and video hosting by TinyPic

то есть не хватает каких-то параметров в передаваемых объектах :sad:

AlexLS, к сожалению, не получится так просто вывести отчет, аналогичный кнопке "Печать" в реестре записей.
Так как сам отчет fr_DataGrid пустой, его наполнение и формирование структуры выполняется динамически на уровне ядра, в зависимости от реестра, из которого вызывается.
Т.е. чтобы реализовать аналогичную функциональность из конфигурации, нужно прописать всю логику, которая обрабатывает кнопку в ядре.
В чем заключается Ваша задача, возможно достаточно будет создать собственный отчет FastReport и вызывать его в нужный момент для заданной выборки данных?

"Бондарь Наталия" написал:

В чем заключается Ваша задача, возможно достаточно будет создать собственный отчет FastReport и вызывать его в нужный момент для заданной выборки данных?


Задача в том чтобы печатать реестр записей (как по кнопке Печать, то есть набор данных и колонок в отчете зависит от грида) с дополнительными динамическими фильтрами к датасету
(пример: если пользователь Иванов, то вывести только за текущий день, если вчера была суббота или воскресение, то выводить в превьюер реестр за пятницу и т.п.)
, как я понимаю надо создавать некую копию датасета, чтобы не повредить представление в текущем реестре (то есть чтоб юзер продолжал видеть текущую страницу реестра и текущую выделенную запись и набор данных в реестре остался тот же)

"Бондарь Наталия" написал:В чем заключается Ваша задача, возможно достаточно будет создать собственный отчет FastReport и вызывать его в нужный момент для заданной выборки данных?

наверно основное это понять как динамически сформировать набор колонок :confused:

да, еще юзерам хочется "выделять записи", но при перелистывании на другие страницы выделения снимаются и остается выделение только в текущей странице. Это толи проблемка только в моей конфигурации, то ли глобальная проблема в террасофте :confused:

"AlexLS" написал:Задача в том чтобы печатать реестр записей (как по кнопке Печать, то есть набор данных и колонок в отчете зависит от грида) с дополнительными динамическими фильтрами к датасету

Попробуйте реализовать задачу таким образом:
1. Создать новый экземпляр окна реестра:

var newgrd = Services.GetNewItemByUSI(wnd_AccountsGridArea);

2. Вызвать метод Prepare окна newgrd .
3. Чтобы реестр созданного экземпляра окна содержал тот же набор колонок, что и реестр записей раздела, который нужно печатать, следует выполнить сериализацию:

var XMLData = SerializeXMLData(окно реестра записей раздела);
DeserializeXMLData(newgrd, XMLData);

4. Наложить требуемые фильтры на датасет реестра окна newgrd.
5. Вызвать реестр окна newgrd на печать используя метод Print():

"AlexLS" написал:да, еще юзерам хочется "выделять записи", но при перелистывании на другие страницы выделения снимаются и остается выделение только в текущей странице. Это толи проблемка только в моей конфигурации, то ли глобальная проблема в террасофте

Это не ошибка, а базовая логика работы реестра при переходе между страницами. При переходе перерисовывается грид и фокус изменяется (если переходите на страницу вперед - фокус устанавливается на первую запись на странице, если переходите назад - фокус устанавливается на последнюю запись на странице).

"Бондарь Наталия" написал:сериализацию:

var XMLData = SerializeXMLData(окно реестра записей раздела);
DeserializeXMLData(newgrd, XMLData);


Наталья, прошу прощения за "темноту", я правильно понимаю что это по сути копи-паст объектов???

"Бондарь Наталия" написал:Попробуйте реализовать задачу таким образом:

Наталья, выполнил без п.4, но к сожалению, получил сообщение об ошибке:
The following errors ) have occurred:
could not convert variant of type (null) into type (boolean)

"AlexLS" написал:Наталья, прошу прощения за "темноту", я правильно понимаю что это по сути копи-паст объектов???

да

"Бондарь Наталия" написал:Наталья, выполнил без п.4, но к сожалению, получил сообщение об ошибке

Вложите, пожалуйста, код либо сервисы.

Нашел свою ошибку.
Теперь выводит пустой отчет, хотя, как я понял должен выводить копию так же как и в скопированном реестре :sad:
Код в scr_TasksGridArea (новая кнопка Print в гридареа):

function btnPrintOnClick(Control) {
	var newgrd = Services.GetNewItemByUSI('wnd_TasksGridArea');
	newgrd.Prepare();
	var XMLData = SerializeXMLData(Control.ParentWindow);
	DeserializeXMLData(newgrd, XMLData);
	newgrd.ComponentsByName('grdData').Print();
}

Попробую сам разобраться :wink:

Наталья ВАМ большое спасибо.

AlexLS, не за что. Напишите, пожалуйста, если не получится разобраться и понадобится помощь.

"Бондарь Наталия" написал:

AlexLS, не за что. Напишите, пожалуйста, если не получится разобраться и понадобится помощь.


Наталья, здравствуйте! В версии 3.4 всё работает "на ура!", а вот в версии 3.3.2.120 на методе Print() ошибка:

Microsoft JScript runtime error: Object doesn't support this property or method

с попыткой сделать Export(), та же проблема. Что-то можно сделать? Или только обновляться :biggrin:

AlexLS, в последних сборках 3.3.2 (последняя на сегодняшний день 3.3.2.305) вынесены методы Print() и Export() для компонента DataGrid.
Обратитесь в службу технической поддержки для получения последней сборки.

"Бондарь Наталия" написал:

AlexLS, в последних сборках 3.3.2 (последняя на сегодняшний день 3.3.2.305) вынесены методы Print() и Export() для компонента DataGrid.

Обратитесь в службу технической поддержки для получения последней сборки.


Наталья, здравствуйте! Запустил 305 билд, но так и не увидел работающих Print() и Export(), ошибка:

Microsoft JScript runtime error: Object doesn't support this property or method

AlexLS, проверила - методы вынесены в конфигурацию, но обработки вызова нет. Передала запрос в департамент разработки для внесения правок.

"Бондарь Наталия" написал:

AlexLS, проверила - методы вынесены в конфигурацию, но обработки вызова нет. Передала запрос в департамент разработки для внесения правок.


Спасибо, Наталья! Очень жду Ваш ответ, так как альтернативных путей решения задачи пока не придумал :sad:

В версии 3.3.2 перед вызовом метода Print необходимо вызвать метод Build. Например:

var ParentWindow = Control.ParentWindow;
var PrintArea = Services.GetNewItemByUSI(ParentWindow.USI);
var XMLData = SerializeXMLData(ParentWindow);
DeserializeXMLData(PrintArea, XMLData);
PrintArea.Prepare();
var grd = PrintArea.ComponentsByName('grdData');
grd.Build();
grd.Print();

"Бондарь Наталия" написал:
#20 Бондарь Наталия 5 февраля 2014 – 9:56

В версии 3.3.2 перед вызовом метода Print необходимо вызвать метод Build

Наталия, а метод Export() таким же образом будет работать?

Да, таким же образом.

"Бондарь Наталия" написал:Да, таким же образом.

Наталья, здравствуйте! К сожалению, набор колонок при экспорте (и при печати) этим методом не совпадает с набором колонок в реестре (ДАЖЕ при перезапуске TS). Как-то можно исправить?

Напомню TS 3.3.2.305

AlexLS, вопрос рассматривается департаментом разработку. Как только получу ответ - сообщу Вам.

"Бондарь Наталия" написал:

AlexLS, вопрос рассматривается департаментом разработку. Как только получу ответ - сообщу Вам.


Наталья, очень благодарен и надеюсь на скорейшее решение!

AlexLS, вместо предложенного ранее используйте следующий код:

var ParentWindow = Control.ParentWindow;
                var XMLStorage = GetNewXMLStorage();
                XMLStorage.InitRootNode(xdnnRootNode);
                var RootNode = XMLStorage.RootNode;
                ParentWindow.Serialize(RootNode);
                var PrintArea = Services.CreateItem('Window');
                PrintArea.Deserialize(RootNode);
                var grd = PrintArea.ComponentsByName('grdData');
                grd.Build();
                grd.Print();

"Бондарь Наталия" написал:

AlexLS, вместо предложенного ранее используйте следующий код


Наталия, я правильно понимаю: Первая строка Вашего кода уже не нужна, но при этом появляется некая переменная "xdnnRootNode" (надеюсь террасофт ее "знает")?

Если под первой строкой Вы имеете в виду

var ParentWindow = Control.ParentWindow;

тогда нужна. К ParentWindow происходит обращение в 5 строке.
Что касается xdnnRootNode, переменная объявлена в scr_UserReportConsts.

"Бондарь Наталия" написал:

Если под первой строкой Вы имеете в виду


Да, Наталия, именно это. Большое спасибо за Ваши разъяснения!

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