|
|
#1 |
|
Участник
|
AX2012, SSRS отчеты
Пытаюсь разобраться, как работать с SSRS отчетами в AX2012.
Есть SSRS-отчет, класс Controller, который его запускает, Contract с параметрами для отчета (с атрибутоми SSRS-отчета и UI Contract ) и UI Contract с диалогом для параметров. Я создал SSRS-отчет, задеплоил его, создал Contract, UI Contract, Controller, но при запуске не подтягивается диалог из UI Contract. Как Контроллер связан с Контрактом? |
|
|
|
|
#2 |
|
Участник
|
Может быть все-таки UIBuilder?
Надо создать класс-расширение SysOperationAutomaticUIBuilder А в определении контракта в аттрибутах указать SysOperationContractProcessingAttribute(classStr(YourClassNameUIBuilder) А в определении контроллера указать в аттибутах SRSReportParameterAttribute(classstr(YourClassNameContract) Для простого добавления параметров UIBuilder не нужен, достаточно контракта |
|
|
|
| За это сообщение автора поблагодарили: Logger (5). | |
|
|
#3 |
|
Участник
|
__________________
// no comments |
|
|
|
| За это сообщение автора поблагодарили: Logger (5), Ace of Database (2). | |
|
|
#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). | |
|
|
#5 |
|
Участник
|
не забывай регулярно обновлять кеш и компилить CIL перед очередной пробой. также недурно влияет перезапуск и самого сервера ssrs.
вощим, встал ты на скользкую дорогу, полную невзгод и разочарований... но мы здесь, с тобой!
__________________
Felix nihil admirari |
|
|
|
|
#6 |
|
Участник
|
в классе провайдера есть такой атрибут
X++: [
SRSReportParameterAttribute(classStr())
] |
|
|
|
|
#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 |
|
|
|