08.04.2008, 17:09 | #1 |
Участник
|
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm?
Добрый день!
Задача такая: есть таблица и отчёт (report) который делается по одной записи. В таблице есть поле printed означающее, что отчёт по этой записи был отпечатан. Я пытаюсь в форме SysPrintForm как-нибудь получить хандлер на отчёт если пользователь нажал Печать в просмотрщике отчётов, а потом в этой же форме на CloseOk - если был выбран принтер - то проапдейтить поле printed. Но проблема в том - что args.caller() - в данном случае - это просто PrintJobSettings и я никак не могу получить никакой завязки на сам отчёт.... В случае если пользователь не просматривает отчёт, а сразу выбирает печать на принтер - то всё ОК - args.caller().runbase() - это класс диалога отчёта, но если печатает из просмотрщика - не могу получить хоть какую завязку на отчёт... AX30 |
|
09.04.2008, 15:00 | #2 |
Участник
|
Не понял вашего вопроса. Зачем вам "завязка на отчёт"? Отчёт служит только для вывода информации! Вам наверное нужно получать позицию курсора на таблице?
__________________
PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. |
|
09.04.2008, 15:25 | #3 |
MCTS
|
Цитата:
Отчёт служит только для вывода информации
В таком случае класс SysPrintOptions кромсать надо (запоминать RecId соответствующей таблицы и только для этого отчёта), а это не есть карошо. Всё сказанное imo
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
09.04.2008, 17:25 | #4 |
Участник
|
именно!
А что можно добавить в SysPrintOptions ? этот вроде только апдейтит PrintJobSettings... кстати у printJobSettings - есть метод ReportRun() - но в моём примере - он всегда null когда printjobsettings в sysprintforme. возможное решение - это использовать print archive. прописать этому репорту чтоб автоматически копию в архив и потом смотртеть таблицу printJobHeader - был ли распечатан или нет.... |
|
09.04.2008, 17:51 | #5 |
MCTS
|
Цитата:
что можно добавить в SysPrintOptions ?
Решение, правда, кривовастое какое-то выходит. Все эти городушки только из-за того, что после того, как мы отчёт отобразили на экране, связь с report'oм теряется (а теряется ли или нет? кто-нибудь может подтвердить или опровергнуть?) Может ещё у кого-нибудь есть какие-нибудь идеи?
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
09.04.2008, 18:07 | #6 |
Участник
|
В том то и дело что это всё вызывает системный класс ReportViewer автоматически, и вмешаться в процесс возможно только уже в SysPrintForm, когда в него поступил PrintJobsettings.... А SysPrintOptions?
в какой момент возможно ему подать ReCid - ведь в SysPrintForm - он инициализируется через new только для апдейта полученного PrintJobsettings. |
|
09.04.2008, 18:21 | #7 |
MCTS
|
Мне видится так:
в первый раз, когда отчёт оправляется на экран мы ещё можем достучаться к отчёту и вытянуть этот RecId. Далее запихиваем RecId в нашу новую переменную printedRecId, например, класса SysPrintOptions. Для этого в классе SysPrintOptions должна быть заведена эта новая переменная, быть прописана в localmacro и должен быть организован parmPrintedRecId() метод. Это (запихивание RecId) можно сделать в init() SysPrintForm. А когда уже печатаем отчёт, то в методе closeOk() X++: ......... switch (clientSysPrintOptions.parmTarget()) { case PrintMedium::Printer:: // printedRecId = clientSysPrintOptions.parmPrintedRecId(); // if(printedRecId) // markRecId(); break; ......... Примерно так.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
09.04.2008, 19:13 | #8 |
Участник
|
|
|
10.04.2008, 15:12 | #9 |
MCTS
|
Цитата:
так в SysPrintForm уже нету RecID! SysPrintForm сам не знает какой отчёт он печатает! Он только модифицирует PrintJobSettings!
Пиханье из init() SysPrintForm переносим в initReportRun() класса sysPrintOptions X++: void initReportRun(ReportRun _reportRun) { container pack; object obj; ; if (_reportRun) { if(_reportRun.report().name() == 'ArtPrice') { obj = _reportRun; info(obj.itemId()); } .......... В этом отчёте организовал метод itemId() X++: ItemId itemId() { return 'blah_blah'; }
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
16.04.2008, 18:49 | #10 |
Участник
|
Цитата:
Сообщение от rkorchagin
Добрый день!
Я пытаюсь в форме SysPrintForm как-нибудь получить хандлер на отчёт если пользователь нажал Печать в просмотрщике отчётов, а потом в этой же форме на CloseOk - если был выбран принтер - то проапдейтить поле printed. Но проблема в том - что args.caller() - в данном случае - это просто PrintJobSettings и я никак не могу получить никакой завязки на сам отчёт.... AX30 printJobSettings.mailSubject("любые текстовые данные"); а потом в форме SysPrintForm их получить типа X++: Object object = args.caller(); if (SysDictClass::isEqualOrSuperclass(classIdGet(object), classNum(PrintJobSettings))) { my_printJobSettings = object; } проверить если my_printJobSettings.mailSubject() = "чемуто" ставить галку зы. имхо это криво но работать должно
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
17.04.2008, 11:59 | #11 |
Участник
|
Цитата:
вы можете в отчете заполнить какиенибудь данные в PrintJobSettings например
printJobSettings.mailSubject("любые текстовые данные"); а потом в форме SysPrintForm их получить А в общем всё решилось тем что на самом деле клиенту всё равно печатал ли кто отчёт или нет - а просто распечатать через диалог за конкретную дату все репорты и вот уже тем записям, по которым отчёты что печатались через диалог, обновить printed. Спасибо всем! |
|