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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2013, 13:21   #1  
Pat4kord is offline
Pat4kord
Участник
 
23 / 10 (1) +
Регистрация: 13.01.2013
Адрес: Россия
SysReportRun и tmpTable
AX 2009 SP1

Начал смотреть возможность интерактивного вызова отчета при нажатии к примеру на кнопку, не могу понять как возможно передать параметры временной таблице, которая является датасорсом отчета.

Код кнопки вызывающей отчет
X++:
Args args; 
SysReportRun reportRun; 
; 
args.record(TestTable); 
reportRun = classFactory.formRunClass(args);

reportRun.query().interactive(false); 
reportRun.report().interactive(false); 
reportRun.setTarget(PrintMedium::Screen); 
reportRun.run();
Нигде не могу найти примеров как сформировать и подсунуть отчету уже готовую временную таблицу. Такая же задача обсуждалась здесь:
печать отчета из кода
у меня та же проблема fetch выдает ошибку и решения так никакого там и не посоветовали.
Если кто реализовывал такое покажите пример кода класса унаследованного от SysReportRun и методов отчета, что бы хоть понять как вообще такое должно работать.
Старый 15.03.2013, 13:53   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
X++:
reportRun.queryRun().setRecord(tmpTable);
Старый 15.03.2013, 13:57   #3  
Pat4kord is offline
Pat4kord
Участник
 
23 / 10 (1) +
Регистрация: 13.01.2013
Адрес: Россия
Я так и делал в таком случае на методе fetch() возникает ошибка объект не инициализирован, хотя просматриваю отладчиком в переданной временной таблице данные есть.
Старый 15.03.2013, 14:22   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А reportRun.init() вы вызываете?
Старый 15.03.2013, 14:29   #5  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Поясните про args...
Он вроде как описан в переменных, но вроде как не проинициализирован...
Типа args = new args()...
По идее умирать должно еще при args.record(TestTable);
Если тока при этом AX не пользует какой-то другой args... но при компиляции должно ругаться что такая вещь есть во внешнем контексте.
Старый 15.03.2013, 14:36   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от ansoft Посмотреть сообщение
Поясните про args...
Он вроде как описан в переменных, но вроде как не проинициализирован...
Типа args = new args()...
По идее умирать должно еще при args.record(TestTable);
Ха... Да, все верно... это не может работать. Должна быть ошибка. (runtime, не компиляции). Возможно кэш... система выполняет не тот код который вам показывает
Попробуйте презайти, почистить кэш.
Старый 15.03.2013, 15:04   #7  
Pat4kord is offline
Pat4kord
Участник
 
23 / 10 (1) +
Регистрация: 13.01.2013
Адрес: Россия
Попробую привести полный пример кода
Код кнопки
X++:
void clicked()
{
    Args args;
    SysReportRun reportRun;
    ;
    
    args = new Args();
    args.record(CreditTable);
    args.name(reportstr(ReportGraphLoan));
    
    reportRun = ClassFactory.reportRunClass(args);
    reportRun.query().interactive(false);
    reportRun.report().interactive(false);
    reportRun.setTarget(PrintMedium::Screen);
    
    reportRun.run();
}
Класс создающий таблицу и возвращающий таблицу
X++:
public tmpGraphLoanLines buildLines(CreditTable _ct)
{
    tmpGraphLoanLines tmpLoanLines;
    int Months;
    Counter counter;
    TransDate transDate;
    Amount summDebet, sumPercent, summResponsible;
    WW_DateDiff dateDiff = new WW_DateDiff();
    ;

    ct = _ct;
    Months          = (year(ct.DateEnd)*12+mthOfYr(ct.DateEnd)) - (year(ct.DateBegin)*12+mthOfYr(ct.DateBegin));
    summDebet       = ct.SummCredit / Months;
    summResponsible = ct.SummCredit;

    tmpLoanLines.clear();

    for(counter = 1; counter <= Months; counter++)
    {
        transDate       = dateDiff.DateAddMonths(counter, ct.DateBegin);
        if (counter > 1)  summResponsible -= summDebet;
        sumPercent      = summResponsible * ct.Percents / 100 / 12;

        tmpLoanLines.TransDate   = transDate;
        if(counter == Months) tmpLoanLines.TransDate = ct.DateEnd;
        tmpLoanLines.SummPayment         = summDebet;
        tmpLoanLines.SumPaymentPercent   = sumPercent;
        tmpLoanLines.SummPaymentTotal    = tmpLoanLines.SummPayment + tmpLoanLines.SumPaymentPercent;
        tmpLoanLines.insert();
    }

    return tmpLoanLines;
}
Метод init() отчета
X++:
public void init()
{
    ;

    buildGraphLoan = new G_BuildGraphLoan();

    ct = element.args().record();
    element.query().dataSourceTable(tablenum(CreditTable)).addRange(fieldnum(CreditTable, Cash_CreditId)).value(strfmt('%1', ct.Cash_CreditId));
    
    super();
}
Метод отчета fetch()
X++:
public boolean fetch()
{
    boolean ret;

    this.queryRun().setRecord(buildGraphLoan.buildLines(ct));

    ret = super();

    return ret;
}
Вот как- то так, сори до этого писал по памяти, решил прям из проекта скопировать, на методе fetch() говорит объект не инициализирован.
Старый 15.03.2013, 15:17   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
у вас объект buildGraphLoan инициализирутся в методе init, но метод этот вы не вызываете. Добавьте перед reportRun.run()
X++:
reportRun.init()
Старый 15.03.2013, 15:25   #9  
Pat4kord is offline
Pat4kord
Участник
 
23 / 10 (1) +
Регистрация: 13.01.2013
Адрес: Россия
Добавил, все равно говорит объект не инициализирован, останавливается именно на
методе fetch() на строке this.queryRun().setRecord(tmp);
Старый 15.03.2013, 15:42   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Хм. Т.е. сам queryRun не инициализирован что ли? Проинициализировать его можно попробовать так:
X++:
this.queryRun(new QueryRun(this.query()));
Хотя странно всё это. По идее он сам должен так инициализироваться.
Старый 15.03.2013, 15:48   #11  
Pat4kord is offline
Pat4kord
Участник
 
23 / 10 (1) +
Регистрация: 13.01.2013
Адрес: Россия
Я только что прошагав отладчиком пришел к этому же выводу вот только попытавшись его инициализировать он выдал на этой строке
this.queryRun(new QueryRun(this.query())); ошибку что он не инициализирован.
Старый 15.03.2013, 16:38   #12  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Чуствую не хватает reportRun._initParmDefault();
Старый 15.03.2013, 16:44   #13  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Нужны вызовы инициализации аналогичные initParmDefault , которые проделывает стандартный класс RunbaseReportStd (RunBaseReport)... думается в этом направлении надо смотреть
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
tmpTable mandatory field Kent DAX: Программирование 2 01.10.2009 15:11
Проблема с LedgerJournalTrans Alexanderrrr DAX: Программирование 14 23.09.2009 13:42
Отчеты,fetch CRASH_505 DAX: Программирование 14 19.09.2008 17:16
tmpTable+Cursor= Error.... bucken DAX: Программирование 18 10.12.2004 22:06
tmpTable Novice DAX: Программирование 2 26.09.2003 11:26

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

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

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