15.03.2013, 13:21 | #1 |
Участник
|
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 |
Участник
|
X++: reportRun.queryRun().setRecord(tmpTable); |
|
15.03.2013, 13:57 | #3 |
Участник
|
Я так и делал в таком случае на методе fetch() возникает ошибка объект не инициализирован, хотя просматриваю отладчиком в переданной временной таблице данные есть.
|
|
15.03.2013, 14:22 | #4 |
Участник
|
А reportRun.init() вы вызываете?
|
|
15.03.2013, 14:29 | #5 |
Участник
|
Поясните про args...
Он вроде как описан в переменных, но вроде как не проинициализирован... Типа args = new args()... По идее умирать должно еще при args.record(TestTable); Если тока при этом AX не пользует какой-то другой args... но при компиляции должно ругаться что такая вещь есть во внешнем контексте. |
|
15.03.2013, 14:36 | #6 |
Участник
|
Цитата:
Попробуйте презайти, почистить кэш. |
|
15.03.2013, 15:04 | #7 |
Участник
|
Попробую привести полный пример кода
Код кнопки 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; } 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(); } X++: public boolean fetch() { boolean ret; this.queryRun().setRecord(buildGraphLoan.buildLines(ct)); ret = super(); return ret; } |
|
15.03.2013, 15:17 | #8 |
Участник
|
у вас объект buildGraphLoan инициализирутся в методе init, но метод этот вы не вызываете. Добавьте перед reportRun.run()
X++: reportRun.init() |
|
15.03.2013, 15:25 | #9 |
Участник
|
Добавил, все равно говорит объект не инициализирован, останавливается именно на
методе fetch() на строке this.queryRun().setRecord(tmp); |
|
15.03.2013, 15:42 | #10 |
Участник
|
Хм. Т.е. сам queryRun не инициализирован что ли? Проинициализировать его можно попробовать так:
X++: this.queryRun(new QueryRun(this.query())); |
|
15.03.2013, 15:48 | #11 |
Участник
|
Я только что прошагав отладчиком пришел к этому же выводу вот только попытавшись его инициализировать он выдал на этой строке
this.queryRun(new QueryRun(this.query())); ошибку что он не инициализирован. |
|
15.03.2013, 16:38 | #12 |
Участник
|
Чуствую не хватает reportRun._initParmDefault();
|
|
15.03.2013, 16:44 | #13 |
Участник
|
Нужны вызовы инициализации аналогичные initParmDefault , которые проделывает стандартный класс RunbaseReportStd (RunBaseReport)... думается в этом направлении надо смотреть
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
tmpTable mandatory field | 2 | |||
Проблема с LedgerJournalTrans | 14 | |||
Отчеты,fetch | 14 | |||
tmpTable+Cursor= Error.... | 18 | |||
tmpTable | 2 |
|