20.06.2019, 10:03 | #1 |
Участник
|
Как узнать, что отчет печатается на принтер ?
AX 2009
Есть конкретный Report (в узле АОТ - Reports). Как можно в коде этого Report узнать, что он сейчас печатается на принтер ? Задача - предотвратить повторную печать именно на принтер или не предотвращать, но логировать повторные случаи печати. Это нужно чтобы знать - был ли документ повторно взят в работу. Report печатается как из кода, так и пользователями по кнопке. Надо либо запретить печать, либо логировать, если отчет печатается второй раз. Но выводить отчет на экран отчет можно сколько угодно - вывод на экран не надо логировать или запрещать. Зачем нужно такое ограничение? Принтер стоит в другом отделе. На него идет печать из разных отделов, и сотрудники обрабатывают все бумажки, которые на нем выходят. Если отчет будет отправлен на принтер повторно, то документ начнут обрабатывать повторно. На какой именно принтер отчет был отправлен - неважно. Важно знать, что именно на принтер.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 10:21 | #2 |
Участник
|
Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.
Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования. Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати. |
|
20.06.2019, 10:21 | #3 |
Участник
|
Можно было был в методах отчета fetch или run или print написать проверку типа if (element.printJobSettings().getTarget == PrintMedium::Printer)
Но эти методы срабатывают, если пользователь вывел отчет на экран. А когда пользователь после этого нажимает кнопку печати, то повторно эти методы не вызываются.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 10:25 | #4 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.
Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования. Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 11:26 | #5 |
Участник
|
Если кому-то очень надо, то лазейку найдет всегда. Например, сделает скриншот с выведенного на экран репорта и отправит скриншот на принтер. И с этим вы уже ничего не сделаете. Здесь нужно понимать, в чем цель ограничения: исключить получение несанкционированной копии отчета для передачи его кому-то, или тривиальная экономия бумаги и ресурса принтера.
|
|
20.06.2019, 12:27 | #6 |
Участник
|
Вы слишком все усложняете. В данном случае пользователи - это биороботы, которые не думают, и ничего не решают, и ни в чем не заинтересованы. Они просто могут ошибиться и повторно распечатать документ.
Документы не юридические, чисто для внутреннего пользования. У людей нет времени что-то анализировать и проверять. И искать выгоду. Они работают быстро и монотонно. И это не экономия бумаги. Просто повторно напечатанная бумажка вызывает сбои в работе людского конвейера.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 12:48 | #7 |
Участник
|
Сохраняйте факт печати для каждого документа в системе. В случае попытки повторной печати предпринимайте нужные вам действия: выводите предупреждение пользователю, либо жёстко блокируйте, либо печатайте документ с дополнительным маркером КОПИЯ
|
|
20.06.2019, 13:16 | #8 |
Участник
|
А как поймать факт печати на принтер?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 13:21 | #9 |
Участник
|
Нашел место, где можно повеситься (в смысле отловить печать): форма SysPrintForm, метод closeOk
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
20.06.2019, 14:32 | #10 |
Участник
|
но там нет ссылки на сам отчет, насколько я понимаю?
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
20.06.2019, 14:47 | #11 |
Участник
|
если в ClassFactory.createReportViewer() сразу после super() добавить
X++: if (ret.printJobSettings().getTarget() == PrintMedium::Screen)
{
ret.printJobSettings().fileName(_reportRun.name());
}
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 20.06.2019 в 14:54. |
|
|
За это сообщение автора поблагодарили: Ace of Database (5), gl00mie (3). |
20.06.2019, 17:07 | #12 |
Участник
|
Гениальный совет! И еще для случая, когда печатается сразу на принтер без предварительного просмотра, в том числе из кода, добавить в нужный отчет код if (element.printJobSettings().getTarget == PrintMedium::Printer).
А ваш совет использовать для случаях, когда печатается пользователем через предварительный просмотр. И внутри двух этих кусков кода вызывать один и тот же обработчик. Отчет печатается из многих мест Аксапты, из кода и пользователями вручную.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/ |
|
|
|