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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2012, 14:44   #1  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
печать отчета из кода
Здравствуйте.
Код не работает для отчетов запускаемых из класса RunBaseReport ,но работает для обычных отчетов.(т.е у тех MenuItem отчета где ObjectType=Report а не Class)
Пишет что SysReportRun Объект не инициализирован.
Подскажите пжл что нужно сделать чтобы заработало.
Спасибо.

PHP код:
Args args;
SysReportRun reportRun;
;
args.record(InventPrintLabel);
//new menuFunction('InventPrintLabel',MenuItemType::Output).run(args);//--работает
reportRun = new menuFunction('InventPrintLabel',MenuItemType::Output).create(args);//--error
reportRun.query().interactive(false);
reportRun.report().interactive(false);
reportRun.setTarget(PrintMedium::Printer);
reportRun.run(); 
Старый 01.11.2012, 17:25   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergicc Посмотреть сообщение
Подскажите пжл что нужно сделать чтобы заработало.
Сделать менюайтем непосредственно на Report.

Я так понимаю вы из кода хотите отчёт сразу послать на принтер без отображения пользователю диалога? Зачем же вам тогда вызывать класс RunBaseReport, который отвечает за диалог? Вызывайте сразу Report, только в args.caller() не забудьте положить проинициализированный нужными вам параметрами RunBaseReport.
Старый 02.11.2012, 08:49   #3  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
если не затруднит можно простой пример пжл.смущает то что мне нужно передавать таблицу в качестве параметра а не класс.
Старый 02.11.2012, 09:29   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergicc Посмотреть сообщение
смущает то что мне нужно передавать таблицу в качестве параметра а не класс.
Каким способом таблица передаётся в отчёт, когда отчёт вызывается через пользовательский интерфейс?
Старый 02.11.2012, 09:48   #5  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
через временную таблицу
Старый 02.11.2012, 10:18   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergicc Посмотреть сообщение
через временную таблицу
Можете привести код получения отчётом временной таблицы?
Старый 02.11.2012, 10:47   #8  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
X++:
public void init()
{
    //InventPrintLabel2   InventPrintLabel2;
    ;

    super();

    InventPrintLabel2 = element.args().caller();
    if (!InventPrintLabel2)
        throw error(Error::missingRecord(funcName()));

    //if (element.args().parmEnum() == ReportDesigns::form1)
    if (InventPrintLabel2.parmReportDesignsId() == ReportDesigns::form1)
        this.design('ReportDesign1');
    if (InventPrintLabel2.parmReportDesignsId() == ReportDesigns::form2)
        this.design('ReportDesign2');

    InventPrintLabel2.queryRun().setRecord(InventPrintLabel2.initTmpInventPrintLabel());
}
Старый 02.11.2012, 11:10   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Супер. На сколько я понимаю InventPrintLabel2 - это как раз тот самый RunBaseReport, на который смотрит MenuItem. Так?

Метод initTmpInventPrintLabel() не просто возвращает временную таблицу, он её сам и формирует. Да? Вы же хотите подсунуть отчёту уже сформированную временную таблицу. Всё правильно?
Старый 02.11.2012, 11:35   #10  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
стандарт.да.
да.
да.
зы.нексколько отклонилисть от моего 1 поста.
все-таки почему так работает (для отчета с RunBaseReport)
X++:
new menuFunction('InventPrintLabel',MenuItemType::Output).run(args);//--работает
а так нет
X++:
reportRun = new menuFunction('InventPrintLabel',MenuItemType::Output).create(args);//--error 
reportRun.run();
.
для отчетов вызванных напрямую,т.е без RunBaseReport работают прекрасно оба способа.
Старый 02.11.2012, 12:31   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если коротко, то из-за того что RunBase не является наследником ObjectRun.

MenuFunction.create() может создавать объекты только этой иерархии. Например FormRun или ReportRun.
Старый 02.11.2012, 14:12   #12  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
понятно.
видимо придется переписывать отчеты уже без RunBaseReport для получения посылке на печать сразу без диалогов.
к сожалению.
спасибо
Старый 02.11.2012, 14:14   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergicc Посмотреть сообщение
видимо придется переписывать отчеты уже без RunBaseReport для получения посылке на печать сразу без диалогов.
А вам почему так принципиально использовать MenuFunction для запуска отчёта? Понятно единообразие и всё такое, но класс то можно запустить и другим способом...
Старый 02.11.2012, 14:21   #14  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
нет уже не принципиально сейчас.принципиально получить возможность посылки на печать отчета без диалогов и предварительного просмотра по галочке Интерактивно
Старый 02.11.2012, 14:51   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В вашей ситуации я вижу следующий порядок действий:

