Показать сообщение отдельно
Старый 09.02.2017, 10:54   #4  
AnGor is offline
AnGor
Участник
Аватар для AnGor
 
97 / 46 (2) +++
Регистрация: 30.08.2007
Адрес: Ulm
Записей в блоге: 6
Цитата:
я по этой книжке и пробую.
стр. 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));
}
4. Contract:
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;
}
как связывается UIBuilder с Contract видно:
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).