|
08.02.2017, 23:35 | #1 |
Участник
|
AX2012, SSRS отчеты
Пытаюсь разобраться, как работать с SSRS отчетами в AX2012.
Есть SSRS-отчет, класс Controller, который его запускает, Contract с параметрами для отчета (с атрибутоми SSRS-отчета и UI Contract ) и UI Contract с диалогом для параметров. Я создал SSRS-отчет, задеплоил его, создал Contract, UI Contract, Controller, но при запуске не подтягивается диалог из UI Contract. Как Контроллер связан с Контрактом? |
|
09.02.2017, 01:01 | #2 |
Участник
|
Может быть все-таки UIBuilder?
Надо создать класс-расширение SysOperationAutomaticUIBuilder А в определении контракта в аттрибутах указать SysOperationContractProcessingAttribute(classStr(YourClassNameUIBuilder) А в определении контроллера указать в аттибутах SRSReportParameterAttribute(classstr(YourClassNameContract) Для простого добавления параметров UIBuilder не нужен, достаточно контракта |
|
|
За это сообщение автора поблагодарили: Logger (5). |
09.02.2017, 08:42 | #3 |
Участник
|
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: Logger (5), Ace of Database (2). |
09.02.2017, 10:54 | #4 |
Участник
|
я по этой книжке и пробую.
стр. 58: 1. Создал в VS SSRS : PktRdlItemTransList.ItemTransList 2. Controller: X++: class PktRdlItemTransController extends SRSReportRunController {} public static void main(Args args) { PktRdlItemTransController controller; controller = new PktRdlItemTransController (); controller.parmReportName(ssrsReportStr (PktRdlItemTransList, ItemTransList)); controller.parmArgs(args); controller.startOperation(); } 3. UIBuilder: X++: class PktRdlWarehouseUIBuilder extends SrsReportDataContractUIBuilder { DialogField dialogStatus; DialogField dialogFromDate; DialogField dialogToDate; } public void build() { PktRdlWarehouseContract pktRdlWarehouseContract; pktRdlWarehouseContract = this.dataContractObject() as PktRdlWarehouseContract; dialogStatus = this.addDialogField (methodStr(PktRdlWarehouseContract, parmStatus), pktRdlWarehouseContract); dialogFromDate = this.addDialogField (methodStr(PktRdlWarehouseContract,parmFromDate), pktRdlWarehouseContract); dialogToDate = this.addDialogField (methodStr(PktRdlWarehouseContract,parmToDate), pktRdlWarehouseContract); } public void postBuild() { PktRdlWarehouseContract pktRdlWarehouseContract; super(); pktRdlWarehouseContract = this.dataContractObject() as PktRdlWarehouseContract; dialogStatus = this.bindInfo().getDialogField (pktRdlWarehouseContract, methodStr(PktRdlWarehouseContract, ParmStatus)); dialogFromDate = this.bindInfo().getDialogField (pktRdlWarehouseContract, methodStr(PktRdlWarehouseContract, parmFromdate)); dialogToDate = this.bindInfo().getDialogField (pktRdlWarehouseContract, methodStr(PktRdlWarehouseContract, parmTodate)); } X++: [ DataContractAttribute, SysOperationContractProcessingAttribute (classstr(PktRdlWarehouseUIBuilder)) ] public class PktRdlWarehouseContract implements SysOperationValidatable { TransDate fromDate; TransDate toDate; InventtransferUpdateType status; } [ DataMemberAttribute('ToDate'), SysOperationLabelAttribute(literalStr("ToDate")) ] public ToDate parmToDate(ToDate _toDate = toDate) { toDate = _toDate; return toDate; } [ DataMemberAttribute('FromDate'), SysOperationLabelAttribute(literalStr("FromDate")) ] public FromDate parmFromDate(FromDate _fromDate = fromDate) { fromDate = _fromDate; return fromDate; } [ DataMemberAttribute('Status'), SysOperationLabelAttribute(literalStr("Status")) ] public InventTransferUpdateTye parmStatus(InventTransferUpdateTye _status = status) { status = _status; return status; } public boolean validate() { boolean isValid = true; if (fromDate && toDate && fromDate > toDate) { isValid = checkFailed("From date cannot be greater than to date"); } if (!fromDate) { isValid = checkFailed("From date must be filled in"); } if (!toDate) { isValid = checkFailed("To date must be filled in "); } return isValid; } SysOperationContractProcessingAttribute (classstr(PktRdlWarehouseUIBuilder)) как контролер связывается с отчетом - тоже понятно: controller.parmReportName(ssrsReportStr (PktRdlItemTransList, ItemTransList)); А вот как контроллер или отчет связывается с контрактом или UIBuilder - я не увидел. Правда на стр. 66 этойже книги я увидел, что контракт уже был реализован следующим образом: X++: [ SrsReportNameAttribute(ssrsReportStr (PktRdlItemTransList, ItemTransList)), SysOperationContractProcessingAttribute(classstr (PktItemTransUIBuilder), SysOperationDataContractProcessingMode:: CreateSeparateUIBuilderForEachContract) ] public class PktRdlItemTransListRdlContract extends SRSReportRdlDataContract { TransDate fromDate; TransDate toDate; #define.FromDate('FromDate') #define.ToDate('ToDate') } Сделал подобное - не помогло. Т.е. всеравно не понятно - как отчет призапуске понимает, что нужно брать именно этот контракт. В моем случает отчет не берет вообще никакой контракт. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
09.02.2017, 21:45 | #5 |
Участник
|
не забывай регулярно обновлять кеш и компилить CIL перед очередной пробой. также недурно влияет перезапуск и самого сервера ssrs.
вощим, встал ты на скользкую дорогу, полную невзгод и разочарований... но мы здесь, с тобой!
__________________
Felix nihil admirari |
|
10.02.2017, 08:56 | #6 |
Участник
|
в классе провайдера есть такой атрибут
X++: [
SRSReportParameterAttribute(classStr())
] |
|
21.02.2017, 13:43 | #7 |
Участник
|
Цитата:
Т.е. всеравно не понятно - как отчет призапуске понимает, что нужно брать именно этот контракт. В моем случает отчет не берет вообще никакой контракт.
X++: [SRSReportParameterAttibute(classstr(ClassDataContract))] class DataProvider extends SRSReportDataProviderBase { } [SysEntryPointAttribute(false)] public void processReport() { ClassDataContract contract = this.parmDataContract() as ClassDataContract; } |
|
|
За это сообщение автора поблагодарили: Logger (1). |
Теги |
ssrs, ssrs reports |
|
|