AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.06.2019, 10:03   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Как узнать, что отчет печатается на принтер ?
AX 2009
Есть конкретный Report (в узле АОТ - Reports). Как можно в коде этого Report узнать, что он сейчас печатается на принтер ?
Задача - предотвратить повторную печать именно на принтер или не предотвращать, но логировать повторные случаи печати.
Это нужно чтобы знать - был ли документ повторно взят в работу. Report печатается как из кода, так и пользователями по кнопке. Надо либо запретить печать, либо логировать, если отчет печатается второй раз. Но выводить отчет на экран отчет можно сколько угодно - вывод на экран не надо логировать или запрещать.
Зачем нужно такое ограничение? Принтер стоит в другом отделе. На него идет печать из разных отделов, и сотрудники обрабатывают все бумажки, которые на нем выходят. Если отчет будет отправлен на принтер повторно, то документ начнут обрабатывать повторно.
На какой именно принтер отчет был отправлен - неважно. Важно знать, что именно на принтер.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 10:21   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.

Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования.

Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати.
Старый 20.06.2019, 10:21   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Можно было был в методах отчета fetch или run или print написать проверку типа if (element.printJobSettings().getTarget == PrintMedium::Printer)
Но эти методы срабатывают, если пользователь вывел отчет на экран. А когда пользователь после этого нажимает кнопку печати, то повторно эти методы не вызываются.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 10:25   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вы же не сможете проконтролировать/отследить печать отчёта после того как он уже выведен на экран.

Может быть просто как-то визуально различать печатные версии, которые должны отправиться в работу, и версии тестовые/черновые, которые только посмотреть на экране. И программно не разрешать просто так повторно печатать рабочую версию. Или печатать слово КОПИЯ в случае повторного формирования.

Менять поведение программы в зависимости от того какой канал вывода для отчёта выбран, мне кажется не очень логично. Я бы добавил на диалог отчёта дополнительный параметр, чтобы пользователь мог явно указать для чего он формирует отчёт. И все проверки тогда делать на основании этого параметра, а не на основании параметров печати.
Спасибо, я подумаю насчет дополнительного параметра при печати пользователем отчета. Но это организационное решение, и плюс человеческий фактор. И опять останется лазейка для повторной печати.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 11:26   #5  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,200 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Если кому-то очень надо, то лазейку найдет всегда. Например, сделает скриншот с выведенного на экран репорта и отправит скриншот на принтер. И с этим вы уже ничего не сделаете. Здесь нужно понимать, в чем цель ограничения: исключить получение несанкционированной копии отчета для передачи его кому-то, или тривиальная экономия бумаги и ресурса принтера.
Старый 20.06.2019, 12:27   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Вы слишком все усложняете. В данном случае пользователи - это биороботы, которые не думают, и ничего не решают, и ни в чем не заинтересованы. Они просто могут ошибиться и повторно распечатать документ.
Документы не юридические, чисто для внутреннего пользования.
У людей нет времени что-то анализировать и проверять. И искать выгоду.
Они работают быстро и монотонно.

И это не экономия бумаги. Просто повторно напечатанная бумажка вызывает сбои в работе людского конвейера.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 12:48   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сохраняйте факт печати для каждого документа в системе. В случае попытки повторной печати предпринимайте нужные вам действия: выводите предупреждение пользователю, либо жёстко блокируйте, либо печатайте документ с дополнительным маркером КОПИЯ
Старый 20.06.2019, 13:16   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
А как поймать факт печати на принтер?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 13:21   #9  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Нашел место, где можно повеситься (в смысле отловить печать): форма SysPrintForm, метод closeOk
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.06.2019, 14:32   #10  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Нашел место, где можно повеситься (в смысле отловить печать): форма SysPrintForm, метод closeOk
но там нет ссылки на сам отчет, насколько я понимаю?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 20.06.2019, 14:47   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
если в ClassFactory.createReportViewer() сразу после super() добавить
X++:
if (ret.printJobSettings().getTarget() == PrintMedium::Screen)
    {
        ret.printJobSettings().fileName(_reportRun.name());
    }
тогда в форме SysPrintForm можно уже поймать название отчета и от этого уже плясать. Это как пример.А так, в этой форме объект printJobSettings.ReportRun(), который как объект определяется в методе init() там пустой с точки зрения ссылки на отчет.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 20.06.2019 в 14:54.
За это сообщение автора поблагодарили: Ace of Database (5), gl00mie (3).
Старый 20.06.2019, 17:07   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Гениальный совет! И еще для случая, когда печатается сразу на принтер без предварительного просмотра, в том числе из кода, добавить в нужный отчет код if (element.printJobSettings().getTarget == PrintMedium::Printer).
А ваш совет использовать для случаях, когда печатается пользователем через предварительный просмотр.
И внутри двух этих кусков кода вызывать один и тот же обработчик.
Отчет печатается из многих мест Аксапты, из кода и пользователями вручную.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как из SSRS-отчета узнать в каком VS Model Project реализован этот отчет? mazzy DAX: Программирование 9 27.06.2014 10:50
Основной принтер . Ах 2009 Rimantas DAX: Программирование 3 12.05.2014 10:53
Отчет по сроку годности ena_ax DAX: Функционал 1 20.10.2009 13:04
Вписать динамический отчет в страницу (DAX 4.0) Qaz Qwerty DAX: Программирование 2 17.07.2008 05:46
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:45.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.