| 
			
			 | 
		#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 | 
| 
	
	 | 
	
		
  |