Из отфильтрованного датасета получить отчет аналогичный кнопке Печать в реестре записей
Что-то "потух" я и не могу сообразить:
Как из отфильтрованного датасета получить отчет аналогичный кнопке Печать в реестре записей (то есть fr_DataGrid).
Типа функцию BasePrintDataset(Dataset){}
сделал простейшим образом:
SetAttribute(Report, 'Dataset', dlData.Dataset);
ShowReport(Report);
получил (дебаггер не помог отловить проблему ):
Нравится
Пытаюсь передать параметры в функцию:
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);
но та же ошибка
то есть не хватает каких-то параметров в передаваемых объектах :sad:
AlexLS, к сожалению, не получится так просто вывести отчет, аналогичный кнопке "Печать" в реестре записей.
Так как сам отчет fr_DataGrid пустой, его наполнение и формирование структуры выполняется динамически на уровне ядра, в зависимости от реестра, из которого вызывается.
Т.е. чтобы реализовать аналогичную функциональность из конфигурации, нужно прописать всю логику, которая обрабатывает кнопку в ядре.
В чем заключается Ваша задача, возможно достаточно будет создать собственный отчет FastReport и вызывать его в нужный момент для заданной выборки данных?
"Бондарь Наталия" написал:В чем заключается Ваша задача, возможно достаточно будет создать собственный отчет FastReport и вызывать его в нужный момент для заданной выборки данных?
Задача в том чтобы печатать реестр записей (как по кнопке Печать, то есть набор данных и колонок в отчете зависит от грида) с дополнительными динамическими фильтрами к датасету
(пример: если пользователь Иванов, то вывести только за текущий день, если вчера была суббота или воскресение, то выводить в превьюер реестр за пятницу и т.п.)
, как я понимаю надо создавать некую копию датасета, чтобы не повредить представление в текущем реестре (то есть чтоб юзер продолжал видеть текущую страницу реестра и текущую выделенную запись и набор данных в реестре остался тот же)
"AlexLS" написал:Задача в том чтобы печатать реестр записей (как по кнопке Печать, то есть набор данных и колонок в отчете зависит от грида) с дополнительными динамическими фильтрами к датасету
Попробуйте реализовать задачу таким образом:
1. Создать новый экземпляр окна реестра:
var newgrd = Services.GetNewItemByUSI(wnd_AccountsGridArea);
2. Вызвать метод Prepare окна newgrd .
3. Чтобы реестр созданного экземпляра окна содержал тот же набор колонок, что и реестр записей раздела, который нужно печатать, следует выполнить сериализацию:
var XMLData = SerializeXMLData(окно реестра записей раздела); DeserializeXMLData(newgrd, XMLData);
4. Наложить требуемые фильтры на датасет реестра окна newgrd.
5. Вызвать реестр окна newgrd на печать используя метод Print():
"AlexLS" написал:да, еще юзерам хочется "выделять записи", но при перелистывании на другие страницы выделения снимаются и остается выделение только в текущей странице. Это толи проблемка только в моей конфигурации, то ли глобальная проблема в террасофте
Это не ошибка, а базовая логика работы реестра при переходе между страницами. При переходе перерисовывается грид и фокус изменяется (если переходите на страницу вперед - фокус устанавливается на первую запись на странице, если переходите назад - фокус устанавливается на последнюю запись на странице).
"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(); }
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();
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();
Если под первой строкой Вы имеете в виду
var ParentWindow = Control.ParentWindow;
тогда нужна. К ParentWindow происходит обращение в 5 строке.
Что касается xdnnRootNode, переменная объявлена в scr_UserReportConsts.