19.08.2008, 09:55 | #1 |
Участник
|
Получить значения контролов в ExecuteSection?
Доброго времени суток, уважаемые коллеги.
В ExecuteSection отчетов можно напрямую получать значения string-полей: ReportStringControl.eval(). Возможно ли нечто подобное для полей других типов (enum, real...)? Axapta 3.0 SP 3. |
|
19.08.2008, 10:56 | #2 |
Moderator
|
Да, что-то не видно ничего похожего у других типов контролов... А если просто читать значения из поля, которое прописано в DataField, или из метода, который прописан в DataMethod ? Да, получатся повторные вызовы для одной записи. Но если не критично по скорости и объемам данных, то вполне можно. Я сам так делал параллельный слив в Excel.
|
|
19.08.2008, 10:59 | #3 |
NavAx
|
Я написал что-то типа
X++: ReportIntegerControl intCtrl; switch(this.controlNo(i).controlType()) { case ReportFieldType::String: eval break; case ReportFieldType::Integer: intCtrl = this.controlNo(i); value = SalesLine( ).(intCtrl.dataField()); break; } P.S. Кстати, у меня тут есть маленький кусочек кода, который позволяет просто путём тупой его вставки в executesection любого отчета, получить аккуратную разграфленную таблицу, даже если в секции есть контролы переменной высоты. Никак руки не доходят причесать и выложить, а то метод, описанный на форуме мало того, что требует редактирования под каждый отчет, так еще и не до конца решает проблему.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 19.08.2008 в 11:03. |
|
19.08.2008, 11:12 | #4 |
Moderator
|
Цитата:
Где это описание, если не секрет? Что за тема? |
|
19.08.2008, 12:57 | #5 |
Участник
|
Цитата:
Сообщение от Gustav
Да, что-то не видно ничего похожего у других типов контролов... А если просто читать значения из поля, которое прописано в DataField, или из метода, который прописан в DataMethod ? Да, получатся повторные вызовы для одной записи. Но если не критично по скорости и объемам данных, то вполне можно. Я сам так делал параллельный слив в Excel.
Была задумка создать класс с возможностью вызова его метода из ExecuteSection a la class.send2excel(this). Похоже, настолько универсального решения не существует - для получения значений полей/методов таблицы нужно передавать в класс как минимум саму таблицу, а в пределах одной секции теоретически могут выводиться данные из нескольких ds. |
|
19.08.2008, 13:27 | #6 |
Злыдни
|
А если посомтреть в сторону ReportViewer, PDFViewer и classFactory.getViewer?
|
|
19.08.2008, 15:01 | #7 |
Участник
|
добавлю свои пять копеек
кусок кода из класса печати этикеток, преобразует репорт дизайн в EPL для печати напрямую этикеточный принтер X++: void addSection(ReportSection _reportSection, common _cursor) { ReportControl reportControl; ReportStringControl reportStringControl; SysDictClass classObj = new SysDictClass(classnum(ReportSection));// int childNodesCount; int i; ; childNodesCount = _reportSection.AOTchildNodeCount(); txt += "\nN\n"; for(i = 0; i < childNodesCount; i++) { reportControl = _reportSection.controlNo(i); if (! reportControl) continue; if (reportControl.controlType() == ReportFieldType::String) { reportStringControl = reportControl; if (reportStringControl.font() == "BC C128 Medium") { txt += "B" + this.position(reportControl.left100mm()/12, reportControl.top100mm()/12); this.addBarCode(reportControl, _reportSection, _cursor, classObj); txt += "\n"; continue; } } txt += "A" + this.position(reportControl.left100mm()/12, reportControl.top100mm()/12); switch (reportControl.controlType()) { case ReportFieldType::Text: this.addText(reportControl, _reportSection, _cursor, classObj); break; case ReportFieldType::String: this.addString(reportControl, _reportSection, _cursor, classObj); break; case ReportFieldType::Integer: this.addInteger(reportControl, _reportSection, _cursor, classObj); break; case ReportFieldType::Real: this.addReal(reportControl, _reportSection, _cursor, classObj); break; } txt += "\n"; } txt += "P1\n"; X++: void addString(ReportControl _reportControl, ReportSection _reportSection, common _cursor, SysDictClass _classObj) { ReportStringControl reportControl = _reportControl; str s; ; txt += this.font(reportControl.fontSize(), reportControl.bold(), reportControl.italic(), reportControl.font()); if (reportControl.dataField()) { s = _cursor.(reportControl.dataField()); } if (reportControl.dataMethod()) { s = _classObj.callObject(reportControl.dataMethod(), _reportSection); } s = strreplace(s, "\"","'"); txt += strfmt("\"%1\"", s); } могу весь класс выложить если кому интересно
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy |
|
Теги |
контрол, отчет |
|
|