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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.12.2010, 15:17   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
В Стандартной АХ2009 не работает кнопка <Параметры> на диалоге класса унаследованного от RunBaseReport
Создаете класс от RunBaseReport. Временную таблицу. Создайте простенький отчет на базе этой временной таблицы. В методе Run класса заполните эту таблицу. И передайте отчету через queryRun.setRecord(tmpTable); reportRun.queryRun(queryRun);
Запустите класс. В появившемся диалоге есть кнопка <Параметры>. Нажмите ее и в открывшейся форме выберете какие-нибудь все возможные параметры на ней: "Канал вывода", Ориентация и т.д.(запомните их в уме). Нажмите ОК. Посмотрите сработали ли ваши параметры. И Запустите класс снова. Снова зайдите в кнопку <Параметры>. По идее все параметры должны сохраниться. Да, в форме они все те, какие вы установили в первый раз. Теперь поменяйте их на другие и запустите отчет. Отчет выйдет с первоначальными параметрами. И теперь сколько бы вы раз не запускали этот отчет, какие бы вы параметры не выбирали по кнопке <Параметры> у вас навсегда останутся первоначальные.
Кому лень создавать прикрепляю проект. Можете убедиться.

В классе RunBaseReport в методе Unpack() везде после

X++:
if (isSwappedFromServer)
            {
                printJobSettings = SysPrintOptions::newPrintJobSettingsOnServer(packedPrintJobSettings);
            }
            else
            {
                printJobSettings = new PrintJobSettings(packedPrintJobSettings);
            }
надо поставить this.makePrintJobSettings();

и в методе Pack() перед

if (xGlobal::hasClient())

надо поставить this.makePrintJobSettings();

заработает корректно.
AX2009 Roll 6.

Желаю всем удачи в такой Красивой, Удобной, Защищенной, Скоростной системе. И всех с Новым Годом.
Вложения
Тип файла: xpo SharedProject_TestReport.xpo (6.6 Кб, 520 просмотров)
Старый 30.12.2010, 15:45   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
ОФФ:
Не... надо так:
АХ 2009 - это
Красивая
Автоматизированная
Защищенная
Удобная
Скоростная

система

На правах предновогодней шутки С Новым годом!
__________________
Возможно сделать все. Вопрос времени
Старый 31.03.2011, 19:43   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Приведенное решение - это борьба со следствием, а не с причиной. Тем более, что выбор цели не отображается в диалоговой форме RunBaseReport и пользователь вынужден нажимать Ok, в надежде, что выбор где-то там сохранился.

Причина проблемы кроется в методе \Classes\RunBaseReportDialog\main

Там предварительно сделан вызов reportRun.prompt(). Таким образом, последующие настройки printJobSettings будут сделаны в кеше reportRun (отчета), а не в кеше RunBaseReport (класса).

Собственно, "лечение" заключается в том, чтобы просто передать настройки сделанные для ReportRun в настройки для RunBaseReport. Т.е. необходимо изменить код метода \Classes\RunBaseReportDialog\main следующим образом

X++:
static void main(Args args)
{
    RunBaseReportDialog reportDialog    = new RunBaseReportDialog(args.caller());
    RunBaseReport       runBaseReport   = args.caller().runbase();
    ReportRun           reportRun       = runBaseReport.reportRun();
    Report              report          = reportRun.report();
    boolean             oldInteractive;
    boolean             res;
    Dialog              dialog;
    // 31.03.2011, Maksi -->
    PrintJobSettings    printJobSettingsRunBase;
    PrintJobSettings    printJobSettingsReportRun;
    // 31.03.2011, Maksi <--
    ;
    
    // We must invoke the SysPrintForm via the report object so that we honor an prompt overrides.
    oldInteractive = report.interactive();
    report.interactive(true);
    res = reportRun.prompt();
    report.interactive(oldInteractive);
    if (!res)
        return;

    // 31.03.2011, Maksi -->
    // Перенос сделанного выбора из ReportRun в RunBaseReport
    printJobSettingsReportRun   = reportRun.printJobSettings();
    printJobSettingsRunBase     = runBaseReport.printJobSettings();
    printJobSettingsRunBase.unpackPrintJobSettings(printJobSettingsReportRun.packPrintJobSettings());
    // 31.03.2011, Maksi <--

    dialog = Dialog::getDialogFromCaller(args.caller());
    if (dialog)
    {
        dialog.updateServer();
    }
    runBaseReport.dialogUpdatePrinterSettings(dialog);
    reportDialog.run();
}

PS: Модификации методов pack/unpack в классе RunBaseReport для решения данной проблемы - не нужна
За это сообщение автора поблагодарили: mazzy (2), Pustik (2).
Старый 11.05.2011, 19:47   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как оказалось, в целом, идея решения правильная, но есть небольшая неточность. В системе Axapta отчет может быть запущен через пункт меню двумя способами:
  1. В пункте меню указывается класс-наследник от RunBaseReport, который в свойстве lastValueElementName() ссылается на нужный отчет
  2. В пункте меню напрямую указывается отчет