1) Сделать наследник класса InventPrintLabel2, который вместо того чтобы самостоятельно заполнять данными временную таблицу, будет содержать метод для передачи ему уже готовой таблицы. Метод initTmpInventPrintLabel() наследника должен просто возвращать уже готовую таблицу.

2) Запускать отчёт напрямую без класса, а класс передавать в качестве параметра args.caller().

X++:
Args args; 
SysReportRun reportRun; 
InventPrintLabel2_Child InventPrintLabel2;
; 

InventPrintLabel2 = new InventPrintLabel2_Child();
InventPrintLabel2.parmTable(InventPrintLabel);
args.name(reportstr(MyReport)); 
args.caller(InventPrintLabel2)
reportRun = ClassFactory.ReportRunClass(args);
reportRun.query().interactive(false); 
reportRun.report().interactive(false); 
reportRun.setTarget(PrintMedium::Printer); 
reportRun.run();
Старый 02.11.2012, 15:35   #16  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
этот код я уже это пробовал сразу после вашего 1 ответа -возвращает ту же ошибку о пустом репортрун.
наследовать класс смысла нет ,т.к метод initTmpInventPrintLabel уже возращает таблицу просто вызываш и все InventPrintLabel2.initTmpInventPrintLabel() вместо parmTable
Старый 02.11.2012, 15:38   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Sergicc Посмотреть сообщение
этот код я уже это пробовал сразу после вашего 1 ответа -возвращает ту же ошибку о пустом репортрун.
Вы точно запускали отчёт, а не класс?
Старый 02.11.2012, 15:50   #18  
Sergicc is offline
Sergicc
Участник
 
25 / 10 (1) +
Регистрация: 24.08.2004
да
Старый 02.11.2012, 16:30   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Странно всё это. А на какой строчке кода вываливается ошибка?

Вот этот джоб у вас cработает?
X++:
static void JobTestReportRunClass(Args _args)
{
    Args args;
    SysReportRun reportRun;
    ;

    args = new args();
    args.name(reportstr(MyReport));
    reportRun = ClassFactory.ReportRunClass(args);
    info(reportRun.name());
}
Старый 02.11.2012, 16:47   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,654 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В вашей ситуации я вижу следующий порядок действий:

1) Сделать наследник класса InventPrintLabel2

2) Запускать отчёт напрямую без класса, а класс передавать в качестве параметра args.caller().
Вообще-то, есть еще 3 вариант. Добавить в класс InventPrintLabel2 дополнительный статический метод, который настроит вывод сразу на печать и не будет вызывать диалога.

Стандартный вызов класса, связанного с пунктом меню, идет через статический метод main(). Но никто не мешает сделать, скажем, статический метод print() и вызывать именно его. Без "обертки" в виде пункта меню.

X++:
// Вызов
args.record(InventPrintLabel); 
InventPrintLabel2_Child::print(args);

// Примерное содержимое метода InventPrintLabel2_Child::print(args);
static void print(Args _args)
{
    printJobSettings printJobSettingsLocal;
    InventPrintLabel2_Child inventPrintLabel2_Child = new InventPrintLabel2_Child();
    ;

    inventPrintLabel2_Child.makeReportRun();
    printJobSettingsLocal = inventPrintLabel2_Child.reportRun().printJobSettings();
    printJobSettingsLocal.setTarget(PrintMedium::Printer);
    inventPrintLabel2_Child.run();

}
Впрочем, в этом коде я не уверен в способе настройки вывода на принтер через printJobSettings. Тут надо проверять...

Ну, и 4 вариант - это передавать через args() признак того, что класс надо запускать без диалога. Т.е. метод main будет включать в себя то, что написано для print().
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отчеты и печать штрих кода KingPeas DAX: Программирование 18 24.09.2008 14:31
Печать нескольких экземпляров отчета по умолчанию. bum DAX: Функционал 3 17.06.2008 10:42
Двухсторонняя печать отчета Shirmin Oleg DAX: Программирование 6 18.10.2007 10:08
Печать отчета на несколько страниц Прокопьева DAX: Программирование 7 18.08.2006 07:40
Печать отчетов, как увеличить масштаб отчета? Hidden DAX: Прочие вопросы 8 30.12.2005 10:55

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

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

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