Так вот, если отчет явным образом "обернут" в класс-наследник от RunBaseReport, то приведенное решение корректно работает. Однако если отчет вызывается напрямую, то снова имеет старую проблему. Точнее, имеем "сломанный" стандартный код

Для решения проблемы необходимо, если отчет вызывается по первому варианту выполнить указанные действия, а если отчет вызывается по второму варианту, то ничего не делать. Оставить стандартный код.

Поскольку, если отчет напрямую указывается в пункте меню, то он автоматически "оборачивается" в класс-наследник от RunBaseReportStd, то код модифицируется следующим образом

X++:
static void main(Args args)
{
    RunBaseReportDialog reportDialog    = new RunBaseReportDialog(args.caller());
    RunBaseReport       runBaseReport   = args.caller().runbase();
    ReportRun           reportRun       = runBaseReport.reportRun();
    Report              report          = reportRun.report();
    boolean             oldInteractive;
    boolean             res;
    Dialog              dialog;
    // 31.03.2011, Maksi -->
    PrintJobSettings    printJobSettingsRunBase;
    PrintJobSettings    printJobSettingsReportRun;
    // 31.03.2011, Maksi <--
    ;

    // We must invoke the SysPrintForm via the report object so that we honor an prompt overrides.
    oldInteractive = report.interactive();
    report.interactive(true);
    res = reportRun.prompt();
    report.interactive(oldInteractive);
    if (!res)
        return;

    // 31.03.2011, Maksi -->
    // Если вызов произошел из класса или наследника RunbaseReportStd, то это означает прямой вызов отчета
    // без "обертки" в виде RunBaseReport
    // В этом случае ничего менять в коде не надо !
    // В противном случае необходимо передать сделанный выбор из ReportRun в RunBaseReport
    if (! SysDictClass::isEqualOrSuperclass(classIdGet(runBaseReport),classnum(RunBaseReportStd)))
    {
        printJobSettingsReportRun   = reportRun.printJobSettings();
        printJobSettingsRunBase     = runBaseReport.printJobSettings();
        printJobSettingsRunBase.unpackPrintJobSettings(printJobSettingsReportRun.packPrintJobSettings());
    }
    // 31.03.2011, Maksi <--

    dialog = Dialog::getDialogFromCaller(args.caller());
    if (dialog)
    {
        dialog.updateServer();
    }
    runBaseReport.dialogUpdatePrinterSettings(dialog);
    reportDialog.run();
}

Правда, следует заметить, что в связи с такой "двухпалубной" системой настроек, исходная неопределенность сохраняется. Т.е. по прежнему возможна рассинхронизация настроек для отчета и для класса RunBaseReport. Но уже не в такой критической форме

Если выполнить следующие действия
  1. Вызывать отчет, чтобы появилась форма настроек параметров отчета
  2. Через кнопку "Параметры" изменить настройки вывода отчета
  3. Сам отчет не запускать и нажать кнопку "Отмена"
  4. Снова вызывать отчет, чтобы появилась форма настроек параметров отчета
Как и положено, раз отчет предварительно не запускался, цель вывода отчета осталась старая. Какая и была при первоначальном запуске. Однако если нажать кнопку "Параметры", то увидим, что настройки, сделанные для отчета сохранились!

Собственно, так и должно быть. Ведь кеш отчета был сохранен сразу же по закрытии формы "Параметры" еще до того, как было принято решение не печатать отчет.

В принципе, ничего страшного, ведь при печати будут использованы настройки RunBaseReport, а не самого отчета. Проблемы могут быть только если один и тот же отчет может печататься разными способами. Как напрямую, так и через "обертку" RunBaseReport.

Но в данном случае - это не настолько критично, поскольку настройки кеша самого отчета в данной связке выступают в подчиненной роли.
За это сообщение автора поблагодарили: evv (1), Logger (5), gl00mie (5).
Теги
ax2009, bug, bug report, ошибка, report

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Метод "version" не поддерживается интерфейсом Automation COM-объекта класса "<неизвестно>". Poleax DAX: Администрирование 2 02.11.2010 15:25
АХ2009: Print Medium (Канал вывода) у RunBaseReport отчетов DTD DAX: Программирование 3 23.06.2010 18:08
Как посмотреть параметры коннекта АОС -> SQL ? egorych DAX: Администрирование 2 28.08.2007 13:39
Параметры отчета в RunBaseReport Mystery DAX: Программирование 20 14.04.2004 13:13
Параметры почты - не работает... soin DAX: Функционал 3 09.01.2004 01:00

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:44.